栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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。

      

          

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/876117.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号