初识汇编(csapp 第二版)

汇编语言其实处于高级语言和机器语言中间。机器语言虽然编写出来的程序执行效率非常高,但是一串01010101真的太难看了。

汇编语言的作用就是改善机器的可读性,用一些符号来将cpu的各种资源符号化,简单来说就是更容易阅读和编写啦。

汇编语言是面向处理器的,它操作的对象是寄存器或者是存储器,所以说速度也挺快,但是相对应的也变得复杂,不直观。

picture1

AT&T的汇编语言格式如下,可能需要一些时间习惯一下。


(ppt来自湖南大学黄丽达老师讲授的计算机系统)

picture2


(ppt来自湖南大学黄丽达老师讲授的计算机系统)

我们了解到,mov指令后面有三种后缀,l,w和b,这意味着要移动的数据是多少位的。

picture3


(ppt来自湖南大学黄丽达老师讲授的计算机系统)

movl $0x405,%eax这一条的意思是,直接把十六进制数据0x405移入到eax寄存器中(联想:我们的x86机器里面有8个32位的寄存器,%exa是第一个寄存器。但是我们这里注意到,0x456是一个3*4=12bit数据,所以说它前面要补0

 

其实这里值得说明的是,一开始我并不认为$0x405指的是十六进制的0x405,而是我认为要移动内存里面地址为0x405的存储单元里面的值到%eax里面。但是后来和老师交流发现,如果要实现我所说的,那么就应该不加任何符号,就是直接的0x405。因为$后面加的数据,就认为是一个直接数了。

 

movw %ax,%bx这里的意思是,把寄存器%ax里面的单字节数据移入到寄存器%bx里。这里需要回顾一下,我们之前说了x86机器里面有8个寄存器,名字分别为%eax,%ecx,%edx,%ebx,%esi,%edi,%esp,%ebp。在这里每个寄存器的内部又会有一些小的部分。以%eax举例,它是32位的,低16位城为%ax。在%ax里面,高8位称为%ah,低八位称为%al)

 

movb $-17,(%esp)

这里的意思是把单字节数据-17移动到寄存器esp里面存储的地址所对应的内存单元里。

在这里(%esp)和之前%esp相比,多了一个括号,这是说我们的数据并不是简单的移动到寄存器%esp里了!!%esp寄存器里面存的地址对应的内存单元才是我们要去的地方~!

 

picture4(csapp 113)


这里介绍了一些寻址的方式,其实我们直接关注最后一条就可以,因为最后一条是普遍适用的。这里有一些不是那么自然的对于我来说。例如

(csapp113)


*这里的括号外面不是一个系数噢,而是一个“偏移量“,直接加加减减的。

*比例系数是和挨他最近的一个寄存器值相乘

 

picture5


(ppt来自湖南大学黄丽达老师讲授的计算机系统)

解读一下这道题

260(%edx,%ecx)指的是我们要取的值,位于260+%edx对应的值+%ecx对应的地址的内存单元内。

根据右边的图,我们看出了,%edx存储的值为0x3,%ecx存储的值为0x1,0x1+0x3=0x4,0x4+260这里涉及到了进制转换

260=0x104,0x104+0x4=0x108,在内存地址为0x104的内存单元中,存储了0x13。

 

picture6


(ppt来自湖南大学黄丽达老师讲授的计算机系统)

在这里

0xF4(,%edx,4)指的是我们要取的值,内存地址为0xF4+%edx*4的内存单元中。

根据右边的图,我们看出了,%edx存储的值为0x3, 0x3*4=0xc,0xc+0xF4这里涉及到了进位,c+4=16进1,F+1=16进1,所以等于0x100,在内存地址为0x100的内存单元中,存储了0xFF。

 

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页