在Mac上执行程序集文件

时间:2014-05-01 10:37:58

标签: assembly

(顺便说一句,我正在使用Mac)

所以我刚开始学习汇编,我尝试了以下程序:

section .text
global _start

_start:

mov edx, len
mov ecx, msg
mov ebx, 1
mov eax, 4
int 0x80

mov eax, 1
int 0x80

section .data

msg db  'Hello, world!',0xa
len equ $ - msg

我尝试在终端中运行它:

gcc -o sieve sieve.s

但这给了我这些错误:

sieve.s:1:no such instruction: `section .text'
sieve.s:2:no such instruction: `global _start'
sieve.s:6:too many memory references for `mov'
sieve.s:7:too many memory references for `mov'
sieve.s:8:too many memory references for `mov'
sieve.s:9:too many memory references for `mov'
sieve.s:10:suffix or operands invalid for `int'
sieve.s:12:too many memory references for `mov'
sieve.s:13:suffix or operands invalid for `int'
sieve.s:15:no such instruction: `section .data'
sieve.s:17:no such instruction: `msg db (72)ello,world!(44)0xa'
sieve.s:18:no such instruction: `len equ $-msg'

我猜这与使用汇编语言的错误版本或其他东西有关,但我对语言知之甚少,所以我没有任何线索。有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

除了Brett Hale提供的提示(AT& T语法)之外,你还有第二个问题:

每个操作系统都有其他调用操作系统功能的机制。

使用寄存器中的参数中断“int 0x80”是在32位Linux中调用操作系统函数的方式。即使是64位Linux也使用不同的方法。

将程序转换为AT& T语法后(据我所知,当使用额外的代码行时,新的GCC变体甚至允许使用Intel语法),您的程序将无法在MacOS上运行,因为MacOS使用的机制与“int 0x80不同” “用于Linux。