8086 汇编语言程序从 A 到 Z 打印

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)

Vat*_*ine 5

寄存器DX开始加载 65, 的 ASCII 代码ADHDL寄存器分别是 的上半部分和下半部分DX

SPACE宏将 32(空格的 ASCII 代码)加载到 DL 中,覆盖其中的任何内容。在打印字符之间的空格时保存PUSH DX POP DX和恢复寄存器的状态。至于为什么你会看到!,那是因为在打印空格后不恢复 DX,你只需将 32 增加到 33 并打印该字符。