0

私は x86 アセンブリ プログラミングにまったく慣れておらず、その複雑さを知りません。セクション .bssの下で宣言された変数があるとします。

name resb 20

そして、ユーザーから名前の入力を取得したい:

; gets name
mov eax, 3
mov ebx, 0
mov ecx, name
int 80h

標準入力を介した入力の長さがレジスタの1つに格納されているかどうか疑問に思っていますか? 改行も含めて数えますか?長さの値はalに保存されていると思いますか?またはbl?もしそうなら、私はそれをこのように保管できますか?

mov byte[nameLen], al

nameLen はセクション .bss の下で次のように宣言されます

nameLen resb 1

次のように文字列入力を再印刷したいと思います。

; excludes the carriage return from count
dec byte[nameLen]

mov eax, 4
mov ebx, 1
mov ecx, name
mov edx, nameLen
int 80h

助けてください!ありがとう!


x86 Ubuntuを使用しています。

4

1 に答える 1

2

stdin使用方法とstdout組み立て方法について理解しやすい 2 つの例を次に示します。

  • STDINあなたは正しかった、入力の長さはレジスタの1つに格納されます:

    ; read a byte from stdin
    mov eax, 3           ; 3 is recognized by the system as meaning "read"
    mov ebx, 0           ; read from standard input
    mov ecx, name        ; address to pass to
    mov edx, 1           ; input length (one byte)
    int 0x80             ; call the kernel
    

    私の記憶が正しければstdin、改行はカウントされません。ただし、確認のためにテストする必要があります。

  • STDOUTあなたの実装は正しかったですが、私はあなたにコメントを付けてあなたに与えます:

    ; print a byte to stdout
    mov eax, 4           ; the system interprets 4 as "write"
    mov ebx, 1           ; standard output (print to terminal)
    mov ecx, name        ; pointer to the value being passed
    mov edx, 1           ; length of output (in bytes)
    int 0x80             ; call the kernel
    

数か月前に行ったコードに戻るのは非常に難しいため、アセンブリで行っていることを最大限コメントすることをお勧めします...

EDIT : eax レジスタで読み取った文字数を取得できます。

整数値とメモリ アドレスは、EAX レジスタに返されます。

関数はsys_read読み取った文字数を返すため、この数値はeax関数の呼び出しの後にあります。

を使用したプログラムの例を次に示しeaxます。

section .data
        nameLen: db 20

section .bss
        name:    resb 20

section .text
        global _start

_exit:
        mov eax, 1                ; exit
        mov ebx, 0                ; exit status
        int 80h

_start:
        mov eax, 3                ; 3 is recognized by the system as meaning "read"
        mov ebx, 0                ; read from the standard input
        mov ecx, name             ; address to pass to
        mov edx, nameLen          ; input length
        int 80h

        cmp eax, 0                ; compare the returned value of the function with 0
        je  _exit                 ; jump to _exit if equal

        mov edx, eax              ; save the number of bytes read
                                  ; it will be passed to the write function

        mov eax, 4                ; the system interprets 4 as "write"
        mov ebx, 1                ; standard output (print to terminal)
        mov ecx, name             ; pointer to the value being passed
        int 80h

        jmp _start                ; Infinite loop to continue reading on the standard input

この単純なプログラムは、標準入力で読み取りを続け、結果を標準出力に出力します。

于 2013-07-07T20:08:16.413 に答える