汇编语言中的签名和未签名约定

时间:2013-10-25 18:11:07

标签: assembly x86 unsigned signed

我被要求用汇编语言编写一个程序,从下一个公式开始:(yy + h + m) - (d + d),其中变量用字节表示,只有h的值大于128。

必须有两个程序,一个使用无符号约定,另一个使用签名约定,我不知道这意味着什么,因为没有乘法和除法使用imul或idiv ......

我应该使用cbw命令,如果是,请问如何使用?

1 个答案:

答案 0 :(得分:0)

为了进行此计算,您需要将所有字节值转换为word,然后进行计算。那是因为结果将大于字节。

因此,对于有符号和无符号数字,将字节值扩展为字(两个字节)是不同的,因为高阶字节的内容取决于约定。

如果字节值是无符号的,则字值的高位字节必须设置为0.例如$ 8c转换为两个字节:$ 8c $ 00($ 008c)

如果字节值是sighed,则高位字节必须用字节值的符号位的值填充。同样的例子:$ 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