[FASM] Напишите программу для вычисления формулы "Сложение и вычитание с переносом" - Assembler

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

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

где a,b,c – целые трехбайтные числа без знака. k=a+b-(1-c) пример: требуется вычислить значение формулы k=i+j-n+1, где переменные k, i, j и n являются 32-битными целыми числами без знака. Складывать и вычитать такие числа придётся в два этапа: сначала вычисления будут производиться с младшими словами операндов, а затем со старшими с учётом переноса. Для прибавления единицы в данном примере нельзя использовать команду INC, так как она не влияет на флаг CF и мы можем получить ошибку в результате!
use16                 ;Генерировать 16-битный код
org 100h              ;Программа начинается с адреса 100h
 
    mov ax,word[i]    ;Загружаем младшую часть i в AX
    mov bx,word[i+2]  ;Загружаем старшую часть i в BX
 
    add ax,word[j]    ;Складываем младшие части i и j
    adc bx,word[j+2]  ;Складываем старшие части i и j
 
    sub ax,word[n]
    sbb bx,word[n+2]  ;BX:AX = i+j-n
 
    add ax,1          ;Команда INC здесь не подходит!
    adc bx,0          ;BX:AX = i+j-n+1
 
    mov word[k],ax    ;\
    mov word[k+2],bx  ;/ Сохраняем результат в k
 
    mov ax,4C00h      ;\
    int 21h           ;/ Завершение программы
;-------------------------------------------------------
i dd 120000
j dd  80500
n dd   2300
k dd      ?

Решение задачи: «[FASM] Напишите программу для вычисления формулы "Сложение и вычитание с переносом"»

textual
Листинг программы
use16                 ;Генерировать 16-битный код
org 100h              ;Программа начинается с адреса 100h
 
    mov ax,word[a]    ;Загружаем младшую часть a в AX
    mov bx,word[a+2]  ;Загружаем старшую часть a в BX
 
    add ax,word[b]    ;Складываем младшие части a и b
    adc bx,word[b+2]  ;Складываем старшие части a и b
 
    mov cx,1
    mov dx,0
    sub cx,word[c]
    sbb dx,word[c+2]  ;DX:CX = 1-c
 
    sub ax,cx
    sbb bx,dx
 
    mov word[k],ax    ;\
    mov word[k+2],bx  ;/ Сохраняем результат в k
 
    mov ax,4C00h      ;\
    int 21h           ;/ Завершение программы
;-------------------------------------------------------
a dd 120000
b dd  80500
c dd   2300
k dd      ?

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

В коде представлено вычисление формулы Сложение и вычитание с переносом с помощью языка ассемблера. Вот список действий, которые происходят в коде:

  1. Загрузка младшей части переменной a в AX и старшей части в BX.
  2. Сложение младших частей переменных a и b и добавление результата к старшим частям.
  3. Загрузка переменной c в CX и DX.
  4. Вычитание значения переменной c из CX и DX.
  5. Вычитание AX из CX и BX из DX.
  6. Сохранение результата в переменной k.
  7. Завершение программы. Переменные a, b и c содержат следующие значения: a = 120000 b = -80500 c = -2300 Переменная k не инициализирована, поэтому ее значение неизвестно.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

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