【发布时间】:2015-12-11 20:16:19
【问题描述】:
我有这个代码
global start
section .text
start:
mov rax,0x2000004
mov rdi,1
mov rsi,msg
mov rdx,msg.len
syscall
mov rax,0x2000004
mov rdi,2
mov rsi,msgt
mov rdx,msgt.len
syscall
mov rax,0x2000004
mov rdi,3
mov rsi,msgtn
mov rdx,msgtn.len
syscall
mov rax,0x2000001
mov rdi,0
syscall
section .data
msg: db "This is a string",10
.len: equ $ - msg
var: db 1
msgt: db "output of 1+1: "
.len: equ $ - msgt
msgtn: db 1
.len: equ $ - msg
我想打印变量msgtn。我试过msgt: db "output of 1+1", var
但是 NASM 汇编器失败了:
second.s:35: error: Mach-O 64-bit format does not support 32-bit absolute addresses
我也试过"output of 1+1", [1+1]而不是变量,但我得到了:
second.s:35: error: expression syntax error
我也试过了,没有括号,没有数字,只有字符串“1+1”。
我用来组装我的程序的命令是:
/usr/local/Cellar/nasm/*/bin/nasm -f macho64 second.s && ld -macosx_version_min 10.7.0 second.o second.o
nasm -v 显示:
NASM version 2.11.08 compiled on Nov 27 2015
采用 Intel core i5(x86_64 程序集)的 OS X 10.9.5
【问题讨论】:
-
你能告诉我们你用来组装和链接你的程序的命令吗?知道您使用的是什么版本的 NASM 也很好。 (
nasm -v应该给出版本)。编辑您的问题以提供确切的错误也会有所帮助。 -
首先,我建议不要使用 2.11.08。它有一些令人讨厌的问题(错误)。获取旧版本或更新版本。使用正确版本的 NASM 命令,如
nasm -f macho64 -o second.o second.s和ld second.o -o second应该可以工作。我确实在您的更新中注意到您的链接看起来不寻常。你的输入对象和输出文件都是second.o -
但我认为主要问题是您想将数字打印为字符串。您不能直接使用 sys_write 系统调用来做到这一点。您需要将数字转换为字符串并将该字符串的地址传递给 sys_write。或者,您可以链接到 c 库并使用 printf
-
@MichaelPetch 我编辑了我的问题。我实际上正在使用 2.11.08,因为我今天 brew 安装了它。如果没有 printf,我如何将该数字转换为字符串?
-
一种方法是将一个数连续除以 10(直到被除数为 0),并将每个除法的余数(通过添加 ASCII 字符 '0` 转换为字符)存储到缓冲区相反的顺序。如果你谷歌你应该能够找到这种方法的一些例子。
标签: macos assembly nasm x86-64