Вычитание целых беззнаковых чисел большой размерности - Assembler

Узнай цену своей работы

Формулировка задачи:

Здравствуйте. Подскажите принцип вычитания целых беззнаковых чисел, например, размерностью 5 байт.
.data
  a db 4Bh, 15E, 6Eh, 0A1h, 34h ; 5 байт 
  b db 0B4h, 23h, 6Ch, 0C2h, 6Dh ; 5 байт
  r db 6 dup(?) ;
 .code
 start:

Решение задачи: «Вычитание целых беззнаковых чисел большой размерности»

textual
Листинг программы
    lea si,a+4
    lea di,b+4
    
    mov al,[si]
    sub al,[di]
    mov r+5,al
    dec si
    dec di
    
    mov al,[si]
    sbb al,[di]
    mov r+4,al
    dec si
    dec di
    
    mov al,[si]
    sbb al,[di]
    mov r+3,al
    dec si
    dec di
    
    mov al,[si]
    sbb al,[di]
    mov r+2,al
    dec si
    dec di
    
    mov al,[si]
    sbb al,[di]
    mov r+1,al
    
    jnc exit
    
    mov r,0FFh

Объяснение кода листинга программы

Код выполняет вычитание двух беззнаковых целых чисел большой размерности. Каждое число находится в двух словах (4 байта), поэтому для выполнения операции требуется 8 байт (2 слова) памяти. В первой части кода выполняется загрузка чисел в регистры si и di. Затем, используя эти регистры как индексы, из памяти загружаются соответствующие байты чисел. После чего выполняется вычитание этих чисел, и результат сохраняется в регистре r. Затем индексы уменьшаются на единицу, и процесс повторяется до тех пор, пока не будут загружены все байты чисел. После выполнения всех операций, результат вычитания сохраняется в регистре r. Если после выполнения всех операций, регистр флагов не содержит бит знака (то есть он равен 0FFh), то значит, что результат вычитания был отрицательным, и его положительное значение было сохранено в регистре r. В противном случае, в регистре r сохраняется ноль.

Оцени полезность:

14   голосов , оценка 3.786 из 5
Похожие ответы