栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如果要以汇编形式编写程序,此HelloWorld汇编代码的哪些部分必不可少?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如果要以汇编形式编写程序,此HelloWorld汇编代码的哪些部分必不可少?

可以在这个平台上正常工作的绝对最低要求是

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

但这违反了许多ABI要求。符合ABI计划的最低要求是

        .globl  main        .type   main, @functionmain:        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

了解您是否手工编写汇编语言也很重要;它是另一个可选的注释,但是却是一个有价值的注释,因为它的意思是“此目标文件中的任何内容都不需要堆栈是可执行的”。如果程序中的所有目标文件都具有此批注,则内核将使堆栈无法执行,从而在某种程度上提高了安全性。

(为了表明您 确实 需要堆栈是可执行的,请放置

"x"
而不是
""
。如果您使用其“嵌套功能”扩展名,则GCC可以这样做。(不要这样做。)

可能值得一提的是,在GCC和GNU binutils使用的“
AT&T”汇编语法(默认情况下)中,存在三种类型的行:在其上带有单个标记并以冒号结尾的行是标签。(我不记得在标签中可以显示哪些字符的规则。) 第一条
标记以点开头但 以冒号结尾的行是对汇编程序的某种指令。其他都是汇编指令。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/380303.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号