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



我有以下程序可以从A打印到Z,它们之间有一个空格。在下面的程序中,我理解了代码的其余部分,但不明白为什么使用PUSH DXPOP DX指令。如果我在不使用PUSH DXPOP 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码,DHDL寄存器分别是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

最新更新