0

我有一个 64 位 NASM 汇编分配来大写输入文本的字母(所有字母都应该小写,除了那些在句子开头的字母)。我对汇编程序完全陌生,当我阅读这样的文本时,我无法在任何地方找到如何从字符串中增量读取每个字符:

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 的特殊符号之王?谢谢您的回答。

4

1 回答 1

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,这种方式更适合初学者。

于 2013-10-18T11:06:00.237 回答