使用堆栈、循环 cx 和 dx 打印 'a' 到 'z' 的汇编程序

Assembly program to print 'a' to 'z' using stack, loop cx and dx

我有一个任务要编写一个汇编程序,它使用堆栈、循环 cx 和 dx 逐行垂直打印 'a' 到 'z'。 谁能帮帮我。

这是打印 a 到 z 的程序,但我不知道如何在我的程序中使用堆栈 cx 和 dx:

.data
l1c db 0ah,0dh,"S" 
.code 
main proc
mov ax @data 
mov ds,ax 
mov al,48 
mov cx,10 
d: 
mov dl,al 
mov ah,2 
int 21h 
call linechange 
inc al 
loop d
mov ah,4ch 
int 21h 
main endp 

;Procedure
linechange proc 
lea dx,l1c 
mov ah,9 
int 21h 
ret 
linechnage endp 
end main 

(这是我自己做的程序)

我猜你的老师想要避免 "clever" 解决方案,例如:

.MODEL SMALL

.STACK 1000h

.DATA
    smart_out   db 'a',13,10,'b',13,10,'b',13,10,'c',13,10,'d',13,10,'e',13,10
                db 'f',13,10,'g',13,10,'h',13,10,'i',13,10,'j',13,10,'k',13,10
                db 'l',13,10,'m',13,10,'n',13,10,'o',13,10,'p',13,10,'q',13,10
                db 'r',13,10,'s',13,10,'t',13,10,'u',13,10,'v',13,10,'w',13,10
                db 'x',13,10,'y',13,10,'z',13,10,'$'

.CODE
main:
    mov ax, @data
    mov ds, ax

    mov ah, 9
    mov dx, OFFSET smart_out
    int 21h

    mov ax, 4C00h
    int 21h
END main

你应该用 LOOP 输出这个(需要 CX)。在循环中,您至少需要保留 AXCX,因为您永远不知道 INT 21h 这样的过程是否会更改它。调用 INT 21h / 9 满足第三个条件,因为它需要 DX:

中的值
.MODEL SMALL

.STACK 1000h                ; Reserve space for stack and initialize stack pointer

.DATA
l1c db 0dh, 0ah, '$'        ; Dollar-sign!

.CODE
main PROC
    mov ax, @data
    mov ds, ax

    mov al, 'a'
    mov cx, 26

    d:
    push ax                 ; Store AX (AL is a part of AX)
    push cx                 ; Store CX

    mov dl, al
    mov ah, 2
    int 21h

    mov ah, 9
    mov dx, OFFSET l1c
    int 21h

    pop cx                  ; Restore CX & AX in reversed push-order
    pop ax

    inc al
    loop d                  ; Loops until cx == 0

    mov ah, 4ch
    int 21h
main ENDP

END main