2013-06-01から1ヶ月間の記事一覧

sizeof演算子

以下について、sizeofでサイズを調べてみます。 文字列リテラル 初期値を持つchar型配列 初期値を持つint型配列 char型配列を指すポインタ変数 文字リテラル 空文字列 1 #include <stdio.h> 2 3 int main() 4 { 5 char data[] = "ABCDE"; 6 int data2[] = {1,2,3,4,5}</stdio.h>…

gcc4.7.3におけるvoid型の実装

void型について実験。gccのバージョンは、以下です。 gcc バージョン 4.7.3 (Ubuntu/Linaro 4.7.3-1ubuntu1) われわれはvoidを当たり前のように使っているけど、そもそもvoidとは何だろ?実装レベルで、どのようにコンパイラに解釈されているのか、また逆ア…

SIBのフォーマットと符号化

今回は、SIBとディスプレースメントを持つニーモニックについて見ていきます。まず、命令フォーマットにおけるSIBとディスプレースメントの位置ですが、それぞれ以下の位置に配置されます。 // 一般的命令フォーマット +-------+-------------------+-------…

アドレッシングモード別のModR/MとSIBの値

アドレッシングモードと、ModR/M・SIBの相関性がいまいち分からないので、アドレッシングモードのバリエーションを変えてみて実験してみる。 0: b8 78 56 34 12 mov eax,0x12345678 5: 89 04 24 mov DWORD PTR [esp],eax 8: 89 f0 mov eax,esi a: a1 ff ff f…

NOT命令(not r)

レジスタに対するNOT命令です。 0: f6 d0 not %al 2: f6 d3 not %bl 4: f6 d1 not %cl 6: f6 d2 not %dl 8: 66 f7 d0 not %ax b: 66 f7 d3 not %bx e: 66 f7 d1 not %cx 11: 66 f7 d2 not %dx 14: f7 d0 not %eax 16: f7 d3 not %ebx 18: f7 d1 not %ecx 1a:…

XOR命令(r xor imm)

レジスタに対する即値とのXOR命令です。 0: 34 7f xor $0x7f,%al 2: 66 35 ff 7f xor $0x7fff,%ax 6: 35 ff ff ff 7f xor $0x7fffffff,%eax b: 80 f3 7f xor $0x7f,%bl e: 80 f1 7f xor $0x7f,%cl 11: 80 f2 7f xor $0x7f,%dl 14: 66 81 f3 ff 7f xor $0x7ff…

OR命令(r or imm)

レジスタに対する即値とのOR命令です。 0: 0c 7f or $0x7f,%al 2: 66 0d ff 7f or $0x7fff,%ax 6: 0d ff ff ff 7f or $0x7fffffff,%eax b: 80 cb 7f or $0x7f,%bl e: 80 c9 7f or $0x7f,%cl 11: 80 ca 7f or $0x7f,%dl 14: 66 81 cb ff 7f or $0x7fff,%bx 19…

AND命令(r and imm)

レジスタに対する即値指定とのAND命令です。 0: 24 7f and $0x7f,%al 2: 66 25 ff 7f and $0x7fff,%ax 6: 25 ff ff ff 7f and $0x7fffffff,%eax b: 80 e3 7f and $0x7f,%bl e: 80 e1 7f and $0x7f,%cl 11: 80 e2 7f and $0x7f,%dl 14: 66 81 e3 ff 7f and $0…

SUB命令(r-imm→r)

レジスタに対するSUB命令です。 0: 2c 7f sub $0x7f,%al 2: 80 eb 7f sub $0x7f,%bl 5: 80 e9 7f sub $0x7f,%cl 8: 80 ea 7f sub $0x7f,%dl b: 66 2d ff 7f sub $0x7fff,%ax f: 66 81 eb ff 7f sub $0x7fff,%bx 14: 66 81 e9 ff 7f sub $0x7fff,%cx 19: 66 8…

DEC命令(r)

レジスタに対するDEC命令です。 0: fe c8 dec %al 2: fe cb dec %bl 4: fe c9 dec %cl 6: fe ca dec %dl 8: 66 48 dec %ax a: 66 4b dec %bx c: 66 49 dec %cx e: 66 4a dec %dx 10: 48 dec %eax 11: 4b dec %ebx 12: 49 dec %ecx 13: 4a dec %edxおお、DEC…

INC命令(r)

レジスタに対するINC命令です。 0: fe c0 inc %al 2: fe c3 inc %bl 4: fe c1 inc %cl 6: fe c2 inc %dl 8: 66 40 inc %ax a: 66 43 inc %bx c: 66 41 inc %cx e: 66 42 inc %dx 10: 40 inc %eax 11: 43 inc %ebx 12: 41 inc %ecx 13: 42 inc %edxワードレジ…

ADD命令(imm+r→r)

ADD命令の即値→レジスタ間転送の逆アセンブル結果です。 0: 04 7f add $0x7f,%al 2: 80 c3 7f add $0x7f,%bl 5: 80 c1 7f add $0x7f,%cl 8: 80 c2 7f add $0x7f,%dl b: 66 05 ff 7f add $0x7fff,%ax f: 66 81 c3 ff 7f add $0x7fff,%bx 14: 66 81 c1 ff 7f a…

MOV命令(imm→r)

MOV命令(即値→レジスタの転送)の、アセンブリコードとニーモニックの対応です。 ニーモニック アセンブリ b0 7f mov $0x7f,%al b3 7f mov $0x7f,%bl b1 7f mov $0x7f,%cl b2 7f mov $0x7f,%dl b8 ff ff ff 7f mov $0x7fffffff,%eax bb ff ff ff 7f mov $0x…

機械語の解読

8086の機械語を読んでみます。私にも、「アセンブリ命令と16進のオペコードは、1対1で対応している。アセンブリコード→機械語の翻訳って、手間だけの問題じゃん!」と思っていた時期がありました。でも、逆アセンブルの結果を見ると、同じmov命令なのに、ど…