该代码没有错误,但是我仍然没有得到正确的答案

时间:2020-07-16 13:34:02

标签: assembly x86 x86-16

我必须编写一个求解方程的代码(在代码中)y的立方和10 * x ^ 2的值是错误的。也有人可以帮助我如何打印变量ans吗?我目前正在使用emu8086,并即时查看emu选项中每个变量的值。这是我写的代码。我是一个初学者,所以我不想使这段代码复杂化。请建议

.MODEL SMALL
.STACK 100H
.DATA

equation DB "Equation: (10x^2 - 6y^3)*3z + y^3 + z^4",0DH,0AH ,'$'

MSGX DB 0DH,0AH,"ENTER VALUE OF X",0DH,0AH,'$'
MSGY DB 0DH,0AH,"ENTER VALUE OF Y",0DH,0AH,'$'
MSGZ DB 0DH,0AH,"ENTER VALUE OF Z",0DH,0AH,'$' 
MSGNO DB "",0DH,0AH,'$' 

X DB ?
Y DB ?
Z DB ? 
SQUAREX DW ?   
CUBEY DW ? 
SQUARE10X DW ?
CUBE6Y DW ?
3Z DW ?
ZP4 DW ? ; z powered 4
BRAC1 DW ?
BRAC2 DW ?  
ANS DW ?

.CODE
.STARTUP  


; INPUT X                 (10x^2 - 6y^3)*3z + y^3 + z^4
MOV AH,9
MOV DX,OFFSET MSGX
INT 21H
MOV AH,1
INT 21H
MOV X,AL
SUB X,48 
MOV AH,9
MOV DX,OFFSET MSGNO
INT 21H

; INPUT Y                      (10x^2 - 6y^3)*3z + y^3 + z^4
MOV AH,9
MOV DX,OFFSET MSGY
INT 21H
MOV AH,1
INT 21H
MOV Y,AX
SUB Y,48  
MOV AH,9
MOV DX,OFFSET MSGNO
INT 21H

; INPUT Z         
MOV AH,9
MOV DX,OFFSET MSGZ
INT 21H
MOV AH,1
INT 21H
MOV Z,AL
SUB Z,48 
MOV AH,9
MOV DX,OFFSET MSGNO
INT 21H       


;ZP4                                     (10x^2 - 6y^3)*3z + y^3 + z^4
 
MOV AL, Z
MOV BL,Z
MUL BL 
MOV CL,Z
MUL CL   
MOV DL,Z
MUL DL
AAM   
MOV ZP4,AX

                     
;Y^3
MOV AL,Y
MOV BL,Y
MUL BL 
MOV CL,Y
MUL CL
AAM   
MOV CUBEY,AX   

;6Y^3                        (10x^2 - 6y^3)*3z + y^3 + z^4
MOV AX,CUBEY 
MOV BL,6
MUL BL
AAM
MOV CUBE6Y,AX

;X^2                
MOV AL,X
MOV BL,X
MUL BL
AAM   
MOV SQUAREX,AX 

;10X^2                
MOV AX,SQUAREX
MOV BL,10
MUL BL
AAM   
MOV SQUARE10X,AX 

;3Z
MOV AL,Z
MOV BL,3
MUL BL
AAM
MOV 3Z,AX 

  
                            
;bracket 1                  (10x^2 - 6y^3)
MOV AX,SQUARE10X
SUB AX,CUBE6Y   
AAA 
MOV BRAC1 ,AX
                           
;bracket 2                   (3z + y^3 + z^4)       
MOV AX,3Z
ADD AX,CUBEY 
ADD AX, ZP4 
AAA 
MOV BRAC2 ,AX

MOV AX, BRAC1
MUL BRAC2
MOV ANS, AX


.EXIT
END 

1 个答案:

答案 0 :(得分:2)

您的代码有几个问题

  • 输入 Y 时出现错字。 MOV Y,AX应该是mov Y, al。幸运的是,这不会显示在结果中
  • 您不必要地使用了AAM指令
  • 在很多情况下,您实际上使用的是字节大小的乘法,而实际上您应该使用字大小的乘法
  • 您没有遵循 BRAC2 上的常规代数规则。在(10x^2 - 6y^3)*3z + y^3 + z^4上添加第二对括号将得到((10x^2 - 6y^3)*3z) + y^3 + z^4,而不是您(10x^2 - 6y^3)*(3z + y^3 + z^4)那样。请记住,乘法优先于加法!
; ZP4                 (10x^2 - 6y^3)*3z + y^3 + z^4
mov al, Z
mul al
mul al
mov ZP4, ax           ; Could be as big as 9 x 9 x 9 x 9 == 6561
                     
; Y^3
mov al,Y
mul al
mov bl,Y
mul bl 
mov CUBEY, ax         ; Could be as big as 9 x 9 x 9 == 729

; 6Y^3
mov ax, CUBEY         ; 729 would not fit in AL register!
mov bx, 6
mul bx                ; Needs to be word-sized multiplication!
mov CUBE6Y, ax        ; Could be as big as 6 x 9 x 9 x 9 == 4374

; X^2
mov al, X
mul al
mov SQUAREX, ax 

; 10X^2
mov bl, 10
mul bl
mov SQUARE10X, ax     ; Could be as big as 10 x 9 x 9 == 810 

; 3Z
mov al, Z
mov bl, 3
mul bl
mov 3Z, ax 

; bracket 1           (10x^2 - 6y^3)
mov ax, SQUARE10X
sub ax, CUBE6Y        ; This could be a NEGATIVE value!
             
; bracket 2           ((10x^2 - 6y^3)*3z)
mov bx, 3Z
imul bx

; additions           ((10x^2 - 6y^3)*3z) + y^3 + z^4
add ax, CUBEY
add ax, ZP4
mov ANS, ax

有人还能帮我打印变量ans吗?

我已经写了此问题解答Displaying numbers with DOS,详细说明了如何打印答案。