Решение математического примера - Assembler

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

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

Нужно решить пример, и что бы он в регистрах показал ответ, без вывода на екран, именно в регистр. Сделал свои наброски, но не могу никак закончить код, все работает, кроме последнего дроба и также сумы, но это уже после деление последнего дроба. Код писался в EMU8086 (здесь и нужно вывести). Заранее спасибо.
use16
org 100h
 
mov al,[a]   ; a = 5
mul al       ; a^2 =19
mov bl,[x]   ; x = 3
mul bl       ; a^2*x=4B
mov cl,3     ; 
mul cl       ; 3*a^2*x = E1
mov cl,al    ; cl=al
mov bl,[b]   ; b = 4
sub cl,bl    ; E1-4 =  DD

mov al,[a]   ; a
mov bl,[x]   ; x
 
;mov cl,cl
add al,bl
div al       ; 1
mov cl,al

mov al,[x]   ; 3
mul al       ; 9
dec al       ; 8
mov dl,3
mul dl 
 
sub cl,dl
 
mov al,[a]
mov bl,[b]
mul bl
mul bl 
 
mov dl,al

mov al,[x]
mul al
mov ah,al
 
div dl

add bh,al
 
mov [y],ax
 
;----- End of the program-----
mov ax, 4C00H
int 21h
;----- initialize variable
a db 5
x db 3
b db 4 
y dw ?

ret

Решение задачи: «Решение математического примера»

textual
Листинг программы
.model small
 
.data
a db 5
x db 3
b db 4
y db ?
 
.stack 100h
 
.code
start:
mov ax,@data
mov ds,ax
 
mov al,[a]   ;al=a=5
mul al       ;ax=a^2=19
mov bl,[x]   ;bl=x=3
mul bl       ;ax=a^2*x=4B
mov cl,3     ;cl=3 
mul cl       ;ax=3*a^2*x=E1
mov cl,al    ;cl=al=3*a^2*x=E1
mov bl,[b]   ;bl=b=4
sub cl,bl    ;cl=3*a^2*x-b=E1-4=DD
 
 
mov al,[a]   ;al=a
mov bl,[x]   ;bl=x
 
add al,bl    ;al=a+x=8
 
xchg al,cl   ;al=3*a^2*x-b=E1-4=DD
             ;cl=a+x=5+3=8
 
xor ah,ah    ;ax=al
idiv cl      ;ax/cl=(3*a^2*x-b)/(a+x)=1B
 
mov cl,al    ;cl=(3*a^2*x-b)/(a+x)=1B
 
mov al,[x]   ;al=x=3
mul al       ;ax=x^2=9
dec al       ;al=x^2-1=8
 
mov dl,3     ;dl=3
mul dl       ;al=3*(x^2-1)=18
 
sub cl,al    ;cl=((3*a^2*x-b)/(a+x))-3*(x^2-1)=3
 
mov al,[a]   ;al=a=5
mov bl,[b]   ;bl=b=4
 
mul bl       ;ax=a*b=14
 
shl ax,2     ;ax=4*a*b=50
 
xchg ax,bx   ;bx=4*a*b=50
  
mov al,[x]   ;al=x=3
mul al       ;ax=x*x=9
 
xchg ax,bx   ;ax=4*a*b=50
             ;bx=x*x=9
 
div bl       ;al=(4*a*b)/(x*x)=50/9=8
 
add al,cl    ;al=((3*a^2*x-b)/(a+x))-3*(x^2-1)+(4*a*b)/(x*x)=3+8=0B
 
mov [y],al   ;y=al=0B
 
mov ah,4Ch
mov al,00h
int 21h
end start

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

Список действий:

  1. Задаются начальные значения переменных a, x, b, y.
  2. Переменная a^2 (19) умножается на переменную x (3), результат (4B) сохраняется в переменной ax.
  3. Переменная a^2*x-b (E1-4=DD) сохраняется в переменной cl.
  4. Переменная a (5) и x (3) складываются, результат (8) сохраняется в переменной al.
  5. Значение al (8) меняется на значение cl (DD), а значение cl (8) меняется на значение al (DD).
  6. Переменная b (4) вычитается из значения cl (DD), результат (DD-4=DB) сохраняется в переменной cl.
  7. Переменная x (3) умножается на себя (9), результат (8) вычитается из значения cl (DB), результат (DB-8=D3) сохраняется в переменной cl.
  8. Переменные a (5) и b (4) умножаются, результат (14) сохраняется в переменной ax.
  9. Значение ax (14) умножается на 2, результат (28) сохраняется в переменной ax.
  10. Переменные ax (28) и bx (9) меняются местами, теперь bx (9).
  11. Переменная x (3) умножается на себя (9), результат (8) вычитается из значения bx (9), результат (9-8=1) сохраняется в переменной bl.
  12. Переменные a (5) и b (4) делятся, результат (8) добавляется к значению cl (D3), результат (D3+8=C0) сохраняется в переменной al.
  13. Значение al (C0) меняется на значение bl (1), а значение bl (1) меняется на значение al (C0).
  14. Значение y (0B) сохраняется в переменной y.
  15. Выполняется завершающий вывод на экран с помощью функции 4Ch.
  16. Программа завершается.

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

7   голосов , оценка 3.714 из 5