【发布时间】:2016-12-30 22:50:44
【问题描述】:
我正在尝试编写一个 hello world 程序,但它不起作用 - 为什么?
.data
str:
.ascii "Hello World\12\0"
.text
.globl main
.extern printf
main:
pushq %rbp
movq %rsp,%rbp
movq str,%rdi
callq printf
movq %rbp,%rsp
popq %rbp
ret
【问题讨论】:
-
你应该使用
movabsq $str, %rdi来加载地址。您所做的是加载字符串的前 8 个字节,然后可怜的printf试图用作地址并出现故障。此外,您需要在call之前将%al归零。 -
@Jester
mov $str,%rdi就足够了,因为 ABI 将数据和代码放在地址空间的前 2 GB 内。 -
@fuz:
mov $str, %edi当然更好,因为 GNUas没有将 7 字节符号扩展的 mov-immediate 优化为 5 字节的零扩展 mov-立即。 -
要格式化代码,不要使用
<code>,选择代码并在编辑器中按下{}按钮。 -
确保您最初遵循目标平台的课程信息/教程 + 汇编器语法(在这种情况下,即 gas + 64b clib)。并且气体语法在 IMO 中对于人类来说比 Intel 语法更难读/写,所以你必须特别注意所有那些奇怪的符号,比如
$是否领先于数字,使其完全不同的指令.一旦您对基础知识有所熟悉并完全了解指令在 CPU 中的工作原理,您就可以轻松地选择不同的语法/平台示例来获得灵感,但最初它们只会让您感到困惑。
标签: assembly x86-64 gnu-assembler