CSAPP-机器级编程-基础+控制

时隔几天继续更,之所以间隔了两三天是因为现在不仅看视频,然后也会去啃csapp的书,跟着去做书后面的练习题,书后的练习题确实不错,能帮助你加深理解。

一.基础

        我们平常其实都是写的像c,java这样的高级语言,但计算机是没办法识别这样的高级代码的,因此需要将高级代码转化成机器代码,才能运行,但机器代码没有意义(指我们看不懂),因此

本章主要是讲汇编代码。

        1.数据格式

        首先我们要了解汇编代码与c语言的数据格式的对应关系。如下图

     

        2.访问信息

        对于一些变量,参数,我们需要存储它,会用到寄存器,   不同的寄存器有不同的功能。值得注意的是我们可以通过不同的字节指令去访问寄存器的部分(1,2,4,8字节)

        3.操作数指示符

        举个例子,比如move D(a,b,s), %rax

        D(a,b,s),%rax他们都是操作数,D(a,b,s)指绝对地址a + b*s + D

        操作数主要有立即数,寄存器,内存3种。

        4.数据传送指令

        数据传送指令就是一系列对数据的操作,包括MOV类,push,pop,等等,这一部分大家可以结合书的内容去看。值得注意的是lea类似于c的&(取地址符),但他也常常用来做一些简单的运算.

        然后这一部分有几个注意的点是:

        1.不允许2个操作数都是内存。

        2.操作数必须和操作指令的后缀匹配。

        3.立即数不能作为目的操作数。

二.控制

        这一部分主要讲了c语言中实现流程控制的一些语句比如if else,while是如何在汇编语言层面实现的。

        1.条件码

        cpu除了维护寄存器之外,还维护着条件码。条件码是用来记录最近一次操作产生的结果的。

        一些指令在执行之后都会去设置条件码。

        而流程控制的核心就是去访问最近的条件码。

        2.跳转指令

        汇编语言没有if,while,for等等,所有流程控制都是通过跳转指令来实现(很类似c的goto)。

        3.switch

        因为switch比较特别,因此把他单独拎出来说。

        switch语句首先会在内存中设置一个数组,去记录各种case。

        你传进来的n,就对应了case数组的一个下标,从而实现的O(1)时间复杂度的访问,case数组里面记录的是每种case对应的跳转标签,因此再结合跳转指令,拿到跳转标签之后,就可以实现switch-case的功能。

        有几个需要注意的问题。

        1.case可能不是连续的,比如1,2,5,7那么你这个内存中的case数组里面的值如何设置?

                case中没有的值,均设置为default对应的跳转标签即可。

        2.case跨度大,是不是会产生空间浪费,比如就2个case,1,10000000,那其实中间所有的都是default?

                在这种情况下,编译器会优化成if else,因此只有case基本连续且跨度不大才会使用case数组。

        3.case的值为负数,对应哪个下标?

                会取一个偏置值,以确保case中最小的对应的下标是0,

                比如case最小的是5,那么偏置值是-5,case值是-4那么偏执值是4。

      

          

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值