2016-10-19 85 views
0

我想弄清楚如何通过一个字符串在一次循环中使用我的光标。
我制作的程序能够获取字符串中的某个索引。
但是,如何一次遍历整个字符串中的一个字符?汇编语言函数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次,我想弄清楚如何让字符串每次打印一个字符 –

+0

将字符串的地址放入一个寄存器中,并将其递增每次迭代结束(注意,并非所有寄存器都可用于16位代码的有效地址中)。 – Michael

回答

1

正如@迈克尔的建议,你需要把字符串的地址寄存器,例如,SI,然后在同一时间增加SI一个字节(一个字符)。当达到字符'$'时,循环必须完成:

.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