我有以下程序可以从A打印到Z,它们之间有一个空格。在下面的程序中,我理解了代码的其余部分,但不明白为什么使用PUSH DX
和POP DX
指令。如果我在不使用PUSH DX
和POP DX
的情况下运行代码,它只会打印"!"而不是字符。
.model small
.stack
.data
VAL DB 'A'
.code
MAIN PROC
SPACE MACRO
MOV DL, ' '
MOV AH, 02h;
INT 21H
ENDM
MOV AX, @DATA
MOV DS, AX
MOV CL, 26
MOV DL, 65 ; MOV DL, VAL
PRINT:
MOV AH, 02H
INT 21H
PUSH DX
SPACE
POP DX
INC DL
DEC CL
JNZ PRINT
MOV AH, 4CH
INT 21H
MAIN ENDP
END MAIN
DX
寄存器开始时加载65,A
的ASCII码,DH
和DL
寄存器分别是DX
的上半部分和下半部分。
SPACE
宏将 32(空格的 ASCII 代码)加载到 DL 中,覆盖那里的任何内容。PUSH DX
POP DX
保存并恢复寄存器的状态,同时打印字符之间的空格。至于为什么你看到!
,那是因为在打印空间后没有恢复DX,你只需将32增加到33并打印该字符。
在空间中 您将 DL 设置为空格字符,但在主循环中 您将 DL 用作 A 到 Z 字符。 SPACE 的扩展会覆盖 DL,因此 您将它存储到它之前的堆栈中,并在 SPACE 之后将其收回。
.MODEL SMALL
.STACK 100H
.DATA
MAIN PROC
MOV BL,65
MOV CL,26
PRINT:
MOV AH,2
MOV DL,BL
INC BL
DEC CL
INT 21H
MOV DL,0DH
INT 21H
MOV DL,0AH
INT 21H
JNZ PRINT
MOV AH,4CH
INT 21H
MAIN ENDP
END MAIN
org 100h
.model small
.data
msg1 db 13,10, " Print A to Z characters: $"
.code
main proc
mov ax,@data
mov dx,ax
mov dx,offset msg1
mov ah,9
int 21h
mov cx,25
mov dx,65
mov ah,2
int 21h
labelname:
inc dx
mov ah,2
int 21h
loop labelname
mov ah,4ch
int 21h
main endp
end main