Assembly x86汇编中的除法导致程序暂停程序
我正在为学校做装配作业。目标是从用户输入中提取两个数字,将它们相加,然后在屏幕上输出结果。然而,在为输出准备结果时,程序调用myAssembly x86汇编中的除法导致程序暂停程序,assembly,x86,intel,Assembly,X86,Intel,我正在为学校做装配作业。目标是从用户输入中提取两个数字,将它们相加,然后在屏幕上输出结果。然而,在为输出准备结果时,程序调用myPrep_output函数后似乎会奇怪地暂停。我认为这与可能影响AH注册的部门有关。然而,我真的不确定。我目前已经实现了三个函数来打印测试输出,因为代码运行时会打印字符串'aaaaa',然后程序会退出到操作系统以指示它已正确执行。在此方面的任何帮助都将不胜感激 .model small .stack 64 .data Prompt DB 'Ent
Prep_output
函数后似乎会奇怪地暂停。我认为这与可能影响AH注册的部门有关。然而,我真的不确定。我目前已经实现了三个函数来打印测试输出,因为代码运行时会打印字符串'aaaaa',然后程序会退出到操作系统以指示它已正确执行。在此方面的任何帮助都将不胜感激
.model small
.stack 64
.data
Prompt DB 'Enter a number between 10 and 49 number: ', '$'
Prompt2 DB 'Enter another number between 10 and 49 number: ', '$'
StrPar LABEL BYTE
StrPar2 LABEL BYTE
Actual_Len DB 4
Chars DB 4 DUP('$')
Chars2 DB 4 DUP('$')
output DB 3 DUP('$')
junk DB ' abcadsd:', '$'
jun DB 'ddddddddd', '$'
a DB 'aaaaa', '$'
.code
MAIN proc FAR
mov AX,@data
mov DS,AX
call Clear
call Set_Cursor
call Request_Input
call Get_Input
call Clear
call Set_Cursor
call Request_Input2
call Get_Input2
call Clear
call Set_Cursor
call Add_Input
call Print_Output
call Add_Input2
call Print_Output2
call Prep_Output
call Print_Output3
mov AX,4C00h
int 21h
MAIN endp
;________________________
Clear proc NEAR
mov AX, 06H
mov AL, 00H
mov BH, 71H
mov CX, 0000H
mov DX, 184FH
int 10H
ret
Clear endp
;__________________________
Set_Cursor proc NEAR
mov AH, 02H
mov BH, 0
mov DH, 10
mov DL, 5
int 10H
ret
Set_Cursor endp
;___________________________
Request_Input proc NEAR
mov AH, 09H
lea DX,Prompt
int 21H
ret
Request_Input endp
;___________________________
Request_Input2 proc NEAR
mov AH, 09H
lea DX,Prompt2
int 21H
ret
Request_Input2 endp
;__________________________
Get_Input proc NEAR
mov AH, 0AH
lea DX, StrPar
int 21H
mov BH,00
mov BL,Actual_Len
mov Chars[BX],'$'
ret
Get_Input endp
;__________________________
Get_Input2 proc NEAR
mov AH, 0AH
lea DX, StrPar2
int 21H
mov BH,00
mov BL,Actual_Len
mov Chars2[BX],'$'
ret
Get_Input2 endp
;_________________________
Add_Input proc NEAR
mov AH, 00
mov DX, 00
mov BX,0
mov DL, Chars[BX]
sub DX,48
mov AX,10
mul DX
mov DX,AX
mov BX,1
mov CL,Chars[BX]
sub CX,48
add DX,CX
ret
Add_Input endp
;______________________
Add_Input2 proc Near
mov AH,00
mov BX,0
mov CL, Chars2[BX]
sub CX, 48
mov AX,10
mul CX
mov CX,AX
mov BX,1
mov BL,Chars2[BX]
sub BL,48
add CX,BX
ret
Add_Input2 endp
;______________________
Prep_Output proc NEAR
mov AH,00
add DX,CX
mov AX,DX
mov BX,10
div BX
add AX,48
add DX,48
mov BX, 0
mov output[BX],AL
mov BX, 1
mov output[BX],DL
ret
Prep_Output endp
;________________________
Print_Output proc NEAR
mov AH, 09H
lea DX, junk
int 21H
ret
Print_Output endp
;________________________
Print_Output2 proc NEAR
mov AH, 09H
lea DX, jun
int 21H
ret
Print_Output2 endp
;________________________
Print_Output3 proc NEAR
mov AH, 09H
lea DX, a
int 21H
ret
Print_Output3 endp
end MAIN
div
始终写入AX的两半,是的。并且具有16位或更宽的操作数大小(如div bx
),也可以写入DX。更重要的是,在您的情况下,div bx
将读取DX:AX作为红利。可以使用8位DIV来避免这种情况,如