(顺便说一句,我正在使用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'
我猜这与使用汇编语言的错误版本或其他东西有关,但我对语言知之甚少,所以我没有任何线索。有人可以帮忙吗?
答案 0 :(得分:0)
除了Brett Hale提供的提示(AT& T语法)之外,你还有第二个问题:
每个操作系统都有其他调用操作系统功能的机制。
使用寄存器中的参数中断“int 0x80”是在32位Linux中调用操作系统函数的方式。即使是64位Linux也使用不同的方法。
将程序转换为AT& T语法后(据我所知,当使用额外的代码行时,新的GCC变体甚至允许使用Intel语法),您的程序将无法在MacOS上运行,因为MacOS使用的机制与“int 0x80不同” “用于Linux。