【发布时间】:2013-10-25 18:11:07
【问题描述】:
我被要求用汇编语言编写程序,从下一个公式开始:(yy+h+m)-(d+d),其中变量以字节表示,只有 h 的值大于 128。
必须有两个程序,一个使用无符号约定,另一个使用有符号约定,我不知道这是什么意思,因为没有乘法和除法可以使用 imul 或 idiv...
我应该使用 cbw 命令吗?如果可以,如何使用?
【问题讨论】:
标签: assembly x86 unsigned signed
我被要求用汇编语言编写程序,从下一个公式开始:(yy+h+m)-(d+d),其中变量以字节表示,只有 h 的值大于 128。
必须有两个程序,一个使用无符号约定,另一个使用有符号约定,我不知道这是什么意思,因为没有乘法和除法可以使用 imul 或 idiv...
我应该使用 cbw 命令吗?如果可以,如何使用?
【问题讨论】:
标签: assembly x86 unsigned signed
为了进行此计算,您需要将所有字节值转换为字,然后进行计算。那是因为结果会比字节大。
因此,将字节值扩展到字(两个字节)对于有符号和无符号数字是不同的,因为高位字节的内容取决于约定。
如果字节值是无符号的,则字值的高位字节必须设置为 0。例如 $8c 转换为两个字节:$8c $00 ($008c)
如果字节值被叹息,那么高位字节必须用字节值的符号位的值填充。同样的例子:$8c 必须扩展到 $8f $ff。指令cbw 进行有符号转换。
作为代码,它将如下所示:
; unsigned
mov al, byte [SomeByteVariable]
mov ah, 0
add ax, 1234 ; here we have unsigned word value.
; signed
mov al, byte [SomeByteVariable]
cbw
add ax, 1234 ; here we have signed word value
【讨论】:
cbw,不是吗? cwd 将在 dx:ax 中将 word 符号扩展为 dword。