基于此tutorial ,我正在尝试将 Hello World
写入 64 位 Linux 的控制台。编译没有引发任何错误,但我在控制台上也没有得到任何文本。我不知道出了什么问题。
写.s:
.data
SYSREAD = 0
SYSWRITE = 1
SYSEXIT = 60
STDOUT = 1
STDIN = 0
EXIT_SUCCESS = 0
message: .ascii "Hello, world!\n"
message_len = .-message
.text
.globl _write
_write:
pushq %rbp
movq %rsp, %rbp
movq $SYSWRITE, %rax
movq $STDOUT, %rdi
movq $message, %rsi
movq $message_len, %rdx
syscall
popq %rbp
ret
main.c:
extern void write(void);
int main (int argc, char **argv)
{
write();
return 0;
}
编译:
as write.s -o write.o
gcc main.c -c -o main.o
gcc main.o write.o -o program
./program
最佳答案
好的,所以我的代码有两个错误:
1) 我将我的 as 函数命名为“write”,这是常见的 c 名称,我需要重命名它。
2) 函数名不能加下划线
正确的代码:
写你好
.data
SYSREAD = 0
SYSWRITE = 1
SYSEXIT = 60
STDOUT = 1
STDIN = 0
EXIT_SUCCESS = 0
message: .ascii "Hello, world!\n"
message_len = .-message
.text
#.global main
#main:
#call write
#movq $SYSEXIT, %rax
#movq $EXIT_SUCCESS, %rdi
#syscall
#********
.global writehello
writehello:
pushq %rbp
movq %rsp, %rbp
movq $SYSWRITE, %rax
movq $STDOUT, %rdi
movq $message, %rsi
movq $message_len, %rdx
syscall
popq %rbp
ret
主.c
extern void writehello(void);
int main (int argc, char **argv)
{
writehello();
return 0;
}
编译保持原样 :) 感谢所有提供帮助的人!
关于c - 混合 C 和汇编。 64 位 Linux 上的 `Hello World`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36606646/