shr*_*3jn 2 assembly stack dos cpu-registers x86-16
我有以下程序,可以从 A 打印到 Z,中间有一个空格。在下面的程序中,我理解了其余的代码,但不明白为什么使用PUSH DX和指令。POP DX如果我运行代码而不使用PUSH DXand 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
Run Code Online (Sandbox Code Playgroud)
寄存器DX开始加载 65, 的 ASCII 代码A,DH和DL寄存器分别是 的上半部分和下半部分DX。
该SPACE宏将 32(空格的 ASCII 代码)加载到 DL 中,覆盖其中的任何内容。在打印字符之间的空格时保存PUSH DX POP DX和恢复寄存器的状态。至于为什么你会看到!,那是因为在打印空格后不恢复 DX,你只需将 32 增加到 33 并打印该字符。