我即将在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$**
Run Code Online (Sandbox Code Playgroud)
而来源是
.text
.align 4
.globl swap
.type swap,@function
swap:
pushl %ebp
movl %esp, %ebp
movl %ebp, %esp
popl %ebp
ret
Run Code Online (Sandbox Code Playgroud)
我搜索了一些解决方案,这是我必须把 - 比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$**
Run Code Online (Sandbox Code Playgroud)
你能救我吗?只是让我知道编译汇编文件需要什么.我已经有了XCode,我宁愿用commend window和vi编辑器来做这件事.
您的代码是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;
}
Run Code Online (Sandbox Code Playgroud)
在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
Run Code Online (Sandbox Code Playgroud)
您可以使用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
Run Code Online (Sandbox Code Playgroud)
在Snow Leopard上你将获得64位汇编(amd64).您可以使用-m64 gcc选项在Leopard上获得相同的功能,并且您可以使用-m32选项在Leopard上运行gcc时使用Snow Leopard.