【发布时间】:2021-05-10 17:22:34
【问题描述】:
作为前言,我在 64 位 Linux 操作系统上运行它,因此我使用的是 64 位 Linux 系统调用。
我的strlen 过程以rdi 为参数,并返回rax 中字符串excluding \0 的长度。 (您必须输入一个以 \0 结尾的字符串)。我已经测试过这个程序并且知道它可以正常工作。
我的puts 过程将rdi 作为其参数,使用strlen 获取长度,然后使用write 系统调用。
这是一个(希望是)最小的可重现示例:
section .data
msg db "HELLO", 10, 0
section .text
global _start
_start:
mov rdi, msg
call puts
mov rax, 0x3c
xor rdi, rdi
syscall
strlen:
push rdi
push rcx
push rsi
xor rax, rax
mov rcx, 0xffffffff
repnz scasb
jnz .error
not rcx
dec rcx
mov rax, rcx
.return:
pop rsi
pop rcx
pop rdi
ret
.error:
mov rax, -1
jmp .return
puts:
mov rsi, rdi
call strlen
mov rdx, rax
mov rax, 1
mov rdi, rax
syscall
ret
我真的很困惑为什么这不起作用。我的puts 过程实际上只是一个简单的系统调用,所以我真的不知道这里出了什么问题。
【问题讨论】:
-
请提供一个minimal reproducible example,其中包含您的完整代码,而不仅仅是一些功能。
-
@fuz 我编辑了我的帖子以包含一个(希望)最小的可重现示例。
-
你不要打电话给你的
puts。 -
抱歉,小错字。但是当我调用它时仍然不起作用。
-
另外,您的
puts依赖于strlen保留RSI的值。RSI未在 System V AMD64 ABI 中保存被调用者,因此您可能应该对其进行保护,以便以后使其更加兼容。
标签: assembly linux-kernel x86-64 nasm