装配strlen输入概率

时间:2013-07-07 15:29:11

标签: assembly nasm

我是x86汇编编程的新手,并且不了解它的复杂性。 假设我在部分.bss

下声明了一个变量
name resb 20

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

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

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

1 个答案:

答案 0 :(得分: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

这个简单的程序继续读取标准输入并将结果打印在标准输出上。