gpt4 book ai didi

c - 如果我要用汇编编写程序,这个 HelloWorld 汇编代码的哪些部分是必不可少的?

转载 作者:IT王子 更新时间:2023-10-29 00:04:17 26 4
gpt4 key购买 nike

我有这个简短的 hello world 程序:

#include <stdio.h>

static const char* msg = "Hello world";

int main(){
printf("%s\n", msg);
return 0;
}

我用gcc编译成如下汇编代码:

    .file   "hello_world.c"
.section .rodata
.LC0:
.string "Hello world"
.data
.align 4
.type msg, @object
.size msg, 4
msg:
.long .LC0
.text
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
pushl %ebp
.cfi_def_cfa_offset 8
.cfi_offset 5, -8
movl %esp, %ebp
.cfi_def_cfa_register 5
andl $-16, %esp
subl $16, %esp
movl msg, %eax
movl %eax, (%esp)
call puts
movl $0, %eax
leave
.cfi_restore 5
.cfi_def_cfa 4, 4
ret
.cfi_endproc
.LFE0:
.size main, .-main
.ident "GCC: (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4"
.section .note.GNU-stack,"",@progbits

我的问题是:如果我用汇编编写这个程序(而不是用 C 编写然后编译成汇编),那么这段代码的所有部分都是必要的吗?我理解码装说明,但有些部分我不理解。例如,我不知道 .cfi* 是什么,我想知道是否需要包含它才能用汇编语言编写这个程序。

最佳答案

在这个平台上工作的绝对最低限度是

        .globl main
main:
pushl $.LC0
call puts
addl $4, %esp
xorl %eax, %eax
ret
.LC0:
.string "Hello world"

但这打破了一些ABI要求。符合 ABI 的程序的最低要求是

        .globl  main
.type main, @function
main:
subl $24, %esp
pushl $.LC0
call puts
xorl %eax, %eax
addl $28, %esp
ret
.size main, .-main
.section .rodata
.LC0:
.string "Hello world"

目标文件中的所有其他内容要么是编译器没有尽可能紧密地优化代码,要么是要写入目标文件的可选注释。

.cfi_* 指令尤其是可选注释。当且仅当抛出 C++ 异常时函数可能在调用堆栈上时,它们是必需的,但它们在您可能想要从中提取的任何程序中有用堆栈跟踪。如果你打算用汇编语言手工编写重要的代码,那么学习如何编写它们可能是值得的。不幸的是,它们的记录非常少;我目前没有找到任何我认为值得链接的内容。

线

.section    .note.GNU-stack,"",@progbits

了解您是否正在手工编写汇编语言也很重要;它是另一个可选注释,但很有值(value),因为它的意思是“此目标文件中的任何内容都不需要堆栈是可执行的”。如果一个程序中的所有目标文件都有这个注解,内核将不会使堆栈可执行,从而稍微提高安全性。

(为了表明您确实需要堆栈是可执行的,您放置“x”而不是“”。GCC可能会做如果您使用它的“嵌套函数”扩展名,请这样做。(不要那样做。))

可能值得一提的是,在 GCC 和 GNU binutils(默认情况下)使用的“AT&T”汇编语法中,存在三种行:上面有一个标记,以冒号结尾,是一个标签。 (我不记得什么字符可以出现在标签中的规则。)第一个标记以点开头,以冒号结尾的行是对汇编程序的某种指令。其他任何内容都是汇编指令。

关于c - 如果我要用汇编编写程序,这个 HelloWorld 汇编代码的哪些部分是必不可少的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39550402/

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