【CSAPP(第三章程序的机器级表示2)】人生难得几回搏,此时不搏待何时。这篇文章主要讲述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)
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 |
??第三组是二元操作,其中第二个操作数,既是源又是目的(类似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 |
文章图片
。在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}
推荐阅读
- Android JNI 学习(JNI 接口整理 — References Api)
- android ncnn
- 安卓基础之主题/样式
- 记录Android开发大牛博客,献给那些Android开发路上学习的人
- Applications Manager应用性能透视能力--Java Web事务监控
- 安卓手机怎么无线投屏电脑()
- Applications Manager Docker监控
- 继续和基准尺寸
- 圆和椭圆命令