在Mac上使用Assembly

Air*_*lla 7 macos x86 assembly

我正在使用配备2.53 GHz英特尔酷睿2双核处理器的MacBook Pro,但我被告知Mac用户必须遵循AT&T语法(这使我在运行英特尔时感到困惑)和x86(不确定这意味着什么) .

所以我需要进入组装,但我发现很难开始.在线搜索显示汇编代码在语法上有很大差异,我找不到任何解释基本汇编方法的资源.我一直在阅读关于寄存器和堆栈的内容,但不明白如何看待它.谁能解释/指出我正确的方向?举个例子,这个代码是我发现的唯一代码:

.data
_mystring:  .ascii "Hello World\n\0"    #C expects strings to terminate with a 0.
.text
    .globl _foo
_foo:
push    %ebp
    mov %esp,%ebp
    pushl   $_mystring  
    call    _myprint
    add $4,%esp
    pop %ebp
    ret
Run Code Online (Sandbox Code Playgroud)

很简单,但它是什么意思?我有一个令人困惑的时间来理解这段代码是如何完成它的.我知道Java,PHP和C,以及其他语言,但是这个,它的步骤和语法,对我来说并不清楚.这是它的主要文件:

#include <stdio.h>
void foo();
void myprint(char *s)
{printf("%s", s);}
 main()
{foo();}
Run Code Online (Sandbox Code Playgroud)

还有,这只是数字乘以:

.data
    .globl _cntr
_cntr:  .long 0
    .globl _prod
_prod:  .long 0
    .globl _x
_x: .long 0
    .globl _y
_y: .long 0
    .globl _mask
_mask:  .long 1
    .globl _multiply
multiply:
    push %ebp
    mov %ebp,%esp
    mov $0,%eax
    mov _x,%ebx
    mov _y,%edx
LOOP:
    cmp $0,%ebx
    je DONE
    mov %ebx,%ecx
    and $1,%ecx
    cmp $1,%ecx
    jne LOOPC
    add %edx,%eax
LOOPC:
    shr $1,%ebx
    shl $1,%edx
    jmp LOOP
DONE:
    pop %ebp
    ret
Run Code Online (Sandbox Code Playgroud)

和main.c一起去:

#include <stdio.h>

extern int multiply();
extern int x, y;

int main()
{
    x = 34;
    y = 47;
    printf("%d * %d = %d\n", x, y, multiply());
}
Run Code Online (Sandbox Code Playgroud)

最后三个小问题:

  1. .s.h文件名有什么区别(我有一个main.cmain.h哪一个,哪一个是为了什么)?

  2. 为什么装配需要main.c配合它/它如何称之为?

  3. 任何人都可以推荐一个像Eclipse一样好的汇编IDE用于Java或PHP

感谢任何回答(这实际上是我在这个网站上发表的第一篇文章),我一直试图解决这个问题几天,我读过的每一个资源都没有向我解释汇编逻辑.它说什么.data.text做什么,但只有知道如何"思考集会"的人会理解他们的意思?此外,如果有人在纽约市附近,并感到很满意大会和CI会喜欢一些私人课程.我觉得这种语言有很大的潜力,并且很乐意学习它.

wal*_*lyk 8

汇编语言是一种与CPU架构紧密相关的编程语言.传统上,每个汇编指令与生成的CPU指令之间存在一对一的对应关系.

还有汇编伪指令,它们与CPU指令不对应,而是影响汇编器或生成的代码. .data并且.text是伪指令.

从历史上看,每个CPU制造商都实现了汇编程序定义的汇编语言,汇编程序是源代码转换实用程序.已经定义了数千种特定汇编语言.

在现代,已经认识到每种汇编语言共享许多共同特征,特别是关于伪指令.GNU编译器集合(GCC)基本上支持每个CPU架构,因此它已经发展了通用的汇编功能.

x86 是指英特尔8086系列(8088,8086,8087,80186,80286,80386,80486,80586又名奔腾,80686又名奔腾II等)

AT&T语法是许多汇编语言体系结构使用的符号样式.一个主要特征是指令操作数按照历史上常见的顺序写入. Intel语法使用到,从操作数.还有其他差异.

至于你的许多问题,这里有一些资源会让你不堪重负,2)最终提供你所有的答案:

通常,入门汇编语言编程课程是一个完整的学期,有大量的实践工作.它假设您熟悉计算机体系结构的基础知识.有理由期望理解上述材料需要300-500小时.祝好运!