【发布时间】:2016-04-13 18:28:41
【问题描述】:
基于此tutorial,我正在尝试将Hello World 写入64 位Linux 上的控制台。编译不会引发任何错误,但我在控制台上也没有收到任何文本。不知道怎么回事。
write.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
【问题讨论】:
-
正如我在您之前提交的内容中提到的,
write是“C”中的保留字。重命名您的函数,然后重试。 -
更正:它不是保留字,但它是“C”程序常用的函数,可能在调用本地函数之前与您的程序链接。我的建议成立。
-
避免冲突 - 将其命名为 _writeStr 而不是 _write
-
重命名为'writehello'。我现在有:未定义的对“writehello”的引用。看起来,就像从 C 中看不到汇编函数一样:/
-
好的,我明白了!在我的情况下,函数名中不能有下划线......你是对的命名!我会“+”你的 cmets 并添加一个答案!谢谢!
标签: c assembly x86-64 gnu-assembler