【发布时间】:2018-11-13 19:38:21
【问题描述】:
我正在尝试使用 write syscall 来重现打印单个字符的 putchar 函数行为。我的代码如下,
asm_putchar:
push rbp
mov rbp, rsp
mov r8, rdi
call:
mov rax, 1
mov rdi, 1
mov rsi, r8
mov rdx, 1
syscall
return:
mov rsp, rbp
pop rbp
ret
【问题讨论】:
-
您是否验证了
rdi包含有效的字符串地址?另外,你是在 64 位 Linux 系统上运行的,对吧? -
你能用C写吗?请注意,
putchar接受一个字符,但write需要一个指针。 -
是的,我在 64 位 Linux 上运行,我知道 write 需要一个指针,但大多数使用此系统调用的人使用数据部分来存储字符串
-
@Lucas 将所需字符压入堆栈,然后将指向该字符的指针传递给系统调用。
-
您不需要额外的注册。你需要记忆。此外,您根本不需要触摸
rbp(包括推送/弹出)。你可以只在开头push rdi将字符存入堆栈(= 内存),然后mov rsi,rsp将存储的char 的内存地址存入rsi。并记住在sys_write之后释放存储的字符,例如add rsp,8(或pop到您不再需要的某个寄存器中,pop rcx可能是不错的候选者,因为rcx已被@987654336 修改@ 已经)。
标签: linux assembly nasm x86-64 system-calls