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条指令看起来很奇怪,就像在其中一些指令中一样。