CSAPP-第三章学习笔记

知识点摘要:

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值