学习笔记:探索CSAPP第3章
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/比较无符号数,具体代数暂时还不理解。后面再补。
推荐阅读
-
深入探索Linux学习笔记(二):挂载的概念及mount命令的功能
-
探索快速傅里叶变换(FFT)学习笔记(三)(探讨循环卷积的Bluestein算法+分治FFT+优化FFT+任意模数NTT)
-
小码哥-音视频学习笔记(第一天): 探索音视频开发概况
-
学习笔记:探索CSAPP第3章
-
探索C语言学习笔记:透视递归函数
-
中国大学MOOC学习笔记:探索3DMax
-
实战教程:使用Zynq-Linux移植学习笔记中的第27章UIO机制来处理外部中断
-
入门级嵌入式Linux学习笔记:第1章 - 开发环境与基础命令
-
超级详细!多元线性回归分析的数学建模学习笔记(第9期)
-
入门必看!PHP基础学习笔记(第1部分)