Assembly x86汇编中的除法导致程序暂停程序

Assembly x86汇编中的除法导致程序暂停程序,assembly,x86,intel,Assembly,X86,Intel,我正在为学校做装配作业。目标是从用户输入中提取两个数字,将它们相加,然后在屏幕上输出结果。然而,在为输出准备结果时,程序调用myPrep_output函数后似乎会奇怪地暂停。我认为这与可能影响AH注册的部门有关。然而,我真的不确定。我目前已经实现了三个函数来打印测试输出,因为代码运行时会打印字符串'aaaaa',然后程序会退出到操作系统以指示它已正确执行。在此方面的任何帮助都将不胜感激 .model small .stack 64 .data Prompt DB 'Ent

我正在为学校做装配作业。目标是从用户输入中提取两个数字,将它们相加,然后在屏幕上输出结果。然而,在为输出准备结果时,程序调用my
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来避免这种情况,如