这一节我们来介绍常见的X86汇编指令,汇编语言现在用的很少,基本上都是用C/C++,java,Python等这些高级语言进行编程,我们主要是通过C语言编译后的汇编,来理解C语言的本质,然后后面写OS跟编译器的时候会用到一些汇编,我们对汇编的要求是基本上能看懂就可以了。
X86是英特尔一系列微处理器的简称,第一代是8086它是16位的处理器,后面又发展到32位的处理器,里面的代表有i386 i486和奔腾4处理器,这些32位处理器它的体系结构是类似的,所以统称为IA32或者是X86-32,我们也可以通过i386来代表32位的处理器,后来又发展到64位处理器,64位处理器统称为X86-64。
对32位CPU它有8个32位的通用整数寄存器,就是说这些寄存器里面只能用来存放整数,而对于浮点数会有专门的寄存器跟指令来做处理,我们后面会介绍到,
这8个寄存器,它都可以按照4个字节或者是2个字节来访问,比如你访问si它就是访问前面的两个字节,访问esi访问的就是4个字节,前面4个寄存器它还可以单独访问前面两个字节,比如al访问的就是第一个字节,ah访问的是第二个字节,那么你用ax访问的就是前面两个字节,eax访问的就是前面4个字节,
除了这些通用的寄存器,还有一些特殊的寄存器,这些特殊的寄存器只在操作系统里面会用到,一般的应用程序用不到,比如IP就是指令指针寄存器,用来存放下一条指令的地址,eflags是标志寄存器,通过CPU运算的结果来设置一些标志,
比如我们假设CPU运算的是t=a+b,那么CF就是进位标志,把a b当成无符号数,看它相加的结果有没有进位,比如说两个4位的数相加变成5位数,那么它就产生了进位,就代表的是无符号溢出,ZF是0标志,看结果是不是等于0,SF是看结果是不是小于0,
OF是溢出标志,把a b去当成有符号数,看它相加的结果有没有溢出,比如两个正数相加是等于负数,或者是两个负数相加等于正数,那么就说明产出了溢出,其它的标志位我们还会用到if中断打开跟关闭的标志,我们后面写OS的时候会用到,段寄存器就是操作系统在打开分段跟分页的时候会用到,用来获取代码段跟数据段的地址,那么32位CPU它的地址空间就是2的32次方是4G,它最大支持4G的内存.<