Вычисление целочисленных арифметических выражений - Assembler

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

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

Ребята, помогите пожалуйста. бьюсь уже над задачей пару дней...ничего не выходит...даже не компилирует мой код Вычислить значение выражения (2*b-a+b*c)/(c/4-1) На основании данного примера нужно: (25/c - d + 2)/(d + a*a-1)
masm
.model small
.data
    db  "Hello"
a1  db  2   ;Переменная a
c1  db  2   ;Переменная c
d1  db  2   ;Переменная d
x1  dw  ?
Denominator dw  ?   ;Знаменатель
Numerator   dw  ?   ;Числитель
    .code
start:
    mov ax,@data
    mov ds,ax
 
;знаменатель - Denominator ------------------------------------------------
    mov al,a1
    Imul    al  ; <ax>=a*a
    dec ax  ; <ax>=a*a-1
    ; подготовка к расширению d (BYTE===>WORD)
    push    ax  ; Запоминание <ax>=a*a-1 в стеке
    mov al,d1
    CBW     ; al ===> AX
    mov SI,ax   ; <SI>=<ax>=d - нужно для ЧИСЛИТЕЛЯ!!!
    pop bx  ;Восстановление содержимого стека ===> <bx>=a*a-1
    add bx,ax   ; <bx>=a*a-1+d
    mov Denominator,bx
;числитель - Numerator ----------------------------------------------------
    mov ax, 25
    IDIV    c1  ; <aL>=25/c
    CBW     ; al ===> AX
    sub ax,SI   ; <ax>=25/c-d
    add ax,2    ; <ax>=25/c-d+2
    CWD     ; aX ===> DX:AX
    mov WORD PTR Numerator, AX      ; мл. часть числителя 
    mov WORD PTR Numerator+2, DX    ; ст. часть числителя
;РЕЗУЛЬТАТ
    IDIV    bx  ; <ax>=(25/c-d+2)/(a*a-1+d)
    mov x1,ax
 
;ВЫХОДИМ
    mov ah,4Ch
    mov al,00h
    int 21h
 
end start
буду вам очень признателен

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

textual
Листинг программы
.model small
.386
.stack  100h
.data
    db  "Hello"
a1  db  2   ;Переменная a
c1  db  2   ;Переменная c
d1  db  2   ;Переменная d
x1  dw  ?
;Denominator dw  ?   ;Знаменатель
;Numerator   dw  ?   ;Числитель
.code
start:
        mov     ax,@data
    mov     ds,ax
    movsx   cx, [c1]
    movsx   ax, [d1]
    movsx   bx, [a1]
; divisor
    mov si, cx
    sar si, 1   ; c/2
    sar si, 1   ; c/4
    dec si  ; (c/4-1) 
; dividiend
    imul    cx, ax  ; cx = b*c
    sal ax, 1   ; 2*b
    sub ax, bx  ; 2*b-a
    add ax, cx  ; ax = 2*b-a+b*c
    xor dx, dx
    idiv    si
    mov [x1], ax
;ВЫХОДИМ
    mov ah,4Ch
    mov al,00h
    int 21h
 
end start

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

  1. Установка начального адреса данных в регистре DS
  2. Загрузка значения переменной c в регистр CX
  3. Загрузка значения переменной d в регистр AX
  4. Загрузка значения переменной a в регистр BX
  5. Вычисление знаменателя (c/2) и сохранение результата в регистре SI
  6. Вычисление знаменателя (c/4) и сохранение результата в регистре SI
  7. Уменьшение значения в регистре SI на 1 (получаем (c/4)-1)
  8. Вычисление числителя (b*c) и сохранение результата в регистре CX
  9. Увеличение значения в регистре AX на 1 (получаем 2*b)
  10. Вычитание значения в регистре BX из значения в регистре AX (получаем 2*b-a)
  11. Добавление значения в регистре CX к значению в регистре AX (получаем ax = 2b-a+bc)
  12. Очистка регистра DX
  13. Деление значения в регистре AX на значение в регистре SI
  14. Сохранение результата деления в регистре AX
  15. Запись результата в переменную x
  16. Выход из программы

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


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

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

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