c - 在 C 中调用汇编函数
问题描述
我正在尝试在 C 中调用我用 Nasm 编写的汇编函数。由于某种原因,事情的表现并不像我预期的那样。
NASM:
SECTION .DATA
hello: db 'Hello', 0x0a ; Hello/n
SECTION .TEXT
global sayHello
sayHello:
mov rax, 4 ; write()
mov rbx, 1 ; stdout
mov rcx, hello ; add hello to register
mov rdx, 6 ; length of string
int 0x80 ; interrupt
ret ; return
C:
#include <stdio.h>
extern int sayHello();
int main(int argc, char **argv) {
printf("ASM Function is saying Hello:\n");
sayHello();
return 0;
}
编译:nasm -f elf64 和 gcc
结果:
ASM Function is saying Hello:
预期结果:
ASM Function is saying Hello:
Hello
我错过了什么?
解决方案
您正在 64 位程序中进行 32 位系统调用。
这适用于 Linux,但前提是您的指针适合 32 位!他们可能不会(检查 的地址hello
),否则您可能会得到 EFAULT(因为地址被截断,并且可能指向未映射的内存)。
进行 64 位系统调用
为 64 位 (
rax
,rdi
,rsi
,rdx
)使用正确的寄存器您需要使用 64 位系统调用号(
asm/unistd_64.h
定义__NR_write
1,如果可能,请考虑使用#include
)。使用
syscall
而不是int 0x80
.
推荐阅读
- java - 哪个变量是在`void isInstantiatedWithNew() {new Stack<>();}`中分配新运算符的结果?*(来自 JUnit 5 用户指南示例)*
- hive - 对 hive 和 Metastore 的查询
- angular - HttpClient 等待响应多长时间(Angular)
- angular - 未调用 Angular 单元测试中的事件发射器
- sql - 对索引的 ANALYZE 命令在 PostgreSQL 中返回警告
- symfony - 服务容器的内容无明显差异
- mongodb - 检查 MongoDB 数据库大小的命令
- python - 为什么 NaN 值使 min 和 max 对顺序敏感?
- java - 在 Java 项目中包含 python 包
- python - soup.find() 总是返回 None,beautifullsoup 网页抓取