用户输入的Assember提示不起作用

时间:2018-05-31 18:17:06

标签: linux assembly nasm x86-64

今天我开始在linux上学习使用NASM的x86_64程序集。 我成功编写了一个hello world程序代码。 现在我想编写另一个简单的程序。 程序应该询问用户他的名字,然后打印“hi [name]”。 我的问题是该程序不要求名称。如果我启动程序它不会打印任何内容并停止没有错误。 这是我的代码:

section .data
    msg1 db "Type in ur Name? ", 10
    len1 equ $ - msg1       ; Get the Size of msg1

    msg2 db "Hi, "
    len2 equ $ - msg2       ;Get the Size of msg2

section .bss
    name resb 16            ;16 Bytes for name

section .text
    global _start

_start:

    ;Call Functions
    call _printMsg1
    call _getName
    call _printMsg2
    call _printName

    mov eax, 60
    mov ebx, 0
    int 0x80


_printMsg1:
    mov eax, 1
    mov ebx, 1
    mov ecx, msg1
    mov edx, len1
    int 0x80
    ret


_printMsg2:
    mov eax, 1
    mov ebx, 1
    mov ecx, msg2
    mov edx, len2
    int 0x80
    ret


_printName:
    mov eax, 1
    mov ebx, 1
    mov ecx, name
    mov edx, 16     ; reserve 16 Bytes for the name
    int 0x80
    ret


_getName:
    mov eax, 0      ;Syscall 0 = User Input
    mov ebx, 0
    mov ecx, name
    mov edx, 16     ;16 Bytes for the name
    int 0x80
    ret

感谢您的帮助!

编辑:我发现了问题。 如果我用以下内容替换以下寄存器,该程序有效: eax to rax ebx到rdi ecx到rsi edx到rdx

好像我使用了错误的寄存器。

2 个答案:

答案 0 :(得分:1)

快速修复
您对 32 位和 64 位寄存器以及系统调用编号感到困惑
我刚刚为 32 位架构更改了错误的寄存器值

section .data
    msg1 db "Type in ur Name? ", 10
    len1 equ $ - msg1       ; Get the Size of msg1

    msg2 db "Hi, "
    len2 equ $ - msg2       ;Get the Size of msg2

section .bss
    name resb 16            ;16 Bytes for name

section .text
    global _start

_start:

    ;Call Functions
    call _printMsg1
    call _getName
    call _printMsg2
    call _printName

    mov eax, 1
    mov ebx, 0
    int 0x80


_printMsg1:
    mov eax, 4
    mov ebx, 1
    mov ecx, msg1
    mov edx, len1
    int 0x80
    ret


_printMsg2:
    mov eax, 4
    mov ebx, 1
    mov ecx, msg2
    mov edx, len2
    int 0x80
    ret


_printName:
    mov eax, 4
    mov ebx, 1
    mov ecx, name
    mov edx, 16     ; reserve 16 Bytes for the name
    int 0x80
    ret


_getName:
    mov eax, 3      ;Syscall 3 = Read from stdin
    mov ebx, 0  
    mov ecx, name
    mov edx, 16     ;16 Bytes for the name
    int 0x80
    ret

使用 nasm 和 ld 编译 32 位

nasm -f elf32 test.asm -o test.o
ld -m elf_i386 test.o -o test

答案 1 :(得分:0)

x86-32和x86-64系统调用在数字,寄存器和系统调用指令方面有很大不同。

x86-32系统调用使用int 80h这个数字和寄存器:http://www.lxhp.in-berlin.de/lhpsysc0.html

x86-64系统调用使用syscall这个数字和寄存器: http://blog.rchapman.org/posts/Linux_System_Call_Table_for_x86_64/

您正在使用x86-32系统调用,因此请相应更改EAX中的数字。