呼呼。。。。。。最近终于稍微空闲一点点了
赶紧总结一下上个星期学的一些知识。
(下面这些ppt都是来自湖南大学的黄立达老师教授的计算机系统课程)
1、扩展位数传递
他主要分为了两种扩展,0扩展和符号扩展
这三个图还是相当清晰和直观的。
这里可能有点问题的是后缀的问题
例如最后一张图的movsbl %dh,%eax
这里s代表了符号扩展
b代表了移动%dh里面的高八位,也就是一个字节byte
l代表了移动过去的%eax是double word,一个word两个字节,double word就是4个字节。8个位一个字节也就是32位,%eax刚好是32位寄存器。
2、lea指令,其实简单的来说就是mov指令的一种变形,直接传址而不是值
正如这张ppt里面所提及的,我们leaq 8(%edi),%eax(q后缀表示传64位)
也就是说我们把%edi里面的值+8直接传给%eax寄存器
而movq8(%edi),%eax说的是
把内存里地址对应了%edi里面的值+8的存储单元的值传递给%eax。
这相当于什么呢?
lea相当于从你同学里拿了块小饼干给了另外一个同学
mov相当于从你同学根据那块小饼干的地址把整个生产小饼干的厂子给了你另外一个同学
嗯,就是这样((⊙ˍ⊙)似乎有点夸张)
lea指令其实用来做一些简单的算术运算。
在这里leal 7(%edx,%edx,4),%eax就是相当于
把寄存器%edx的值*4加%edx的值,也就是5*%edx的值传递给%eax寄存器。
这样子就可以进行将某个数据*5的这样子的运算。
3、objdump
指令分为相关指令和不相关指令
因为编译器很聪明,通常会以最优化的方式来把我们的高级语言改变语序,优化、转化为新的汇编代码
交换顺序目的:流水、并发、移值和取值同时进行
指令交换顺序不影响值称为不相关指令,否则称为相关指令。
一般而言,移位操作用来做乘法以及除法。
上面是一些我们熟悉的操作
在这里,首先我们计算一下,4*%edx+%eax等于多少,等于0x10c,然后我们通过16*0x11等于0x110,然后存入0x10c地址单元内,答案也就是D啦
这里比较困难的是,16(decimal)和0x11如何进行乘法?
其实和10进制是一样的,1*16=16(decimal)=10(H)
以此类推,等于110(H)
上课的时候同学还说到了一个非常新颖的解体思想。
16*1*16+16=16²+16=110(H)
是不是很聪明!!!