欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

学习笔记:探索CSAPP第3章

最编程 2024-08-13 16:47:53
...

x86-64,C语音数据字节数

char:1

short:2

int:4

long:8

char *:8

float:4

double:8

寄存器名称 

rax eax ax al 返回值
rbx ebx bx bl Callee saved
rcx ecx cx cl 第四个参数
rdx edx dx dl 第三个参数
rsp esp sp spl 栈指针
rbp ebp bp bpl Callee saved
rsi esi si sil 第二个参数
rdi edi di dil 第一个参数

r8

r8d r8w r8b 第五个参数
r9 r9d r9w r9b 第六个参数
. . Caller saved
. Caller saved
. Caller saved
. Caller saved
. Caller saved
r15 Caller saved

小结:

a、8-15寄存器r+数字开头,后接字母,没字母是64位,d是双字double,w是单字word,b是byte单字节

b、ax/bx/cx/dx/sp/bp/si/di, 加前面是64位,e加前面是32位,没加是16位,l加后面是单字节8位。

c、Callee saved,意思是被调用者有义务在使用后还原。即:调用前不需pushq。

Caller saved,意思是调用者在调用前要保存好,否则被被调用者修改,不负责还原。即:调用前要先pushq。

操作数指示符

立即数需要在前面加$符号;寄存器没括号,加括号是表示内存地址;其他所有的都是表示内存地址。

括号里面有3个数时,第三个数是偏移的比例因子,要将它乘以第二个数。其余情况时,把所有数相加就是内存地址。

32位及以下寄存器不能作为内存地址

数据传送类指令

1.movb/movw/movl/movq,  movabsq,movabsq用于64位传64位。

2.五种传送情况:立即数-寄存器,立即数-内存,寄存器-寄存器,寄存器-内存,内存-寄存器

3.movz系列,补零扩展后复制。movzbw  movzbl  movzwl  movzbq  movzwq

4.movs系列,符合扩展后复制。movsbw movsbl movswl movsbq movswq movslq。cltq将%eax符合扩展到%rax

5.类型转换时,如果是少位转多位,先用movz或movs系列扩大;如果是多位转少位,先用mov系列复制。然后用mov系列指令复制到目的寄存器。

算术和逻辑操作指令

四类:1 leaq,4一元,6二元,4移位

leaq

inc、dec、neg、not

add、sub、imul、or、and、xor

sal、sar、shl、shr

上面每个指令都可以在后面加上b\w\l\q,代表位数。

leaq,加载有效地址,load effective address,movq的变种,目的操作数必须是寄存器。可以用作加法、乘法。

64位乘64位得128位,这部分内容没看懂,暂略过。

条件码

CF无符号数溢出,ZF等于零,OF有符合数溢出,SF负数

CMP,后接bwlq,cmpb, cmpw, cmpl, cmpq

TEST,后接bwlq,testb, testw, testl, testq

SET:

sete/setne, ZF/~ZF

sets/setns, SF/~SF

setg/setge/setl/setle, ~(SF^OF)&~ZF/ ~(SF^OF)/ SF^OF/ (SF^OF)|ZF

seta/ setae/ setb/ setbe, 

g\l,比较有符号数,a/比较无符号数,具体代数暂时还不理解。后面再补。