2013-10-18 47 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

相关问题