我正在使用配备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());
}
最后有三个小问题:
.s
和.h
文件名之间有什么区别(我有main.c
和main.h
,哪一个是为了什么)?为什么程序集需要
main.c
来配合它/它如何调用它?- 醇>
任何人都可以推荐一个好的汇编IDE,比如Eclipse用于Java或PHP
感谢任何回答(这实际上是我在这个网站上发表的第一篇文章),我一直试图解决这个问题几天,我读过的每一个资源都没有向我解释汇编逻辑。它说.data
或.text
做了什么,但只有知道如何“思考集会”的人会理解他们的意思?
此外,如果有人在纽约市附近并且对Assembly和C感到非常舒服,我会喜欢一些私人课程。我觉得这种语言有很大的潜力,并且很乐意学习它。
答案 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小时。祝你好运!