2013-10-18 49 views
0

我有一個64位的NASM程序集指定大寫(所有字母應該是小寫字母,除了在句子開頭的那些字母)輸入文本的字母。我完全新的彙編,我不能在任何地方我應該怎麼讀字符串中的每個字符逐漸發現,當我讀到這樣的文字:如何從字符串中讀取每個字符NASM程序集64bit linux

section .data 

prompt  db "Enter your text: ", 10 
length  equ $ - prompt 
text  times 255 db 0 
textsize equ $ - text  

section .text 
global main 
main: 
    mov  rax, 1 
    mov  rdi, 1 
    mov  rsi, prompt 
    mov  rdx, length 
    syscall   ;print prompt 

    mov  rax, 0 
    mov  rdi, 0 
    mov  rsi, text 
    mov  rdx, textsize 
    syscall   ;read text input from keyboard 




exit: 
    mov  rax, 60 
    mov  rdi, 0 
    syscall 

而且,我不知道如何找出當文本結束時,我可以知道何時必須退出程序。我應該做一些文字大小的操作還是有一些顯示EOL的特殊符號王?謝謝您的回答。

+0

'sys_read'(系統調用0)返回'rax' IIRC中讀取的字符數。 – Michael

回答

0

從sys_read(syscall rax = 0)返回後,RAX寄存器應包含實際已被讀取的字符數。請注意,在Linux中,即使在提供的緩衝區中存在更多位置時,sys_read將在接受/ n時返回。

然後從0組織一個循環來RAX和處理每個字符所需的方式:

 mov byte ptr [text+rax], 0 ; make the string zero terminated for future use. 

     mov rcx, rax ; rcx will be the character counter. 
     mov rsi, text ; a pointer to the current character. Start from the beginning. 

process_loop: 
     mov al, [rsi] ; is it correct NASM syntax? 

     ; here process al, according to your needs... 
     ; ..... 

     inc rsi 
     dec rcx 
     jnz process_loop 

上面的代碼當然可以優化,例如使用字符串指令或循環指令,但IMO,這種方式對初學者更好。

+0

+1,但「Loop」指令與優化相反。 – Johan

+0

@Johan - 並非總是如此。例如在80386上它更快。此外,它取決於「什麼優化」 - 還有一個尺寸優化。 – johnfound

+0

正確,386是**最後**處理器,'loop'更快。 1989年推出了486. – Johan

相關問題