Assembly ADD AX、DATA8与8086汇编语言中的ADD AL、DATA8相同吗?

Assembly ADD AX、DATA8与8086汇编语言中的ADD AL、DATA8相同吗?,assembly,x86,Assembly,X86,我的问题是: AX=16位累加器寄存器 AL=AX寄存器的8个低位。 数据8=最长为8位的立即数。在以10为基数的情况下,如果此数字不重要,则可以在0-255之间。我们假设这个数字是无符号的 DATA16=一个十六进制数,由16位组成 那么,回到问题上来: 在8086讲师集中,添加AX,DATA16需要4个时钟周期,其目标代码为05 YYYY 在05 YYYY中,05是1个字节,YY也是1个字节,所以整个目标代码的大小是3个字节。ADD AL,DATA8像ADD AX一样采用4个时钟周期,DAT

我的问题是:

AX=16位累加器寄存器

AL=AX寄存器的8个低位。 数据8=最长为8位的立即数。在以10为基数的情况下,如果此数字不重要,则可以在0-255之间。我们假设这个数字是无符号的

DATA16=一个十六进制数,由16位组成

那么,回到问题上来:

在8086讲师集中,添加AX,DATA16需要4个时钟周期,其目标代码为05 YYYY

在05 YYYY中,05是1个字节,YY也是1个字节,所以整个目标代码的大小是3个字节。ADD AL,DATA8像ADD AX一样采用4个时钟周期,DATA16但是ADD AX,DATA8的目标代码是04 YY

如果我写ADD AX,10H,我的源操作数2是十六进制10,所以它是8位。AX由AH和AL组成。AH是AX的最高有效位的8位,AL是8位的对立面。但是在我们的代码addax,10H中,我们添加了带有8位数字的AX并更新了AX。根据AX由AH和AL组成,实际上,我们在这段代码中用AL和10H求和,那么我们的代码大小是2字节,关于04 YY还是符合8086指令集,我们是否严格遵守规则,不这样想,我们接受AX,DATA8,我们的第一个操作数是AX,但第二个操作数是DATA8,指令集没有这样的助记符,所以我们认为它一定是AL,DATA8

请原谅,我把这个问题拖得太长了。

在ADD AX、imm指令、操作码05h中,立即数总是被编码为两个字节16位,即使它恰好小于255位。您的addax,10h编码为05100003个字节

这是唯一可行的方法。CPU只看到字节;它无法知道10是否表示一个单字节立即数,下一个字节是否是下一条指令的一部分,或者10是否是两字节操作数的低位字节。换言之,如何知道05 10 90是否为加AX,10h;否或添加AX,9010h?解决此问题的唯一方法是声明操作码05始终采用两个字节的立即数,如果所需的值适合一个字节,则最有效的字节仅指定为零

注意,还有另一种形式的ADD,即操作码83h,它接受一个字节的8位立即数,并将其扩展到16位。由于您的立即10小时不适合有符号的8位数字,因此可以使用此表单。然而,由于它的目标是一个通用的r/m操作数,它需要一个额外的字节来指定寄存器,并将编码为83 c0 10,仍然是三个字节。注意,如果您想添加无符号8位数量a0h,这将不起作用,因为它将被符号扩展为ffa0h


正如你所说,ADD AL,10h被编码为两个字节04 10,但正如Jester所指出的,它与ADD AX,10h不同,因为你可以从低字节到高字节进位。如果AX包含00f3h,则添加AX,10h将导致AX=0103h和进位标志清除,而添加AL,10h将导致AX=0003h和进位标志设置。

否,这不一样,因为您可能从AL进位到AH。如果您的汇编器为add ax、imm生成操作码04,那么它就坏了。我知道,但我会根据指令集询问它们的大小。安装集没有AX,因为AX是2字节。但是这个AX,10h代码的大小是多少?2字节还是3字节?要编码add ax,2,您需要使用add r/m16,imm8编码和ModRM字节编码ax目标。或者如果需要,添加ax、imm8;对于AX,它们的大小相同:总共3个字节。对于32位模式下的EAX,添加r/m32,imm8仍然是3字节,添加EAX,imm32是5字节。