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 $0x7fff,%bx 19: 66 81 e1 ff 7f and $0x7fff,%cx 1e: 66 81 e2 ff 7f and $0x7fff,%dx 23: 81 e3 ff ff ff 7f and $0x7fffffff,%ebx 29: 81 e1 ff ff ff 7f and $0x7fffffff,%ecx 2f: 81 e2 ff ff ff 7f and $0x7fffffff,%edx
AND命令でも、al/ax/eaxレジスタには個別のオペコードが割り当てられています。
他のレジスタについては、どーもModR/Mフィールドを使用しているようなので、それぞれのModR/Mフィールドを分解してみると、
命令 | オペコード | ModR/M(Mod Reg/OpeCode R/M) |
---|---|---|
AND %bl imm8 | 80 | E3(11 100 011) |
AND %cl imm8 | 80 | E1(11 100 001) |
AND %dl imm8 | 80 | E2(11 100 010) |
AND %bx imm16 | 66 81 | E3(11 100 011) |
AND %cx imm16 | 66 81 | E1(11 100 001) |
AND %dx imm16 | 66 81 | E2(11 100 010) |
AND %ebx imm32 | 81 | E3(11 100 011) |
AND %ecx imm32 | 81 | E1(11 100 001) |
AND %edx imm32 | 81 | E2(11 100 010) |
となっており、Modビットが「11(レジスタ指定)」固定になっています。また、R/Mビットに、それえぞれのレジスタ番号が指定されています。
// ModR/Mフィールド 7 6 5 4 3 2 1 0 +-----------------------------+ | Mod | Reg/ | R/M | | | OpeCode | | +-----------------------------+
AND命令のフォーマットをまとめると、AL/AX/EAXレジスタについては、
命令 | オペコード | 説明 |
---|---|---|
AND AL imm8 | 24 imm8 | ALレジスタとimm8とのANDをとる。 |
AND AX imm16 | 66 25 imm16 | AXレジスタとimm16とのANDをとる。 |
AND EAX imm32 | 25 imm32 | AXレジスタとimm32とのANDをとる。 |
その他のレジスタについては、
命令 | オペコード | 説明 |
---|---|---|
AND r/m8 imm8 | 80 E1+rb | r/m8とimm8とのANDをとる。 |
AND r/m16 imm16 | 66 81 E1+rw | r/m16とimm16とのANDをとる。 |
AND r/m32 imm32 | 81 E1+rd | r/m32とimm32とのANDをとる。 |