CSAPP:第三章程序的机器级表示2

时间:2022-09-09 23:00:21

CSAPP:程序的机器级表示2

关键点:算术、逻辑操作

算术逻辑操作1.加载有效地址2.一元二元操作3.移位操作

算术逻辑操作

  如图列出了x86-64的一些整数和逻辑操作,大多数操作分成了指令类(只有leaq没有其他的变种,addb、addw、addl、addq分别是字节加法、字加法、双字加法和四字加法),这些操作通常分为四组:加载有效地址、一元操作、二元操作和移位操作。

CSAPP:第三章程序的机器级表示2

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)。不过要注意,源操作是第一个,目的操作是第二个。第一个操作数可以是立即数、寄存器或者内存位置,第二个操作数只能是内存位置或者寄存器。注意,当第二个操作数是内存位置时,处理器必须从内存读出值,执行操作,再把结果写回内存。

  • 习题
      假设下面的值存放在指定的内存地址或寄存器中。
    CSAPP:第三章程序的机器级表示2
    填写下表,说明将要被更新的寄存器或者内存地址,以及得到的值:
指令 目的
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个字节的移位量使得移位量的编码范围可以达到CSAPP:第三章程序的机器级表示2。在x86-64中,移位操作对w位长的数值进行操作,移位量是由%cl寄存器的低m位决定的,这里的CSAPP:第三章程序的机器级表示2,高位会被忽略。所以当寄存器%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的更多相关文章

  1. CSAPP:第三章程序的机器级表示1

    CSAPP:程序的机器级表示1 关键点:数据格式.操作数指示符. 数据格式访问信息操作数指示符举例说明 数据格式   术语字(word)表示16位数据类型,32位数为双字(double words), ...

  2. CSAPP:第三章程序的机器级表示3

    程序的机器级表示3 关键点:过程.调试.指针 过程1.运行时栈2.转移控制3.数据传递4.栈上的局部存储5.寄存器中的局部存储空间理解指针使用GDB调试器 过程 1.运行时栈   x86-64的栈向低 ...

  3. 【CSAPP】三、程序的机器级表示

    本章基于两种相关的机器语言:Intel IA32和x86-64,前者注重32位,后者注重64位. 本章脉络:c\汇编\机器码之间的关系,数据的表示,控制结构如何实现.运行栈,局部变量的存储,数据结构. ...

  4. 深入理解计算机系统 第三章 程序的机器级表示 Part2 第二遍

    第一遍对应笔记链接 https://www.cnblogs.com/stone94/p/9943779.html 本章汇编代码中常出现的几个指令及其含义 1.push 操作数的个数:1 将操作数(一般 ...

  5. 深入理解计算机系统 第三章 程序的机器级表示 part1

    如题所示,这一章讲解了程序在机器中是怎样表示的,主要讲汇编语言与机器语言. 学习什么,为什么学,以及学了之后有什么用 我们不用学习如何创建机器级的代码,但是我们要能够阅读和理解机器级的代码. 虽然现代 ...

  6. 深入理解计算机系统 第三章 程序的机器级表示 Part1 第二遍

    第一遍对应笔记链接 https://www.cnblogs.com/stone94/p/9905345.html 机器级代码 计算机系统使用了多种不同形式的抽象,利用更简单的抽象模型来隐藏实现的细节. ...

  7. 深入理解计算机系统 第三章 程序的机器级表示 part2

    这周由于时间和精力有限,只读一小节:3.4.4  压入和弹出栈数据 栈是一种特殊的数据结构,遵循“后进先出”的原则,可以用数组实现,总是从数组的一端插入和删除元素,这一端被称为栈顶. 栈有两个常用指令 ...

  8. 深入理解计算机系统 第三章 程序的机器级表示 part3

    这周看了刘老师提供的相关视频,以及书中对应的章节“3.7 过程” 这一节分为运行时栈.转移控制.数据传送.栈上的局部存储.寄存器中的局部存储空间和递归过程这 6 个小节 其中前 3 小节看懂了一部分内 ...

  9. Linux下程序的机器级表示学习心得

    Linux下程序的机器级表示学习心得 上周学习完Linux程序的机器级表示后,对于其中有些还是掌握的不太透彻.对于老师提出的关于本章一些细节的问题还是有不会,所以又重新温习了一下上周的学习内容,以下为 ...

随机推荐

  1. python-操作mssql数据库

    准备工作: cmd 命令行下安装pymssql: pip install pymssql 查询的数据库如下: 代码如下: #coding=utf-8 import pymssql class MSSQ ...

  2. Netty 中文教程 Hello World !详解

    1.HelloServer 详解 HelloServer首先定义了一个静态终态的变量---服务端绑定端口7878.至于为什么是这个7878端口,纯粹是笔者个人喜好.大家可以按照自己的习惯选择端口.当然 ...

  3. SQL2005性能分析一些细节功能你是否有用到&quest;&lpar;二&rpar;

    原文:SQL2005性能分析一些细节功能你是否有用到?(二) 上一篇:SQL2005性能分析一些细节功能你是否有用到? 我简单的提到了些关于SQL性能分析最基本的一些方法,下面的文章我会陆续补充.前面 ...

  4. Bootstrap入门(三)&lt&semi;p&gt&semi;标签的css样式

    Bootstrap入门(三)<p>标签的css样式 前提:引入css文件,内容放在一个class为container的div中   <p>标签属性 1.“ text-left ...

  5. TFboy养成记 MNIST Classification (主要是如何计算accuracy)

    参考:莫烦. 主要是运用的MLP.另外这里用到的是批训练: 这个代码很简单,跟上次的基本没有什么区别. 这里的lossfunction用到的是是交叉熵cross_entropy.可能网上很多形式跟这里 ...

  6. JSLint报错翻译

    “Missing semicolon.” : “缺少分号.”,“Use the function form of \”use strict\”.” : “使用标准化定义function.”,“Unex ...

  7. day 0308 编码的进阶 文件操作

    一.编码的进阶: 在python3以后,字符串和bytes类型彻底分开,字符串以字符为单位进行处理的,bytes类型是以字节为单位处理的. bytes数据类型在所有的操作和使用与字符串方法基本一样,也 ...

  8. GPRS的短信和打电话功能

    短信功能: 发短信设置文本格式就可以了:但收短信可能收到的是乱码,需要编写解码程序才可以: 关于打电话单片机复位功能: 首先要建立黑白名单制度过滤手机号,只运行白名单的手机对的单片机打电话:其它的不响 ...

  9. 跟着实例学习ZooKeeper的用法: 分布式锁

    锁 分布式的锁全局同步, 这意味着任何一个时间点不会有两个客户端都拥有相同的锁. 可重入锁Shared Reentrant Lock 首先我们先看一个全局可重入的锁. Shared意味着锁是全局可见的 ...

  10. js 遍历tree的一个例子(全遍历)&comma;更复杂的功能

    更复杂的功能 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UT ...