Assembly 专门用于AL寄存器的编码?

Assembly 专门用于AL寄存器的编码?,assembly,x86,machine-code,Assembly,X86,Machine Code,与其他寄存器不同,我注意到执行类似于add$1的操作,%al对指令的编码与其他(8位)寄存器大不相同。例如: add $3, %al add $3, %bl add $3, %cl add $3, %dl 翻译为: 0x0000000000401000 04 03 ? add $0x3,%al 0x0000000000401002 80 c3 03 ? add $0x3,%bl 0x0000000000401005 80 c1 03 ? add $0x3,%

与其他寄存器不同,我注意到执行类似于
add$1的操作,%al
对指令的编码与其他(8位)寄存器大不相同。例如:

add $3, %al
add $3, %bl
add $3, %cl
add $3, %dl
翻译为:

0x0000000000401000  04 03     ? add    $0x3,%al
0x0000000000401002  80 c3 03  ? add    $0x3,%bl
0x0000000000401005  80 c1 03  ? add    $0x3,%cl
0x0000000000401008  80 c2 03  ? add    $0x3,%dl
我在我的代码中使用了add-imm8的编码,但是
add$3,%al
似乎与此完全矛盾(没有mod reg rm byte?)。这是一个遗留指令还是什么,或者为什么它看起来与其他指令有如此大的不同?

提到了大多数ALU指令中存在的AL、imm8短格式编码,以及各种其他短格式编码。是的,这些可以追溯到8086,就像modrm编码一样,所以这些都是x86的8086遗产的一部分。另请参见-我对这个问题的回答中有一节是关于8086历史/设计决策的。8086明确赞成使用AL/AX作为“累加器”,因此得名,为其提供了特殊的缩写形式。提到了大多数ALU指令中存在的AL、imm8短格式编码,以及各种其他短格式编码。是的,这些可以追溯到8086,就像modrm编码一样,所以这些都是x86的8086遗产的一部分。另请参见-我对这个问题的回答中有一节是关于8086历史/设计决策的。8086明确赞成使用AL/AX作为“累加器”,因此得名,为其提供了特殊的缩写形式。