Assembly 在汇编语言中添加两个数字作为输入
我必须编写一个汇编程序,将两个作为输入接收的数字相加,然后打印总和。我对它还是很陌生,花了大约15个小时试图弄明白这一点,这让我发疯。我的问题是我相信乘法中的某个地方。当我运行程序时,我会得到奇怪的字符作为输出。我知道程序正在正确地接收输入的数字,减法也能工作。然而,当涉及到倍增时,一切都是一团糟。这也是用汇编语言8086编写的。如果能帮上点忙,我们将不胜感激 这是我的密码Assembly 在汇编语言中添加两个数字作为输入,assembly,masm,x86-16,dos,Assembly,Masm,X86 16,Dos,我必须编写一个汇编程序,将两个作为输入接收的数字相加,然后打印总和。我对它还是很陌生,花了大约15个小时试图弄明白这一点,这让我发疯。我的问题是我相信乘法中的某个地方。当我运行程序时,我会得到奇怪的字符作为输出。我知道程序正在正确地接收输入的数字,减法也能工作。然而,当涉及到倍增时,一切都是一团糟。这也是用汇编语言8086编写的。如果能帮上点忙,我们将不胜感激 这是我的密码 ;-----------------------------------------------------
;-----------------------------------------------------
.model small
;-----------------------------------------------------
.stack 64
;-----------------------------------------------------
.data
PR DB 'ENTER: ','$'
Num1 Label Byte
Max1 DB 3 ; need to hit atmost 3 keys when entering- 2 digits and the enter key
Act1 DB ?
N1 DB 4 DUP ('$')
Num2 Label Byte
Max2 DB 3 ; need to hit atmost 3 keys when entering- 2 digits and the enter key
Act2 DB ?
N2 DB 4 DUP ('$')
Res DB 3 DUP ('$')
;-----------------------------------------------------
.code
MAIN proc FAR
mov AX,@data ; Initialize segment
mov DS,AX ; registers
call CLEAR
call SET_CURSOR
call REQUEST_INPUT
call GET_INPUT1
call REQUEST_INPUT
call GET_INPUT2
call SET_CURSOR
call Convert1
mov AX,4C00h ; Exit to DOS
int 21h
MAIN endp
;-----------------------------------------------------
CLEAR proc NEAR
mov AX, 0600H
mov BH, 71H
mov CX, 0000H
mov DX, 184FH
int 10H
ret
CLEAR endp
;-----------------------------------------------------
SET_CURSOR proc NEAR
mov AH, 02H
mov BH, 0 ;sets color of backround
mov DH, 12
mov DL, 40
int 10H
ret
SET_CURSOR endp
;-----------------------------------------------------
REQUEST_INPUT proc NEAR
mov AH, 09H
lea DX, PR
int 21H
ret
REQUEST_INPUT endp
;-----------------------------------------------------
GET_INPUT1 proc NEAR
mov AH, 0AH
lea DX,Num1
int 21H
mov BH, 00
mov BL, Max1
mov N1[BX],'$'
ret
GET_INPUT1 endp
;-----------------------------------------------------
GET_INPUT2 proc NEAR
mov AH, 0AH
lea DX,Num2
int 21H
mov BH, 00
mov BL, Max2
mov N2[BX],'$'
ret
GET_INPUT2 endp
;-----------------------------------------------------
Convert1 proc NEAR
mov BX, 0
mov AH, 00h
mov AL, N1[BX] ; Get a character
Mov Ax, 10
Mul AL
mov BX, 1
mov BH, 00h
mov BL, N1[BX] ; Get a character
Add AL, BL
mov BX, 0
mov CH, 00h
mov CL, N2[BX] ; Get a character
Mov Ax, 10
Mul CL
mov BX, 1
mov BH, 00h
mov DL, N2[BX] ; Get a character
Add CL, DL
Add AL, CL
Mov Ax, 10
Div Al
Mov Res[0], AL
Add AH, 48
call SET_CURSOR2
Mov Res[1], AH
mov AH,09h
lea DX, Res
int 21H
ret
Convert1 endp
;-----------------------------------------------------
;formula ()N1[0]-48)*10 + (N1[1]-48)
;same for N2
;before printing need to divide result of N1+N2 by 10. the quation is the frist character remainder is the second character- quaotiant will be in AL, Remainder in AH
;then need to add 48 before putting them into the array Res
;To go back Add Al,48-Mov Res[0], AL
;------------------------------------------------------------
end MAIN
欢迎来到StackOverflow!你目前得到了什么?你期望得到什么?你到底有什么问题?你说你有问题,但不是什么问题。那将帮助我们帮助你。另外,您使用的是哪种汇编语言?为了充分利用你在stackoverflow的经历,我的问题是我相信乘法运算中的某个地方。当我运行程序时,我会得到奇怪的字符作为输出。我知道程序正在正确地接收输入的数字,减法也能工作。然而,当涉及到倍增时,一切都是一团糟。这也是在汇编语言8086中,
mov AL,…
然后mov Ax,10
后面跟着Mul AL
肯定是一种代码味道mul al
将al
乘以al
。这些指令的结果总是ax=100,我同意玛格丽特·布鲁姆的观点。看起来您正在将一个字符放入寄存器ax,然后立即用10覆盖该字符。寄存器al只是ax的低位字节。所以如果我需要将输入al的值乘以10,我应该将10移到另一个寄存器中,然后再相乘?