2

好的,所以问题很简单。如果我有 2 个随机字节,比如 150 (a[0]) 和 215(b[0]),我想添加它们。显然它们的总和不适合一个字节,所以如果我添加它们,我会溢出。我已经尝试将其中一个字节存储在 al 中并执行 cbw,以便我将仅在单词 ax 上表示相同的数量,并将第二个字节添加到其中,但有些东西我无法理解,因为它不起作用。这是一个示例代码:

data segment
  a db 150,182,211
  b db 215,214,236
data ends

code segment
start:
  mov ax,data
  mov ds,ax

  lea si,a          ; these 2 shouldn't be here since i realised eventually that
                    ; i could use
  lea di,b          ; a constant for memory addressing and not necessarily a
                    ; a register
  mov ax,0000
  mov bl,a[0]
  mov al,b[0]
  cbw
  adc bx,ax      ; so this didn't work out well

  mov ax,0000
  mov al,a[0] 
  cbw            ; convert one of the bytes into a word
  mov cx,ax      ; and save it in cx
  mov al,b[0]    
  cbw            ; also convert the other byte into the word ax
  add ax,cx      ; add the two words
                 ; and that also failed
4

1 回答 1

7

比如说,您需要添加两个字节,每个字节的值都在 0 到 255 之间。

您需要添加这些字节并在添加后保存进位标志的值,这将是和的第 9 位。

你可以这样做:

mov al, byte1
mov ah, 0 ; ax = byte1
add al, byte2
adc ah, 0 ; ax = byte1 + byte2

请注意,我在将 8 位值扩展到 16 位时使用mov ah, 0而不是。如果你的字节应该代表负值和正值,IOW,如果它在 -128 到 127 而不是 0 到 255 的范围内,则有效。你说你有 150 (0x96) 和 215 (0xD7) ,因此它们必须用作无符号或非负值。如果你还是申请它们,你会得到:-106 (0xFF96) 和 -41 (0xFFD7)。这几乎不是你原来的数字,对吧?cbwcbwcbw

于 2013-02-16T19:07:17.960 回答