提问人:axolotlKing0722 提问时间:10/27/2023 最后编辑:CherryDTaxolotlKing0722 更新时间:10/27/2023 访问量:34
为什么组装的文件这么大?
Why are as-assembled files so big?
问:
我对汇编和低级编码很陌生,但我在 Google 上找不到任何有价值的东西,所以也许有人可以解释为什么一个简单的 Hello World ARM64 脚本在我的 Mac 上需要 17KB。
我正在使用 Apple Mac Mini M1,并开始在 OS-Dev 教程中学习一些组装。在那里,使用了 NASM x86 汇编,它非常简单,代码只是用普通的 NASM 编译的,没有任何交叉编译器的东西。本教程从一个使用 BIOS 中断的 Hello World 程序开始,输出文件非常小,基本上汇编指令表示为字节,就像您期望的那样。
现在,我尝试在我的 Mac 上使用汇编进行编码,在网络的黑暗中找到一些关于 ARM64 和 M1 汇编的有用说明后,我编写了您在下面看到的 hello world 程序。我用命令编译了它,输出文件很奇怪。as
它包含一些字符串,如 ,以及程序集源代码中断点的名称。它们的用途是什么?为什么NASM编译的程序不需要它?仅仅将参数移动到寄存器中并调用0x80中断还不够吗?__TEXT
ltmp0
但这甚至不是最终的输出文件,它是目标代码,所以我不得不链接它,最终程序(真正打印“Hello World!”到我的终端)的大小高达17KB。仅用于设置 、 和 、 、 调用中断并存储 Hello World 字符串。那东西是干什么用的?为什么大约 15KB 的文件由 0x00 字节组成?ax
bx
cx
dx
__mh_execute_header
__unwind_info
/usr/lib/libSystem.B.dylib
我知道有些东西取决于我的操作系统和系统库或其他什么,但我的 MacOS 真的需要所有 17KB 和字符串才能将“Hello World!”打印到终端吗?为什么在 x86 linux 上也做这些疯狂的事情,而 macOS 和 Linux 上的 nasm 只提供简单的代码?这真的是我的代码运行所必需的,还是有什么方法可以避免它?as
感谢您的回答!
ARM 汇编代码:
.global _main
.align 2
_main:
mov X0, #1
adr X1, hello
mov X2, #13
mov X16, #4
svc #0x80
mov X16, #1
mov X0, #0
svc #0x80
hello: .ascii "Hello World!\n"
答: 暂无答案
评论