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 では、/n が受け入れられると、提供されたバッファーにさらに場所がある場合でも、sys_read が返されることに注意してください。

次に、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 に答える