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

Posted 天星小苑

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CSAPP:第三章程序的机器级表示2相关的知识,希望对你有一定的参考价值。

CSAPP:程序的机器级表示2

关键点:算术、逻辑操作

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

算术逻辑操作

??如图列出了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)
9in %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)
8in %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

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

六星经典CSAPP笔记系列 - 作者:西代零零发

CMU-CSAPP-Lab2拆解二进制炸弹

CSAPP-Revision-ch03

CSAPP-Revision-ch03