今天我开始在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好像我使用了错误的寄存器。
答案 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
中的数字。