Ошибка в вычислениях - 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
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д