assembly 如何在新的一行中输出预先写好的单词的每个字母?

ghg1uchk  于 2023-04-06  发布在  其他
关注(0)|答案(1)|浏览(96)

任务是编写一个exe程序(16位),它将按照以下顺序显示预先记录的字符串(我们使用变量)。在第一行中,从第一行开始的1个字母,在第二行2,在第三行3,等等。到变量字符串中的最后一个字符。
有没有人可以帮忙,因为我根本不懂这个汇编程序((
我能做的只有这些:

.MODEL TINY
.STACK 100h 

code:
    xor cx, cx
    mov cl, 5   
@1: mov dx, mess1
    add dx, cx
    mov ah, 9
    int 21h 
    
    mov dx, offset crlf
    mov ah, 9
    int 21h
    
    sub cx, 1               
    cmp cl, 0              
    jg @1
    mov ah,04Ch             
    mov al,1h
    int 21h  
    
    mess1 db "Artem$"
    crlf db 10, 13, "$"

end code
mqxuamgl

mqxuamgl1#

你需要两个DOS函数:AH=9 WRITE $-TEMINATED STRING TO STANDARD OUTPUT
AH=2 WRITE CHARACTER FROM DL TO STANDARD OUTPUT。让我们将一个字符加载到DL,使用INT21h/AH=2打印它,然后使用INT21h/AH=9打印字符串crlf,并在循环CX中重复。

code:               ; Let CX keep the number of characters in mess1.
    xor cx, cx
    mov cl, 5       ; OK, but it's shorter to use mov cx,5 instead.

这是错误的,我们需要寄存器DL用于其他目的。

;    @1:mov dx, mess1 
;        add dx, cx
;        mov ah, 9
;        int 21h

让我们使用其他寄存器来保存每个字符的地址,最好是寄存器SI

mov si, offset mess1

主循环从这里开始:

@1:     mov dl,[si]  ; Load one character to DL.        
        inc si       ; Prepare the address of the next character.
        mov ah,2     ; Print the character from DL. 
        int 21h

现在是时候将crlf打印为字符串了:

mov dx,offset crlf
    mov ah,9
    int 21h

循环打印剩余的字符。SI指向下一个字符,CX是循环计数器。

sub cx, 1               
    cmp cl, 0              
    jg @1

这可以工作,但更优雅的是loop @1

dec cx
    jnz @1

所有五个字符都被打印在新的行上。现在是终止程序的时候了。

mov ah,04Ch             
    mov al,1h
    int 21h

.MODEL TINY产生DOS COM程序,该程序可以用简单的指令ret终止。

相关问题