Сборка 8086 - как сложить 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

person rares.urdea    schedule 16.02.2013    source источник


Ответы (1)


Скажем, вам нужно добавить два байта, каждый из которых имеет значение от 0 до 255 включительно.

Вам нужно добавить эти байты и сохранить значение флага переноса после добавления, которое будет 9-м битом суммы.

Вот как вы можете это сделать:

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

Обратите внимание: я использую mov ah, 0 вместо cbw при расширении 8-битного значения до 16 бит. cbw работает, если ваш байт должен представлять отрицательные значения, а также положительные, IOW, если он находится в диапазоне от -128 до 127 вместо 0 до 255. И вы говорите, что у вас есть 150 (0x96) и 215 (0xD7). ), поэтому они должны использоваться как беззнаковые или неотрицательные значения. Если вы все равно примените к ним cbw, вы получите: -106 (0xFF96) и -41 (0xFFD7). И вряд ли это ваши первоначальные цифры, верно?

person Alexey Frunze    schedule 16.02.2013
comment
да, теперь все кажется логичным. Спасибо за лаконичный ответ! - person rares.urdea; 16.02.2013