0

我对 x86 汇编编程真的很陌生,并且不知道它的复杂性。假设我在.bss 部分下声明了一个变量

name resb 20

我想从用户那里得到一个名字输入:

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

我只是想知道通过标准输入的输入长度是否存储在其中一个寄存器中?它是否包括回车?长度值存储在我想?还是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

这是两个易于理解的示例,说明如何使用stdinstdout组装:

  • STDIN你是对的,输入长度存储在寄存器之一中:

    ; 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
    

我建议你尽可能多地评论你在汇编中所做的事情,因为很难回到你几个月前做的代码......

编辑: 您可以检索使用 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 回答