知识点摘要:
3.2程序编码
3.2.1 机器级代码
3.2.2代码示例
可在C语言中插入汇编代码
*
3.3数据格式*
编码后缀代码
char:b
short:w
int:l
long:q
char*:q
float:s
double:l
3.4访问信息
x86-64有16个64位寄存器,前八个标号从%rax到%rsp,后八个%r8到%r15.
指令可以对寄存器内低字节存放不同大小的数据进行访问
3.4.1 操作数指示符
$立即数
R[]寄存器
M[]内存引用
11种寻址模式
3.4.2数据传输指令
MOV类四条指令:
movb 字节
movw 字(16位)
movl 双字
movq 四字
movabsq 传输绝对四字
多数情况下MOV指令只改操作数指定操作数字节或内存位置,唯一例外是movl 他会将高位4字节设为0
零扩展数据传输指令
movzbw
movzbl
movzwl
movzbq
movzwq
符号扩展数据传输指令
movsbw
movsbl
movswl
movsbq
movswq
movslq
cltq 把%exa符号扩展%rax
3.4.4压入和弹出数据
%rsp指向的地址总是栈顶
%rax指向返回值
pushq
subq $8 %rsp
movq %rbp (%rsp)
pop
movq (%rsp) %rax
addq $8 %rsp
3.5算数和逻辑操作
加载有效地址
一元操作
二元操作
位移
3.5.1加载有效地址及
leaq 7(%rdx,%rdx,4),%rax: 5x+7;
3.5.2一元和二元操作
一元操作;
只有一个操作数,是源也是目的,可以是一个寄存器或内存位置
incq(%rsp) : 栈顶8字节元素加一
二元操作:
第二个数是源也是目的
subq %rax,%rdx。y=y-x;,第一个寄存器是立即数
3.5.3位移操作
位移量是个立即数,存放在单字节寄存器%cl中
sal
shl
sar:算数右移
ahr:逻辑右移
3.5.4讨论
3.5.5特殊的算术操作
3.6控制
3.6.1条件码
CF:进位标志
ZF:零标志
SF:符号标志
OF:溢出标志
3.6.2访问条件码
3.6.3跳转指令
直接跳转
jmp .L1
间接跳转
jmp *%rax
jmp *(%rax)
3.6.4跳转指令的编码
3.6.5用条件控制来实现条件分支
由于处理器的流水线构型
条件数据传输与条件控制转移的对比
for
switch
while
do while
的汇编代码实现
3.7过程
3.7.1运行时栈
习题
3.1
0x100
0xAB
0x108
0xFF
0xAB
0x11
0x13
0x100
0x11
3.2
movl
movw
movb
movb
movq
movw
3.4
movsbl (%rdi) %eax
movl %eax (%rsi)
movzbl (%rdi) %eax
movl %eax (%rsi)
movzbl (%rdi) %eax
movq %rax (%rsi)
movl (%rdi) %exa
movb %al (%rsi)
movl (%rdi) %exa
movb %exa (%rsi)
movsbl (%rdi) %exa
movw %exa (%rdi)
3.5
void decode1(long *xp,long *yp,long *zp){
int a,b,c;
a=*xp;
b=*yp;
c=*zp;
*yp=a;
*zp=b;
*xp=c;
}
3.6
x+6
x+y
x+4y
9x+7
4y+10
9+x+2y
3.7
5x+2y+8z
3.8
0x100 0x100
0x108 0xA8
0x118 0x110
0x100 0x110
%rcx 0x0
%rax 0xFD
3.9
salq $4 %rax
sarq %ecx %rax
3.10
x|y
t1>>3;
-t2
z-t3
3.16
void cond(long a,long *p){
if(p==0)
goto done;
if(*p>=a)
goto done;
*p=a;
done:
return;
}
3.19
30
46