Assembly 用汇编语言求余数和商

Assembly 用汇编语言求余数和商,assembly,x86,Assembly,X86,你能帮我解释一下为什么这个代码不起作用吗 .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 : ","$" DI

你能帮我解释一下为什么这个代码不起作用吗

.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

请提供更多关于您希望使用此代码实现什么的详细信息。另外,这一行代码上的
JMP@WITHNEG
SUB:MOV AL、NUM1 CMP AL、NUM2 JG@WITHOUTNEG JMP@WITHNEG是完全不必要的,因为下一行是
@WITHNEG:
。根据逐行执行方案,如果不满足JG,无论发生什么情况,都将执行下一行

另一个请求是每行写入每条指令。要流利地阅读并理解它,这是非常困难的

此外,在编写代码时,请使用
代码标签


谢谢:)

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

让我们修复一个变量:

OPERAND DB 13,10, "ENTER OPERAND:,
应该是:

OPERAND DB 13,10, "ENTER OPERAND:", "$"
; get first input 
MOV AH, 01h 
INT 21h 
SUB AL, "0" 
MOV NUM1, AL
下一步,当您“获取”一个字符时,它是该字符的ASCII码,因此对于单个字符,要转换为减去48或“0”的数字,而不是像您在此处所做的那样减去0:

; get first input 
MOV AH, 01h 
INT 21h 
SUB AL, 0 
MOV NUM1, AL
应该是:

OPERAND DB 13,10, "ENTER OPERAND:", "$"
; get first input 
MOV AH, 01h 
INT 21h 
SUB AL, "0" 
MOV NUM1, AL
看到区别了吗?现在,您可以对其他输入进行更正

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

CMP OP, "%" 
JE  @MOD
jmp @EXIT   ; <----- added
不太清楚你为什么这么做:

MOV BL, 10 
IDIV BL
这是不必要的。 现在,要将“数字”转换回其ASCII字符,您需要反转输入的操作-添加48或“0”

我必须问你为什么用大写字母写代码?!?!这使得代码更难阅读。您还应该检查输入的操作员是否是允许的操作员之一


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

您能提供更多信息吗?发生了什么?您希望发生什么?您通常不是每行需要一条汇编指令吗?在一行中看到5条指令看起来很奇怪,就像在其中一些指令中一样。