2016-10-19 10 views
0

カーソルを使用して、文字を1文字ずつ時間通りにループする方法を理解しようとしています。
私が作ったプログラムは、文字列の特定のインデックスをつかむことができました。
しかし、文字列全体を一度に1文字ずつループするにはどうすればよいですか?アセンブリ言語関数2ループ

title Hello World Program (hello3.asm) 

; 
; This is the sample program on page 572 of your text with little modification 
;It utilizes Dos service 40h. 
; 

.model small 
.data 
    message db "Hello, Dos Here!",0dh,0ah,'$' 


.code 
main proc 
    mov ax, @data 
    mov ds, ax 
    mov cx, 5 
L1: 
    mov ah, 2 
    mov dl, message 
    int 21h 

loop L1 
    mov ax, 4c00h 
    int 21h 
main endp 
end 

`

+0

このコードは何をしますか?どのアセンブラですか?なぜあなたは 'mov dl、message'と書いていますか?文字列の文字がコンピュータのメモリにどのように格納されていると思いますか? – Ped7g

+0

@ Ped7gコードは、文字列の最初の文字を5回印刷します。文字を1文字ずつ出力するにはどうすればいいですか? –

+0

文字列のアドレスをレジスタに入れてからインクリメントします。各繰り返しの終わり(すべてのレジスタが16ビットコードの実効アドレスで使用できるわけではないことに注意してください)。 – Michael

答えて

1

@Michaelによって示唆されるように、あなたはその後、一度にSI 1バイト(1文字)を増やし、SI、例えば、レジ​​スタ内の文字列のアドレスを配置する必要があります。 char '$'に達すると、ループは終了する必要があります:

.model small 
.data 
    message db "Hello, Dos Here!",0dh,0ah,'$' 

.code 
main proc 
    mov ax, @data 
    mov ds, ax 

; mov cx, 5     ;<=== WE DON'T NEED CX BECAUSE WE AREN'T 
           ;  USING THE LENGTH OF THE STRING, WE 
           ;  ARE USING THE '$' CHAR. 
    mov si, offset message  ;<=== SI POINTS TO FIRST CHARACTER OF STRING. 
L1: 
;CHECK IF '$' (LAST CHAR) IS THE CURRENT CHAR. 
    mov dl, [si]     ;<=== CURRENT CHARACTER TO PRINT. 
    cmp dl, '$'     ;<=== IF CURRENT CHAR IS '$'... 
    je finish     ;<=== ... JUMP TO FINISH. 
;PRINT CHAR IN DL. 
    mov ah, 2 
    int 21h   
;loop L1       ;<=== WE DON'T NEED LOOP BECAUSE 
           ;  WE ARE NOT USING CX. 
    inc si      ;<=== NEXT CHAR OF THE STRING. 
    jmp L1      ;<=== REPEAT. 

finish: 

    mov ax, 4c00h 
    int 21h 
main endp 
end 
関連する問題