花了半个多月,补完王爽老师的汇编语言后,跟着CMU的视频课+课本,学完了第三章的知识,最深的感触就是CSAPP无论是视频还是书的质量都非常的硬,不愧它的盛名。(lab6和课后的家庭作业还没做,之后再补)
现在来对前面所学做一个总结。(大致按照CMU视频的顺序进行)
一、Basics 基础
1.使用指令新建、编辑、汇编、链接汇编语言程序
①新建并编辑源代码
命令:getdit sum.c
说明:gedit是一个GNOME桌面环境下兼容UTF-8的文本编辑器。使用vi或者vim同样可以实现新建与编辑。
②预处理【sum.c -> sum.i】
命令:gcc -E sum.c -o sum.i 【sum.c -> sum.i】
说明:预处理时,编译器会将C源代码中包含的的头文件编译进来
③编译 【sum.i -> sum.s】
命令:gcc -S sum.i -o sum.s
说明:gcc首先检查代码的规范性,是否有语法错误,确定代码实际要做的工作,让后将代码翻译成汇编语言
④汇编【sum.s -> sum.o】
命令:gcc -c sum.s -o sum.o
说明:gcc进行汇编阶段,将编译阶段生成的”.s”文件转成二进制目标代码(可重定位目标文件)
⑤链接【sum.o -> sum】
命令:gcc sum.o -o sum
说明:链接过程将有关的目标文件彼此连接起来,使得所有目标文件成为一个能够执行的统一整体。
⑥执行
命令:./sum
说明:执行可执行文件,输出结果
2.数据格式
b(byte):字节
w(word):1字=2字节
l(double words):双字=4字节
q(quad words):四字=8字节
对应的mov指令为:
movb movw movl movq
al:1字节
ax:2字节
eax:4字节
rax:8字节
3.数据传送
传内存数据的格式:
传地址的格式:
扩展:
扩展分为零扩展和符号扩展,若要扩展后保持相同的数,对于有符号数,符号扩展(即高位补原来的最高位)可以保证扩展前后相同,对于无符号数,零扩展可以保证扩展前后相同。指令,以字节->字为例,其他同样格式。
零扩展:movzbw dl,ax
符号扩展:movsbw dl,ax
另,符号扩展多一个cltq指令,表示将%(eax)符号扩展->rax
另,当给32位寄存器赋值时,总会将高位自动改为0
4.寄存器作用
0-63 | 0-31 | 0-15 | 8-15 | 0-7 | 使用惯例 |
---|---|---|---|---|---|
%rax | %eax | %ax | %ah | %al | 保存返回值 |
%rbx | %ebx | %bx | %bh | %bl | 被调用者保存 |
%rcx |
%ecx | %cx | %ch | %cl | 第4个参数 |
%rdx |
%edx | %dx | %dh | %dl | 第3个参数 |
%rsi |
%esi | %si | 无 | %sil | 第2个参数 |
%rdi |
%edi | %di | 无 | %dil | 第1个参数 |
%rbp | %ebp | %bp | 无 | %b |