我正在使用 elf64 编译并尝试获取参数并将其写入控制台。
我将该函数称为 ./test wooop
使用 gdb 单步执行后似乎没有问题,一切都设置好了:
rax: 0x4 rbx: 0x1 rcx: 指向字符串,x/6cb $rcx 给出 'w' 'o' 'o' 'o' 'p' 0x0 rdx: 0x5 <---正确确定长度
在 int 80h rax 包含 -14 之后,控制台上没有任何内容。如果我在 .data 中定义一个字符串,它就可以工作。gdb 以同样的方式显示 $rcx 的值。
有任何想法吗?这是我的完整来源
%define LF 0Ah
%define stdout 1
%define sys_exit 1
%define sys_write 4
global _start
section .data
usagemsg: db "test {string}",LF,0
testmsg: db "wooop",0
section .text
_start:
pop rcx ;this is argc
cmp rcx, 2 ;one argument
jne usage
pop rcx
pop rcx ; argument now in rcx
test rcx,rcx
jz usage
;mov rcx, testmsg ;<-----uncomment this to print ok!
call print
jmp exit
usage:
mov rcx, usagemsg
call print
jmp exit
calclen:
push rdi
mov rdi, rcx
push rcx
xor rcx,rcx
not rcx
xor al,al
cld
repne scasb
not rcx
lea rdx, [rcx-1]
pop rcx
pop rdi
ret
print:
push rax
push rbx
push rdx
call calclen
mov rax, sys_write
mov rbx, stdout
int 80h
pop rdx
pop rbx
pop rax
ret
exit:
mov rax, sys_exit
mov rbx, 0
int 80h
谢谢
编辑:在改变我的系统调用方式后,它工作正常。感谢你的帮助!
sys_write 现在是 1
sys_exit 现在是 60
stdout 现在进入 rdi,而不是 rbx
要写入的字符串现在设置在 rsi 中,而不是 rcx
int 80h 被 syscall 替换