Ошибка в вычислениях - Assembler

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

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

Пишу в emu8086. Ассемблер не изучаю! Но надо сделать задание на нём Не могу ничего понять. Прога рассчитывает не правильно. В данном случае присвоены значения A = 7 а C = 2. Значит, расчёт будет идти по второй формуле @Y2. В комментариях я указал где что происходит (надеюсь, правильно указал). Прога выводит странное число: 64470. Думаю, что это из-за строчек вывода, после @Output:. Но там я не разбираюсь что куда.

Пожалуйста, не игнорьте!!!

В скринах что прога должна рассчитать и что она выводит.
; Standard header:
    #make_COM#
        ORG  100H  
 
A dw 7
C dw 2
D dw 5
X dw 4
B dw 3
 
Res_1 dw 0
Res_2 dw 0
Res_3 dw 0
 
mov ax,A;добавление в регистр ax значения А = 7
mov bx,C;добавление в регистр bx значения С = 2
cmp ax,bx; сравнение А и С. Вычитание А-С   
jl @Y2; сравнение A и C. Если А > C, то переходить на @Y2
 
;Здесь расчёт когда A < C / т.е. когда присвоены следующие значения
;A dw 2
;C dw 7
;D dw 5
;X dw 4
;B dw 3
 
;выражение А^2*X
mov ax,A;присвоение регистру ах значения А = 2
mul ax; умножение ax*ax / 2*2=4
mov bx,X;присвоение bx значение X = 4
mul ax; умножение ax на bx / A^2*X / 4*4=16
mov Res_1,ax; Сохранение результата 16 в Res_1
    
;выражение X^2*B
mov ax,X;присвоение регистру ах значения X = 4
mul ax; умножение ax * ax / 4*4=16
mov bx,B;присвоение bx значение B = 3
mul ax; умножение ax на bx / X^2*B / 16*3=48
mov Res_2,ax; Сохранение результата 48 в Res_2  
    
;выражение X^3*C
mov ax,X;присвоение регистру ах значения X = 4
mul ax;умножение ax*ax / 4*4=16
mul ax;умножение (ax*ax)*ax/ X^3 / 16*4=64
mov bx,C; присвоение bx значение C = 7
mul ax; умножение ax на bx / X^3*C / 64*7=448
mov Res_3,ax;Cохранение результата 448 в Res_3  
        
;Сложение А^2*X+X^2*B+X^3*C+D
mov ax,D; присвоение регистру ах значения D = 5
mov bx,Res_3; присвоение регистру bх значения Res_3 = 448
add ax,bx; Cложение ах и bx / X^3*C+D / 448+5=453
mov bx,Res_2;присвоение регистру bх значения Res_2 = 48
add ax,bx;Cложение ах и bx / X^2*B+X^3*C+D / 453+48=501
mov bx,Res_1;присвоение регистру bх значения Res_1 = 16
add ax,bx;Cложение ах и bx / А^2*X+X^2*B+X^3*C+D / 501+16=517
 
;Ответ: 517
 
jmp @Output; переход на @Output, где происходит вывод на экран 
 
@Y2:    
;Здесь расчёт когда A > C / т.е. когда присвоены следующие значения
;A dw 7
;C dw 2
;D dw 5
;X dw 4
;B dw 3
    ;выражение А^3*X
        mov ax,A;присвоение регистру ах значения А = 7
        mul ax;умножение ax*ax / 7*7=49
        mul ax; умножение (ax*ax)*ax/ A^3 / 49*7=343
        mov bx,X;присвоение bx значение X = 4
        mul ax; умножение ax на bx / А^3*X / 343*4=1372
        mov Res_1,ax; Сохранение результата 1372 в Res_1
    
    ;выражение B^2*X^2 
        mov ax,B;присвоение bx значение B = 3
        mul ax; умножение ax*ax / 3*3=9
        mov bx,X;присвоение регистру bх значения X = 4
        mul bx; умножение bx*bx / 4*4=16
        mul ax; умножение ax на bx / B^2*X^2  / 9*16=144
        mov Res_2,ax;Cохранение результата 144 в Res_2      
    
    ;выражение X^3*C
        mov ax,X;присвоение регистру ах значения X = 4
        mul ax;умножение ax*ax / 4*4=16
        mul ax;умножение (ax*ax)*ax/ X^3 / 16*4=64
        mov bx,C; присвоение bx значение C = 2
        mul ax; умножение ax на bx / X^3*C / 64*2=128
        mov Res_3,ax;Cохранение результата 448 в Res_3  
        
        ;Сложение А^3*X+X^2*B^2+X^3*C+D
        mov ax,D; присвоение регистру ах значения D = 5
        mov bx,Res_3;присвоение регистру bх значения Res_3 = 128
        add ax,bx; Cложение ах и bx / X^3*C+D / 128+5=133
        mov bx,Res_2;присвоение регистру bх значения Res_2 = 144
        add ax,bx;Cложение ах и bx / X^2*B^2+X^3*C+D / 133+144=277
        mov bx,Res_1;присвоение регистру bх значения Res_1 = 1372
        add ax,bx;Cложение ах и bx / А^3*X+X^2*B^2+X^3*C+D / 277+1372=1649
        
       ;Ответ: 1649 ; По идее, именно это число должна выводить прога
        
        ;Что за код ниже этой строчки я понятия не имею
    @Output:    
    push    -1   
    mov cx,10    
l1: mov dx,0     
    div cx   
    push    dx  
    cmp ax,0     
    jne l1   
    mov ah,2h
l2: pop dx   
    cmp dx,-1    
    je  @ex
    add dl,'0'    
    int 21h
    jmp l2    
@ex:    mov ax,4c00h 
    int 21h

Решение задачи: «Ошибка в вычислениях»

textual
Листинг программы
; FASM
    ORG 100H
    mov dx, [X]
    imul    dx, [X]
    mov si, dx      ; si = x^2
    imul    dx, [X]     ; dx = x^3
    mov di, dx      ; di = x^3
    imul    dx, [C]     ; dx = x^3*C
    add dx, [D]     ; dx = x^3*C+D
;
    mov ax, [A]         ;добавление в регистр ax значения А = 7
    mov bx, ax
    imul    bx, bx      ; bx = A^2
    mov cx, [B]
    cmp ax, [C]
    jl  AlessC
;Здесь расчёт когда A > C / т.е. когда присвоены следующие значени
;A dw 7
;C dw 2
;D dw 5
;X dw 4
;B dw 3
;A^3*X+B^2*X^2
    imul    bx, ax      ; bx = A^3
    imul    cx, cx      ; cx = B^2
AlessC:
;Здесь расчёт когда A < C / т.е. когда присвоены следующие значени
;A dw 2
;C dw 7
;D dw 5
;X dw 4
;B dw 3
;A^2*X+B*X^2
    imul    bx, [X]     ; bx = A^2*X или A^3*X
    imul    cx, si      ; cx = B*X^2 или B^2*X^2
    add bx, cx
    add bx, dx
;Что за код ниже этой строчки я понятия не имею
@Output:
    mov ax, bx
        mov     bx, 10
        xor cx,cx
@@out_dec:
        xor     dx, dx
        idiv    bx
        or  dx, 30h            ;остаток от деления
        push    dx
        inc     cx                ;считаем кол-во цифр
        or  ax, ax             ;пока не 0 - делим
        jnz     @@out_dec
@@3:    pop ax
        int 29h
        loop    @@3
    ret
A   dw 7
C   dw 2
D   dw 5
X   dw 4
B   dw 3

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


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

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

11   голосов , оценка 3.818 из 5