以下汇编代码as在OSX 10.9.4上运行时出错,但在Linux(Debian 7.6)上成功运行.特别是,movq指令似乎不喜欢label参数.
$ cat test.S
.globl _main
_main:
movq $_main, %rax
ret
Run Code Online (Sandbox Code Playgroud)
这是错误:
$ as -o test.o test.S
test.S:3:32-bit absolute addressing is not supported for x86-64
test.S:3:cannot do signed 4 byte relocation
Run Code Online (Sandbox Code Playgroud)
将$_main第3行更改为文字$10就好了.
代码必须以非常小的方式进行修改才能在Linux上运行 - 只需从标签中删除下划线即可.
$ cat test.S
.globl main
main:
movq $main, %rax
ret
Run Code Online (Sandbox Code Playgroud)
很容易独立验证代码在Linux上是否可行:
$ as -o test.o test.S
$ gcc -o test.out test.o
$ ./test.out
Run Code Online (Sandbox Code Playgroud)
请忽略代码并没有真正做很多事情,我故意尽可能地将其修剪下来以证明错误.
我已经看了很多使用LEA(加载有效地址),但在我做出改变之前,我想了解其中的区别 - 为什么它适用于Linux而不是OSX?
我用 AT&T 语法编写了一小段程序集,目前在该.data部分中声明了三个变量。但是,当我尝试将这些变量中的任何一个移动到寄存器时,例如%eax,gcc就会引发错误。代码和错误信息如下:
.data
x:.int 14
y:.int 4
str: .string "some string\n"
.globl _main
_main:
pushq %rbp
movq %rsp, %rbp
subq $16, %rsp
movl x, %eax; #attempting to move the value of x to %eax;
leave
ret
Run Code Online (Sandbox Code Playgroud)
引发的错误是:
call_function.s:14:3: 错误:64 位模式不支持 32 位绝对寻址
movl x, %eax;
^
我还尝试通过首先$在 前面添加字符来移动值x,但是,clang引发了错误:
clang:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)
有谁知道如何x成功地将存储的值移动到%eax?我在 Mac OSX 上使用 x86 程序集并使用gcc.