为什么我的数据段与我的代码段冲突?
Why is my data segment clashing with my code segment?
我这里有一个程序可以除以两个用户输入的数字并显示商。该程序已经运行良好并产生了正确的结果,但是当我添加数据段时,它没有显示商,而是显示大写字母“T”。我试过单步执行它并注意到 AX 寄存器的值在打印 MSG3
之前发生了变化。我希望能够添加字符串 Input First Number
等,但过程中的某些内容似乎弄乱了代码。我该如何解决?
代码如下:
.MODEL SMALL
READ MACRO MSG
MOV AH,0AH
LEA DX,MSG
INT 21H
ENDM
PRINT MACRO MSG
MOV AH,09H
LEA DX,MSG
INT 21H
ENDM
.DATA
CR EQU 0DH
LF EQU 0AH
MSG1 DB "Enter First Digit: $"
MSG2 DB CR,LF,"Enter Second Digit: $"
MSG3 DB CR,LF,"The Quotient is: $"
BUFF DB 2
DB 3 DUP ('$')
DATA ENDS
.CODE
ASSUME CS:CODE,DS:DATA
MAIN PROC
MOV AX,DATA
MOV DS,AX
PRINT MSG1
MOV AH,1
INT 21H ;Dividend
MOV BH,AL
SUB BH,48 ;Convert to decimal no
PRINT MSG2
MOV AH,1
INT 21H ;Divisor
MOV BL,AL
SUB BL,48
MOV CL,BH ;Move dividend to cl reg
MOV CH,00 ;Empty register?
MOV AX,CX ;Move 16bit to 16bit reg
DIV BL ;AX/BL
AAD ;Stop dividing. ASCII adjust AX before division. Clears AH reg
PRINT MSG3
ADD AL,48
MOV AH,2
MOV DL,AL ;Print
INT 21H
EXIT:
MOV AH,4CH
INT 21H
MAIN ENDP
END MAIN
打印 T
的原因是 Int 21h/AH=9h DOS 函数调用用 $
字符破坏了 AL 中的值。
DOS 1+ - WRITE STRING TO STANDARD OUTPUT
AH = 09h
DS:DX -> '$'-terminated string
Return:
AL = 24h (the '$' terminating the string, despite official docs which
state that nothing is returned) (at least DOS 2.1-7.0 and
NWDOS)
值 24h 在 AL 中返回,您将 30h(48) 添加到它得到 54h。字母 T
是 54h,这是打印的字符。您需要将要保存的值放入 Int 21h/AH=9h
DOS 函数调用未使用的寄存器中。任何未使用的 8 位寄存器都足够了,例如 BL.
我这里有一个程序可以除以两个用户输入的数字并显示商。该程序已经运行良好并产生了正确的结果,但是当我添加数据段时,它没有显示商,而是显示大写字母“T”。我试过单步执行它并注意到 AX 寄存器的值在打印 MSG3
之前发生了变化。我希望能够添加字符串 Input First Number
等,但过程中的某些内容似乎弄乱了代码。我该如何解决?
代码如下:
.MODEL SMALL
READ MACRO MSG
MOV AH,0AH
LEA DX,MSG
INT 21H
ENDM
PRINT MACRO MSG
MOV AH,09H
LEA DX,MSG
INT 21H
ENDM
.DATA
CR EQU 0DH
LF EQU 0AH
MSG1 DB "Enter First Digit: $"
MSG2 DB CR,LF,"Enter Second Digit: $"
MSG3 DB CR,LF,"The Quotient is: $"
BUFF DB 2
DB 3 DUP ('$')
DATA ENDS
.CODE
ASSUME CS:CODE,DS:DATA
MAIN PROC
MOV AX,DATA
MOV DS,AX
PRINT MSG1
MOV AH,1
INT 21H ;Dividend
MOV BH,AL
SUB BH,48 ;Convert to decimal no
PRINT MSG2
MOV AH,1
INT 21H ;Divisor
MOV BL,AL
SUB BL,48
MOV CL,BH ;Move dividend to cl reg
MOV CH,00 ;Empty register?
MOV AX,CX ;Move 16bit to 16bit reg
DIV BL ;AX/BL
AAD ;Stop dividing. ASCII adjust AX before division. Clears AH reg
PRINT MSG3
ADD AL,48
MOV AH,2
MOV DL,AL ;Print
INT 21H
EXIT:
MOV AH,4CH
INT 21H
MAIN ENDP
END MAIN
打印 T
的原因是 Int 21h/AH=9h DOS 函数调用用 $
字符破坏了 AL 中的值。
DOS 1+ - WRITE STRING TO STANDARD OUTPUT AH = 09h DS:DX -> '$'-terminated string Return: AL = 24h (the '$' terminating the string, despite official docs which state that nothing is returned) (at least DOS 2.1-7.0 and NWDOS)
值 24h 在 AL 中返回,您将 30h(48) 添加到它得到 54h。字母 T
是 54h,这是打印的字符。您需要将要保存的值放入 Int 21h/AH=9h
DOS 函数调用未使用的寄存器中。任何未使用的 8 位寄存器都足够了,例如 BL.