gpt4 book ai didi

assembly - 我正在 OS X 10.6 上学习 x86 汇编,我该如何编译?

转载 作者:行者123 更新时间:2023-12-04 22:52:22 37 4
gpt4 key购买 nike

我即将在 Mac OS X 上学习 x86 汇编语言。
我正在使用 as 指令在推荐窗口中编译程序集文件。
但是我有几个错误,我不知道如何解决。

这是错误和我的汇编代码,非常简单。

**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,我宁愿用推荐窗口和 vi 编辑器来做这件事。

最佳答案

您的代码是 32 位程序集。在 Snow Leopard 上编译默认是 64 位的,但你可以使用 gcc -m32用于编译 32 位代码。当然也有选项可以传递给 asld但我发现只记得 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 相同的结果。

关于assembly - 我正在 OS X 10.6 上学习 x86 汇编,我该如何编译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2752570/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com