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

时间:2014-01-01 12:42:37

标签: x86-16

我有以下程序从A到Z打印,它们之间有空格。在下面的程序中,我理解了其余的代码,但不明白为什么使用PUSH和POP操作。如果我在不使用PUSH和POP的情况下运行代码,我只会打印“!”而不是charecters。

.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 

3 个答案:

答案 0 :(得分:4)

DX寄存器开始加载65,A的ASCII码,DHDL寄存器分别是{{1}的上半部分和下半部分。 1}}。

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

答案 1 :(得分:3)

在SPACE中将DL设置为空格字符,但在主循环中使用DL作为A到Z字符。 SPACE的扩展会覆盖DL,因此您可以在它之前将其存储到堆栈中,然后在SPACE之后将其恢复。

答案 2 :(得分:0)

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<ul>
  <li><img src="https://via.placeholder.com/650x100"></li>
  <li><img src="https://via.placeholder.com/150x350"></li>
  <li><img src="https://via.placeholder.com/100"></li>
  <li><img src="https://via.placeholder.com/350x350"></li>
</ul>