assembly - NASM(64 位 linux):我的“puts”程序不适用于我的“strlen”程序
问题描述
作为前言,我在 64 位 Linux 操作系统上运行它,因此我使用 64 位 Linux 系统调用。
我的strlen
过程将rdi
作为参数并返回字符串的excluding \0
长度rax
。(您必须输入一个以 \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
程序实际上只是一个简单的系统调用,所以老实说,我不知道这里出了什么问题。
解决方案
我已经测试了 [my
strlen
] 并且知道它可以正常工作。
恐怕不是。
mov rcx, 0xffffffff
您似乎认为这与 一起加载rcx
,-1
但它不是:0xffffffff
是-1
一个 32 位有符号整数,而是rcx
一个 64 位寄存器。(也许你是从一些 32 位代码中复制过来的?)特别是,mov rcx, 0xffffffff
后面的not rcx
不是rcx
包含0
,而是包含0xffffffff00000000
. 结果,您strlen
返回的值严重不正确。
将此更改为mov rcx, -1
或mov rcx, 0xffffffffffffffff
。
推荐阅读
- python - 尝试符号链接最新日志目录时出现 root:OSError - Apache Airflow
- javascript - 为什么 reduce() 跳过方括号?
- sql - 使用 TSQL 对简单的汇总总计进行 UNPIVOT……这甚至可能吗?
- scala - 将 UDF 函数应用于 Spark 窗口,其中输入参数是范围内所有列值的列表
- ios - UITableViewCell 滚动检测
- sql - SQL查询emp表中的工资
- javascript - 如何使用“vue-google-charts”(来自 devstark)显示图表的标题和副标题(在顶部或底部)?
- python - 直方图 Bins,TypeError:无法使用灵活类型执行归约
- javascript - onaddstream 事件未调用
- xamarin.forms - 正在使用 OnPropertyChanged(string.Empty); 要避免的做法?