CSAPP课堂小结

本文总结了计算机系统课程中关于扩展位数传递、LEA指令的用法以及OBJDUMP工具的理解。讲解了0扩展和符号扩展的概念,并通过实例解释了LEA指令在简单算术运算中的应用。此外,还讨论了指令的相关性和不相关性,以及如何进行16进制乘法计算。
摘要由CSDN通过智能技术生成

呼呼。。。。。。最近终于稍微空闲一点点了

赶紧总结一下上个星期学的一些知识。

(下面这些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)

是不是很聪明!!!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值