在Mac上使用Assembly

时间:2011-10-21 17:20:53

标签: macos assembly x86

我正在使用配备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

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

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

此外,这只是数字乘以:

.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

和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());
}

最后有三个小问题:

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

  2.   
  3. 为什么程序集需要main.c来配合它/它如何调用它?

  4.   
  5. 任何人都可以推荐一个好的汇编IDE,比如Eclipse用于Java或PHP

  6.   

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

1 个答案:

答案 0 :(得分:8)

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

还有汇编伪指令,它们与CPU指令不对应,而是影响汇编程序或生成的代码。 <{1}}和.data是伪指令。

历史上,每个CPU制造商都实现了一种汇编语言,这种汇编语言由汇编程序(源代码转换实用程序)定义。已经定义了数千种特定的汇编语言。

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

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

AT&amp; T语法是许多汇编语言架构使用的符号样式。一个主要特征是指令操作数按照从,到的顺序编写,这在历史上是常见的。 英特尔语法使用来自操作数。还有其他差异。

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

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