CSAPP:第三章程序的机器级表示2
CSAPP:程序的机器级表示2
关键点:算术、逻辑操作
算术逻辑操作
如图列出了x86-64的一些整数和逻辑操作,大多数操作分成了指令类(只有leaq没有其他的变种,addb、addw、addl、addq分别是字节加法、字加法、双字加法和四字加法),这些操作通常分为四组:加载有效地址、一元操作、二元操作和移位操作。
1.加载有效地址
- leaq S,D;D = &S
加载有效地址指令leag实际上是movq指令的变形,它的指令形式上是从内存读取数据到寄存器,但实际上没有引用内存。它的第一个操作数看上去是一个内存引用,但该指令并不是从指定的位置读入数据,而是将有效的数据写到目的操作数,这条指令可以为后面的内存引用产生指针。目的操作数必须是一个寄存器。
假如寄存器%rdx的值为x,那么指令leaq 7(%rdx,%rdx,4)将设置%rdx的值为5x+7
1//C语言
2long scale(long x,long y,long z)
3{
4 long t = x + 4 * y + 12 * z;
5 return t
6}
7//汇编
8long scale(long x,long y,long z)
9x in %rdi,y in %rsi,z in %rdx
10scale:
11 leaq: (%rdi,%rdi,4);//x = x + 4y
12 leaq: (%rdx,%rdx,2);//z = z + 2z
13 leaq: (%rdi,rdx,4); //(x + 4y) +4 * 3z
14 ret
1
- 练习
假设寄存器%rax的值为x,%rcx值为y。填写下表:
表达式 | 结果 |
---|---|
leaq 6(%rax),%rdx | 6 + x |
leaq (%rax,%rcx),%rdx | x + y |
leaq (%rax,%rcx,4),%rdx | x + 4 * y |
leaq 7(%rax,%rax,8),%rdx | 9 * x +7 |
leaq 0xA(,rcx%,4),%rdx | 4 * y + 10 |
leaq 9(%rax,%rcx,2),%rdx | x + 2 * y + 9 |
2.一元二元操作
第二组操作是一元操作,只有一个操作数,既是源又是目的,这个操作数可以是一个寄存器,也可以是一个内存位置(类似++,--);
第三组是二元操作,其中第二个操作数,既是源又是目的(类似C语言x-=y)。不过要注意,源操作是第一个,目的操作是第二个。第一个操作数可以是立即数、寄存器或者内存位置,第二个操作数只能是内存位置或者寄存器。注意,当第二个操作数是内存位置时,处理器必须从内存读出值,执行操作,再把结果写回内存。
- 习题
假设下面的值存放在指定的内存地址或寄存器中。
填写下表,说明将要被更新的寄存器或者内存地址,以及得到的值:
指令 | 目的 | 值 |
---|---|---|
addq %rcx,(%rax) | 0x100 | 0x100 |
subq %rdx,8(%rax) | 0x108 | 0xA8 |
imsuq $16 ,(%rax,%rdx,8) |
0x118 | 0x110 |
incq 16(%rax) | 0x110 | 0x14 |
decq %rcx | %rcx | 0x0 |
subq %rdx,%rax | %rax | 0xFD |
3.移位操作
最后一组给的时移位操作,先给出移位量,然后给出要移位的数,可以进行算术和逻辑右移。移位量可以是一个立即数,或者放在单字节寄存器%cl中。(这些指令很特别,因为只允许以这个特定的寄存器作为操作数),原则上来说,1个字节的移位量使得移位量的编码范围可以达到。在x86-64中,移位操作对w位长的数值进行操作,移位量是由%cl寄存器的低m位决定的,这里的,高位会被忽略。所以当寄存器%cl的十六进制值为0xff时,指令salb会移7位,salw会移15位,sall会移31位,salq会移63位。
左移指令:SAL和SHL。两者效果一样,都是将右边填上0.
右移指令:SAR执行算术移位(填上符号位),而SHR执行逻辑移位(填上0)。移位操作的目的操作数可以是一个寄存器或者内存位置
习题
1long shift_left4_rightn(long x,long n)
2{
3 x <<= 4;
4 x >>= n;
5 return x;
6//汇编
7long shift_left4_rightn(long x,long n)
8x in %rdi,n in %rsi
9shift_left4_rightn:
10movq %rdi,%rax ;Get x
11SAL $4,%rax ;x <<= 4
12movl %csi,%ecx ;Get n (4 bytes)
13SAR %cl,%rax ;>=n
14}
CSAPP:第三章程序的机器级表示2的更多相关文章
- CSAPP:第三章程序的机器级表示1
CSAPP:程序的机器级表示1 关键点:数据格式.操作数指示符. 数据格式访问信息操作数指示符举例说明 数据格式 术语字(word)表示16位数据类型,32位数为双字(double words), ...
- CSAPP:第三章程序的机器级表示3
程序的机器级表示3 关键点:过程.调试.指针 过程1.运行时栈2.转移控制3.数据传递4.栈上的局部存储5.寄存器中的局部存储空间理解指针使用GDB调试器 过程 1.运行时栈 x86-64的栈向低 ...
- 【CSAPP】三、程序的机器级表示
本章基于两种相关的机器语言:Intel IA32和x86-64,前者注重32位,后者注重64位. 本章脉络:c\汇编\机器码之间的关系,数据的表示,控制结构如何实现.运行栈,局部变量的存储,数据结构. ...
- 深入理解计算机系统 第三章 程序的机器级表示 Part2 第二遍
第一遍对应笔记链接 https://www.cnblogs.com/stone94/p/9943779.html 本章汇编代码中常出现的几个指令及其含义 1.push 操作数的个数:1 将操作数(一般 ...
- 深入理解计算机系统 第三章 程序的机器级表示 part1
如题所示,这一章讲解了程序在机器中是怎样表示的,主要讲汇编语言与机器语言. 学习什么,为什么学,以及学了之后有什么用 我们不用学习如何创建机器级的代码,但是我们要能够阅读和理解机器级的代码. 虽然现代 ...
- 深入理解计算机系统 第三章 程序的机器级表示 Part1 第二遍
第一遍对应笔记链接 https://www.cnblogs.com/stone94/p/9905345.html 机器级代码 计算机系统使用了多种不同形式的抽象,利用更简单的抽象模型来隐藏实现的细节. ...
- 【CSAPP】第三章 程序的机器级表示
目录 1. 数据的编码与存储 2. 汇编指令 2.1 数据传送指令 访存方式 数据传送指令 入栈出栈 2.2 算术/逻辑指令 2.3 过程控制指令 控制码 比较指令 跳转指令 条件设置指令 3. 程序 ...
- 深入理解计算机系统 第三章 程序的机器级表示 part2
这周由于时间和精力有限,只读一小节:3.4.4 压入和弹出栈数据 栈是一种特殊的数据结构,遵循“后进先出”的原则,可以用数组实现,总是从数组的一端插入和删除元素,这一端被称为栈顶. 栈有两个常用指令 ...
- 深入理解计算机系统 第三章 程序的机器级表示 part3
这周看了刘老师提供的相关视频,以及书中对应的章节“3.7 过程” 这一节分为运行时栈.转移控制.数据传送.栈上的局部存储.寄存器中的局部存储空间和递归过程这 6 个小节 其中前 3 小节看懂了一部分内 ...
随机推荐
- SpringBoot数据库集成-Mybatis
一.java web开发环境搭建 网上有很多教程,参考教程:http://www.cnblogs.com/Leo_wl/p/4752875.html 二.Spring boot搭建 1.Intelli ...
- Java五种基本的Annotation,提高程序的可读性
从JDK5开始,Java增加了对元数据的支持,也就是Annotation(即注解也被翻译为注释). 这里的Annotation和普通的注释有一定的区别,它是代码中的特殊标记,这些标记可以在编译.类加载 ...
- idea代码提示,不区分大小写
idea代码提示,不区分大小写:File-->Settings-->Editor-->General-->Code Completion-->Case sensitive ...
- VUE 利用webpack 给生产环境和发布环境配置不同的接口地址
第一步,分别设置不同的接口地址 首先,我们分别找到下面的文件: /config/dev.env.js /config/prod.env.js 其实,这两个文件就是针对生产环境和发布环境设置不同参数的文 ...
- BZOJ 2940: [Poi2000]条纹(Multi-Nim)
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 110 Solved: 70[Submit][Status][Discuss] Description ...
- neutron 多租户隔离的实现以及子网间路由的实现
1.一个network相当于一个二层网络,使用vxlan 隧道连通所有的CNA节点. 2.一个VPC下有多个network,也就是会分配多个vxlan隧道,这些子网间的路由是通过DVR实现的.DVR就 ...
- [转] Scala Try 与错误处理
一.概述 当你在尝试一门新的语言时,可能不会过于关注程序出错的问题, 但当真的去创造可用的代码时,就不能再忽视代码中的可能产生的错误和异常了. 鉴于各种各样的原因,人们往往低估了语言对错误处理支持程度 ...
- win10 出现0x80072efd错误
0x80072efd 0x80072efd 是网络问题,windows更新或windows应用商店出现0x80072efd问题,请检查本机代理,是否开着小飞机(Shadowsocks)之类的代理工具. ...
- ORA-1652: unable to extend temp segment by 128 in tablespace xxx Troubleshootin
当收到告警信息ORA-01652: unable to extend temp segment by 128 in tablespace xxxx 时,如何Troubleshooting ORA-16 ...
- java反射笔记
反射(reflect) 1. Class对象 1.1 什么是Class对象 当JVM加载某个class文件的时候,会自动创建一个唯一的Class对象(注意:由同一个类加载器加载的class文件),这个 ...