gpt4 book ai didi

c - 在 Assembly 中打印字符串,在 C 中调用该函数

转载 作者:太空宇宙 更新时间:2023-11-04 03:35:50 25 4
gpt4 key购买 nike

<分区>

全部。我正在尝试使用 NASM 进行编程,我还想学习如何在 C 中调用这些函数。我相当确定我目前拥有的代码是正确的,因为我需要设置一个堆栈框架,然后在我从例程返回之前撤消该堆栈帧。我也知道我需要返回一个零以确保没有错误。我也在使用 debian linux,以防我需要针对我的操作系统进行调整。

代码:

global hello

section .data
message: db "Hello, world!",0 ; A C string needs the null terminator.

section .text
hello:
push rbp ; C calling convention demands that a
mov rbp,rsp ; stack frame be set up like so.

;THIS IS WHERE THE MAGIC (DOESN'T) HAPPEN

pop rbp ; Restore the stack
mov rax,0 ; normal, no error, return value
ret ; return

我觉得好像我应该指出我问这个是因为我发现的所有程序都对 printf 进行了外部调用。我不想这样做,我真的很想学习如何在 assembly 中打印东西。所以我想我的问题是:NASM 中 C 函数的调用约定是什么?如何在 NASM 64 位程序集中打印字符串?

另外,为了确保我的这一部分是正确的,这是在 C 中调用汇编函数的正确方法吗?

#include <stdio.h>

int main() {
hello();
return 0;
}

编辑:好的,我能够解决这个问题。这是汇编代码。我使用 nasm -f elf64 -l hello.lst hello.asm && gcc -o hello hello.c 组装了 .asm 文件和 .c 文件你好.o

section .text
global hello

hello:
push rbp ; C calling convention demands that a
mov rbp,rsp ; stack frame be set up like so.
mov rdx,len ; Message length
mov rcx,message ; Message to be written
mov rax,4 ; System call number (sys_write)
int 0x80 ; Call kernel

pop rbp ; Restore the stack
mov rax,0 ; normal, no error, return value
ret

section .data
message: db "Hello, world!",0xa ; 0xa represents the newline char.
len: equ $ - message

相关的 C 代码 (hello.c) 如下所示:

int main(int argc, char **argv) {
hello();
return 0;
}

一些解释包括缺少 #include,因为 I/O 在程序集文件中完成。另一件我需要看到才能相信的事情是,所有工作都不是在汇编中完成的,因为我没有 _start 标识符或任何所谓的标识符。绝对需要了解更多关于系统调用的知识。非常感谢所有为我指明正确方向的人。

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com