【问题标题】:Signed and unsigned convention in assembly language汇编语言中的有符号和无符号约定
【发布时间】:2013-10-25 18:11:07
【问题描述】:

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

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

我应该使用 cbw 命令吗?如果可以,如何使用?

【问题讨论】:

    标签: assembly x86 unsigned signed


    【解决方案1】:

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

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

    如果字节值是无符号的,则字值的高位字节必须设置为 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。
    • @FrankKotler - 是的,当然,我的手指会自动输入。还有,EAX。为什么,这些学校还教 16 位编程? 2013 年!
    • 谢谢。这帮助很大。
    猜你喜欢
    • 2012-01-19
    • 1970-01-01
    • 2016-05-07
    • 1970-01-01
    • 2015-02-24
    • 2012-10-19
    • 1970-01-01
    • 1970-01-01
    • 2017-08-05
    相关资源
    最近更新 更多