我即将在Mac OS X上学习x86汇编语言。 我正在使用指令在commend窗口中编译汇编文件。 但我有几个错误,我不知道如何通过。
以下是错误和汇编代码,非常简单。
**ung-mi-lims-macbook-pro:pa2 ungmi$ as swap.s
swap.s:16:Unknown pseudo-op: .type
swap.s:16:Rest of line ignored. 1st junk character valued 115 (s).
swap.s:19:suffix or operands invalid for `push'
swap.s:46:suffix or operands invalid for `pop'
ung-mi-lims-macbook-pro:pa2 ungmi$**
,来源是
.text
.align 4
.globl swap
.type swap,@function
swap:
pushl %ebp
movl %esp, %ebp
movl %ebp, %esp
popl %ebp
ret
我搜索了一些解决方案,我必须将-arch i386放在
之上**ung-mi-lims-macbook-pro:pa2 ungmi$ as -arch i386 swap.s
swap.s:16:Unknown pseudo-op: .type
swap.s:16:Rest of line ignored. 1st junk character valued 115 (s).
ung-mi-lims-macbook-pro:pa2 ungmi$**
你可以帮帮我吗?只是让我知道编译汇编文件需要什么。
我已经有了XCode,我宁愿用commend window和vi editor来做这个。
答案 0 :(得分:6)
您的代码是32位程序集。 Snow Leopard上的编译默认为64位,但您可以使用gcc -m32
来编译32位代码。当然还有一些选项可以传递给as
和ld
,但我发现仅记住gcc
的选项就足够了,因为它是所有这些事情的前端
使用gcc向您展示一个有效的汇编代码示例:在文件test.c中键入一个最小C函数,并使用gcc -S test.c
在文件test.s中生成汇编。
示例:
int x;
void f(void)
{
int i;
for (i = 0; i < 5; i++) x = x + 1;
}
在Leopard Mac上汇编编译:
.text
.globl _f
_f:
pushl %ebp
movl %esp, %ebp
subl $24, %esp
call L6
"L00000000001$pb":
L6:
popl %ecx
movl $0, -12(%ebp)
jmp L2
L3:
leal L_x$non_lazy_ptr-"L00000000001$pb"(%ecx), %eax
movl (%eax), %eax
movl (%eax), %eax
leal 1(%eax), %edx
leal L_x$non_lazy_ptr-"L00000000001$pb"(%ecx), %eax
movl (%eax), %eax
movl %edx, (%eax)
leal -12(%ebp), %eax
incl (%eax)
L2:
cmpl $4, -12(%ebp)
jle L3
leave
ret
.comm _x,4,2
.section __IMPORT,__pointers,non_lazy_symbol_pointers
L_x$non_lazy_ptr:
.indirect_symbol _x
.long 0
.subsections_via_symbols
您可以使用gcc选项-fno-PIC:
使其更简单 .text
.globl _f
_f:
pushl %ebp
movl %esp, %ebp
subl $24, %esp
movl $0, -12(%ebp)
jmp L2
L3:
movl _x, %eax
incl %eax
movl %eax, _x
leal -12(%ebp), %eax
incl (%eax)
L2:
cmpl $4, -12(%ebp)
jle L3
leave
ret
.comm _x,4,2
.subsections_via_symbols
在Snow Leopard上,您将获得64位程序集(amd64)。你可以使用-m64 gcc选项在Leopard上获得同样的东西,你可以在Snow Leopard上使用-m32选项在Leopard上运行gcc。
答案 1 :(得分:2)
使用GCC,它会为您编译和链接:cc swap.s
答案 2 :(得分:2)
Apple的as
是从binutils 1.38分叉的,而当前的版本是2.20,因此可能有许多新的指令不可用。我找不到1.38的手册,但oldest one (2.10) I could find表示.type
只与COFF格式输出相关联。 Mac上的对象格式是Mach-O,因此.type
指令毫无意义。只需删除它。
答案 3 :(得分:0)
最近我尝试在Mac OS X上编译Intel x86时遇到了这个问题:
-o hello.tmp - outfile
-f macho - specify format
Linux - elf or elf64
Mac OSX - macho
-arch i386 - specify architecture (32 bit assembly)
-macosx_version_min 10.6 (Mac OSX - complains about default specification)
-no_pie (Mac OSX - removes ld warning)
-e main - specify main symbol name (Mac OSX - default is start)
-o hello.o - outfile
./hello.o - execution
nasm -o hello.tmp -f macho hello.s && ld -arch i386 -macosx_version_min 10.6 -no_pie -e _main -o hello.o hello.tmp && ./hello.o
请告诉我这是否有帮助!
我在博客上写了如何做到这一点:
http://blog.burrowsapps.com/2013/07/how-to-compile-helloworld-in-intel-x86.html
有关更详细的解释,我在Github上解释说: