0

我需要的

我被要求编写的程序的一部分是附加的。问题是我们被要求定义字节并将它们转换为单词(有符号扩展名),然后才添加它们。

问题

添加有时不会提供所需的输出。例如,我正在使用以下内容:

data segment
    first     DB    183
    second    DB    94
data ends

code segment
start:

    mov ax,data
    mov ds,ax

    mov AX, 0
    mov AL, first
    cbw

    mov BX, AX
    mov AX, 0

    mov AL, second
    cbw

    add AX, BX

    mov ax, 4c00h
    int 21h

code ends
end start

94(十六进制的 5E)+ 183(十六进制的 B7)= 277(十六进制的 115),但由于第一个cbwAX = FFB7而不是B7。但是,第二个数字仍如预期的那样AX = 5E ,因此将两个结果相加为AX = 15CF = 1

我找到了这个关于 CBW 的页面,其中指出“如果设置了 AL 的符号位(第 7 位),此指令会将 AH 设置为 0FFh”,这是我的情况,因为B7是二进制的1011 0111

我错过了什么吗?我应该以某种方式解释进位标志吗?为什么我没有获得115 (hex)

提前致谢。

4

2 回答 2

2

94(十六进制的 5E)+ 183(十六进制的 B7)= 277(十六进制的 115),但由于第一个 cbw,AX = FFB7 而不是 B7。但是,第二个数字仍然如预期的那样 AX = 5E,因此将两个结果相加到 AX = 15 和 CF = 1。...为什么我没有获得 115(十六进制)

结果取决于是否应将值视为有符号或无符号。

对于有符号,您应该用低字节的最高有效位填充高字节。这可以通过MOVSX指令(例如MOVSX AX,AL)或CBWCBW仅当操作数在 中时才有效AL)来完成。

字节0xB7符号扩展为一个字等于-73( 0xFFB7)。所以预期的结果是94 - 73 = 21 (0x15)


对于无符号,您应该清除高字节。这可以通过MOVZX指令(例如MOVZX AX,AL)或通过将高字节与自身进行异或(例如XOR AH,AH)来完成。

0xB7零扩展为一个字的字节等于183( 0x00B7)。所以预期的结果是94 + 183 = 277 (0x115)

于 2013-10-27T12:49:23.423 回答
0

cbw您可以使用零扩展 move代替movzx AX, AL

AL使用movzx指令时不需要将字节存储在寄存器中。最佳代码可以是:

mov AL, first
movzx AX, AL

mov BL, second
movzx BX, BL

add AX, BX

编辑感谢 Jester 提出的通过利用在以下位置使用内存变量的可能性来进一步优化代码的建议movzx

movzx AX,byte ptr [first]
movzx BX,byte ptr [second]
add AX, BX
于 2013-10-26T19:11:31.740 回答