c - 混合 C 和汇编。 64 位 Linux 上的 `Hello World`

标签 c assembly x86-64 gnu-assembler

基于此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

ma​​in.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/

相关文章:

c++ - 以十六进制修改 exe 后推送指令中的地址发生变化

assembly - C64 程序集 - 6502/6510 - 依次显示一系列三个位图,然后进入字符模式

c - 切换小程序不让我输入选项

c++ - 如何编写与此汇编代码相同的 C/C++ 代码?

c - 在多维数组中,为什么取消引用一行的地址再次导致地址而不是值

c - VS2017 编译器为除法/余数对发出 2 个除法指令

c - 如何将结构从 Mac 上的 x86-64 程序集传递给 C 函数 (NASM)

c - sarq 和 shrq 的区别

c - 这些类型 (int (*ptr)[3]) = a; (其中 a => int a[][3] = {1,2,3,4,5,6})的语句在 C 中有效吗?增量 "ptr"给出了意外的结果

c++ - 检查 union 实例之间相等性的正确方法是什么?