Featured image of post 汇编语言浅谈

汇编语言浅谈

汇编语言浅谈

[toc]

img

有时候我还是会好奇,c++编译器是用c编写的,python也是用c编写的(我说的是Cpython!)那么,c语言的编译器是用什么编写的呢?

然后东查西查,就有了这篇文章。

1.汇编语言是用什么写的呢?(禁止套娃

由上图可看出,汇编语言$Assembly$​ $Language$​ $(asm)$​下面一层就是机器语言$Machine$​ $Language$​,所以,汇编语言是二进制指令的文本形式,比如00000011用汇编就是add,CPU在编译汇编语言时就只需将其转换为机器码便可以使用,这一步,叫做$assembling$​​​​.

2.汇编语言是怎么来的呢?

最早的时候,程序员是靠在纸带上打孔来输入指令(图灵机既视感),但是考虑到二进制的不可读性,工程师将指令改为了八进制,但是还是不方便,就改成了汇编.

3.寄存器

1.寄存器的定义

CPU除了一级缓存,二级缓存($cache$​)之外,还有寄存器($register$),用来存放那些读写最频繁的数据(如循环变量)。

img

2.寄存器的种类

早期x86 CPU只有八个寄存器,名字分别是EAX,EBX,ECX,EDX,EDI,ESI,EBP,ESP,虽然现在寄存器数量增加到100多个,但是名字没有变化。

我们常见的32位,64位CPU,就是寄存器的大小。

4.内存模型

只靠寄存器是不够放下你打游戏时占用几个G的内存的,大多数时候,CPU要让寄存器直接跟内存交换数据.

当一个程序开始运行时,OS会给它分配一段内存,用来存储运行产生的数据。

用户主动请求而划分出的内存叫做Heap,不会自动消失,必须手动释放。

程序自己运行占用的区域叫做Stack,随着该帧运行结束而消失,所以Stack空了之后程序就结束了.

5.高级语言的汇编

这里举一个例子

test1.cpp

1
2
3
4
5
6
7
8
9
int add(int a,int b){
    return a+b;
}
int minus(int a,int b){
    return add(a,-b);
}
int main(){
	return minus(1,10);
}

保存并运行以下指令

1
g++ -S test.cpp

g++会在当前目录下生成一个test1.s文件,包含了汇编语言(我这里是x86_64的,和x86生成的可能不一样),简化后就是

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
add:
	movl	%ecx, 16(%rbp)
	movl	%edx, 24(%rbp)
	movl	16(%rbp), %edx
	movl	24(%rbp), %eax
	addl	%edx, %eax
	popq	%rbp
	ret
minus:
	movl	%ecx, 16(%rbp)
	movl	%edx, 24(%rbp)
	movl	24(%rbp), %eax
	negl	%eax
	movl	%eax, %edx
	movl	16(%rbp), %ecx
	call	add
	addq	$32, %rsp
	popq	%rbp
	ret
main:
	movl	$10, %edx
	movl	$1, %ecx
	call	minus
	addq	$32, %rsp
	popq	%rbp
	ret

main开始

Step 1movl $10, %edx,将10移入到寄存器%edx中。

Step 2movl $1, %ecx,将1移入寄存器%ecx中。

Step 3call minus,调用函数minus

​ 第一步,将%ecx中的数移入16(%rbp)中,%edx中的数移入24(%rbp)中。

​ 第二步,将24(%rbp)中的数移出到%eax

​ 第三步,将%eax中的数取负

​ 第四步,将%eax放入%edx中。

​ 第五步,将16(%rbp)中的数放回%ecx中。(好麻烦有没有

​ 第六步,调用add

​ 第1-4步,将%ecx,%edx中的数放到%edx,%eax中。

​ 第五步,调用addl,%edx=%edx+%eax.

​ 下一步,popq %rbp释放%rbq

​ 最后一步,返回上级函数

​ 第七步,将返回的值加入返回%rsp

​ 第八步,释放零时变量

​ 第九步,返回

Step 4addq $32, %rsp将返回的值加入%rsp中,

Step 5popq %rbp,

Step6 返回.

6.参考资料

汇编语言入门教程

Licensed under CC BY-NC-SA 4.0
所念皆星河
Built with Hugo
主题 StackJimmy 设计

提供全站CDN服务