-3

你能帮忙解释一下为什么这段代码不起作用吗?

.MODEL SMALL 
.STACK 64 
.DATA

INPUT DB 13, 10, "Enter input : ","$" 
OPERAND DB 13,10, "ENTER OPERAND:,  
SUM DB 13,10, "The sum is : ","$" 
DIFF DB 13,10, "The difference is : ","$" 
MULTI DB 13,10, "The product is : ","$" 
DIVI DB 13,10, "The quotient is : ","$" 
MODULO DB 13,10, "The modulo is : ","$" 
NUM1 db ? 
NUM2 db ? 
OP db ? 
RES db ?

;-----------------------------------------------------

.CODE 
MAIN PROC NEAR

    MOV AX, @DATA 
    MOV DS, AX

    ; outputs "input" message 
    LEA DX, INPUT 
    MOV AH, 09h 
    INT 21h

    ; get first input 
    MOV AH, 01h 
    INT 21h 
    SUB AL, 0 
    MOV NUM1, AL

    ; get operand 
    MOV AH, 01h 
    INT 21h 
    MOV OP, AL

    ; get second input 
    MOV AH, 01h 
    INT 21h 
    SUB AL, 0 
    MOV NUM2, AL

    CMP OP, "+" 
    JE  @ADD

    CMP OP, "-" 
    JE  @SUB

    CMP OP, "*" 
    JE  @MULTIPLY

    CMP OP, "/" 
    JE  @DIVIDE

    CMP OP, "%" 
    JE  @MOD

@ADD : 
    ADD AL, NUM1 
    MOV RES, AL

    LEA DX, SUM 
    MOV AH, 09h 
    INT 21h 
    JMP @PRINT

@SUB : 
    MOV AL, NUM1 
    CMP AL, NUM2 
    JG  @WITHOUTNEG 
    JMP @WITHNEG

@WITHNEG : 
    MOV AL, NUM2 
    SUB AL, NUM1 
    MOV RES, AL

    LEA DX, DIFF 
    MOV AH, 09h 
    INT 21h

    MOV OP, "-" 
    MOV DL, OP 
    MOV AH,02h 
    INT 21h 
    JMP @PRINT

@WITHOUTNEG : 
    MOV AL, NUM1 
    SUB AL, NUM2 
    MOV RES, AL

    LEA DX, DIFF 
    MOV AH, 09h 
    INT 21h 
    JMP @PRINT

@MULTIPLY : 
    MOV AL, NUM1 
    IMUL NUM2 
    MOV RES, AL

    LEA DX, MULTI 
    MOV AH, 09h 
    INT 21h 
    JMP @PRINT

@DIVIDE : 
    XOR AX, AX 
    MOV AL, NUM1 
    IDIV NUM2 
    MOV RES, AL

    LEA DX, DIVI 
    MOV AH, 09h 
    INT 21h 
    JMP @PRINT

@MOD : 
    XOR AX, AX 
    MOV AL, NUM1 
    IDIV NUM2 
    MOV RES, AH

    LEA DX, MODULO 
    MOV AH, 09h 
    INT 21h 
    JMP @PRINT

@PRINT : 
    XOR AX, AX

    MOV AL, RES 
    MOV BL, 10 
    IDIV BL

    ADD AL, 0 
    MOV DL, AL 
    MOV AH,02h 
    INT 21h

    ADD AH, 0 
    MOV DL, AH 
    MOV AH,02h 
    INT 21h 
    JMP @EXIT

@EXIT : 
    MOV AH,4Ch 
    INT 21h

MAIN ENDP

;----------------------------------------------------------------

END MAIN
4

2 回答 2

0

请提供有关您希望使用此代码实现什么的更多详细信息。同样JMP @WITHNEG在这一行代码@SUB : MOV AL, NUM1 CMP AL, NUM2 JG @WITHOUTNEG JMP @WITHNEG上是完全没有必要的,因为下一行是@WITHNEG:。根据逐行执行方案,如果不满足JG,无论如何都会执行下一行。

另一个要求是每行写入每条指令。流利地阅读并理解它是很忙的。

也请code tags在您编写代码时使用。

谢谢 :)

于 2013-09-12T17:53:53.393 回答
0

现在您的代码已格式化,它更容易理解。

让我们修复您的变量之一:

OPERAND DB 13,10, "ENTER OPERAND:,

应该:

OPERAND DB 13,10, "ENTER OPERAND:", "$"

接下来,当您“获取”一个字符时,它是该字符的 ASCII 码,因此对于单个字符,要转换为一个数字,您减去 48 或“0”,而不是您在此处执行的 0:

; get first input 
MOV AH, 01h 
INT 21h 
SUB AL, 0 
MOV NUM1, AL

应该:

; get first input 
MOV AH, 01h 
INT 21h 
SUB AL, "0" 
MOV NUM1, AL

看到不同?现在,您可以对其他输入进行更正。

接下来,您需要在OP比较之后进行无条件跳转,否则@ADD如果用户没有输入正确的运算符,它将直接跳转。

CMP OP, "%" 
JE  @MOD
jmp @EXIT   ; <----- added

您的@MOD代码不需要 a JMP @PRINT,因为无论如何它都会“通过”您的打印例程,JMP @EXIT打印例程结束时也是如此。

@PRINT : 

XOR AX, AX

MOV AL, RES 
MOV BL, 10 
IDIV BL

ADD AL, "0" 
MOV DL, AL 
MOV AH,02h 
INT 21h

ADD AH, 0 
MOV DL, AH 
MOV AH,02h 
INT 21h 
JMP @EXIT

不太清楚你为什么这样做:

MOV BL, 10 
IDIV BL

它不是必需的。现在,要将“数字”转换回它的 ASCII 字符,您可以反转您对输入所做的操作 - 添加 48 或“0”

@PRINT : 
    XOR AX, AX

    MOV AL, RES 
    ADD AL, "0" 
    MOV DL, AL 
    MOV AH,02h 
    INT 21h

@EXIT : 
    MOV AH,4Ch 
    INT 21h 

我必须质疑您为什么要使用所有大写字母编写代码?!?!它使代码更难阅读。您还应该检查输入的运算符是否是允许的运算符之一。

此外,此代码适用于小于或等于 9 的数字,任何更大的数字都需要不同的代码才能转换为 ASCII。

于 2013-09-13T02:03:25.980 回答