操作系统-汇编实现C语法01

寄存器的名称(64位系统/32位系统兼容)

可以在64位系统上使用mov eax,xxx等指令
8086CPU寄存器
想想8086有14个16位(才2个字节)寄存器
即 AX,BX,CX,DX,SP,BP,SI,DI,IP,FLAG(PSW), CS,DS,SS,ES. 这 14 个寄存器按照一定方式又分为了通用寄存器,控制寄存器和段寄存器.
详细参考:https://blog.csdn.net/u010021014/article/details/116670289
x86寄存器
学习的时候可以装个32bit的Ubuntu16.04,它的寄存器少一些, 配合sublime写代码,学原理相对容易些.

x86-64寄存器
x86-64有16个64位(4个字节)寄存器,分别是: rax,rbx,rcx,rdx,esi,edi,rbp,rsp,r8,r9,r10,r11,r12,r13,r14,r15

- rax 作为函数返回值使用
- rsp 栈指针寄存器指向栈顶
- rbp 栈桢指针指向栈基
- rdi rsi rdx rcx r8 r9 用作函数参数依次对应第1参数 第2参数
- rbx r12 r13 r14 r15 用作数据存储遵循被调用者使用规则简单说就是随便用调用子函数之前要备份它以防他被修改
- r10 r11 用作数据存储遵循调用者使用规则简单说就是使用之前要先保存原值
- rip: 相当于PC指针指向当前的指令地址指向下一条要执行的指令
EFLAGS Register
EFLAGS 称为标志寄存器或程序状态字(Program Status Word. PSW).

- 6个状态标志(status flags)(CF, SF, AF, PF, OF, ZF)
- 3个(control flags)(IF, TF, DF)
- 系统标志(system flags)
状态标志(status flags)
CF-进位标志算术运算时有进位CF=1,无进位CF=0
这里针对的是最高位向前有没有进位,注意与AF区分
PF-奇偶标志运算结果中“1”的个数为偶数时PF=1,为奇数个则PF=0
但是如果运算结果是16位数的话,PF标志只关注运算结果的低八位
AF-辅助进位标志第三位向第四位有进位时AF=1
举个例子
0101 0000+ 1000 1111=1101 1111
第三位分别是 0和1,相加并没有进位,所以AF=0
ZF-零标志运算结果为0,则ZF=1,否则ZF=0
SF-符号标志运算结果为负数时,SF=1
对于符号数,最高位是符号位,因此SF相当于就是判别最高位是否为1,最高位是1表示是负数,SF=1
OF-溢出标志运算结果是否超出规定范围,超出范围OF=1,未超出OF=0
很容易把OF标志的判别方法和CF混淆,这里有一个简便的方法就是看最高位
控制标志(control flags)
IF-中断允许标志IF=1,中断允许
DF-方向标志用于在串操作指令中控制地址指针变化的方向,DF=0地址指针按增量变化,DF=1地址指针按减量变化
TF(trap flag)-跟踪标志TF=1,为单步工作方式,即CPU每执行一条指令就产生一次中断,此时程序员可以查看CPU内部寄存器的内容, 存储单元的内容和标志寄存器的内容等。这个中断主要用于程序调试。