那么开始了!
1.80X86 32位CPU的编程模型programming model
80X86有16个通用寄存器register。从某种程度上来说介绍80X86的CPU编程模型,就是介绍这16个寄存器。没听过CPU寄存器这名字的童鞋不用看下去了请回家睡觉去。本文基本上适合大抵知道汇编怎么回事的童鞋而不是完全的汇编白痴。
另外,介绍的是32位汇编,请把80X86的16位汇编先忘记掉,这么短的文章不可能介绍完汇编,而是给出汇编最基本的东西和最简单的抽象。可能的话稍微解释下16位汇编。
eax ebx ecx edx
这4个寄存器是通用寄存器。用来暂存数据的地方。
esi edi(extension source index, extension destination index.)
它们也可以用来暂存数据。更一般的是伴随串指令使用。
esp ebp(extension stack pointer, extension base pointer)
栈指针寄存器和基址指针寄存器。关于栈和过程调用,最重要的寄存器就是这两个了!绝对不要忘掉这两个!
eip(extension instruction pointer, or program count)
指令指针寄存器!这就是“顺序存储控制”的核心!又称程序计数器!
eflag
标志寄存器。算术、逻辑及相关指令运算会影响该标志寄存器中的位。这个寄存器很重要也很麻烦。
以上!就是32位汇编(又称平坦地址模式汇编)会使用到的所有寄存器,一共十个,都是32位的。啊不是说十六个寄存器吗?
对,还有6个寄存器,分别名为:
cs ;代码段寄存器code segment
ds ;数据段寄存器data segment
ss ;栈寄存器stack segment
es fs gs; 附加段寄存器
这6个寄存器都是16位寄存器。即使是现今的80686 32位系统中,它们仍然是16位的。这些段寄存器在8086中用来对内存地址进行段指定。有8086 16位汇编知识的同学都知道怎么回事,...还是解释一下吧,8086是16位CPU,而地址线是20位。20根地址线表明能寻址的空间是2^20也就是1M(1024 * 1024).16位不够表达1M的地址空间,因此由“段*16+偏移”得到内存地址值。
但是在32位系统中,这些段寄存器已经不怎么使用了。总之32位汇编不需要关注这些寄存器,因为32位系统CPU和各寄存器是32位,地址线也是32位,一个32位值足够表达32位寻址空间。...实际上这些段寄存器在32位系统中是同一个值,用来指向某个索引表,但这是本文不需要在此关注的东西。
以上,16个寄存器介绍完毕!接下来介绍简洁的编程模型抽象!
1.80X86 32位CPU的编程模型programming model
80X86有16个通用寄存器register。从某种程度上来说介绍80X86的CPU编程模型,就是介绍这16个寄存器。没听过CPU寄存器这名字的童鞋不用看下去了请回家睡觉去。本文基本上适合大抵知道汇编怎么回事的童鞋而不是完全的汇编白痴。
另外,介绍的是32位汇编,请把80X86的16位汇编先忘记掉,这么短的文章不可能介绍完汇编,而是给出汇编最基本的东西和最简单的抽象。可能的话稍微解释下16位汇编。
eax ebx ecx edx
这4个寄存器是通用寄存器。用来暂存数据的地方。
esi edi(extension source index, extension destination index.)
它们也可以用来暂存数据。更一般的是伴随串指令使用。
esp ebp(extension stack pointer, extension base pointer)
栈指针寄存器和基址指针寄存器。关于栈和过程调用,最重要的寄存器就是这两个了!绝对不要忘掉这两个!
eip(extension instruction pointer, or program count)
指令指针寄存器!这就是“顺序存储控制”的核心!又称程序计数器!
eflag
标志寄存器。算术、逻辑及相关指令运算会影响该标志寄存器中的位。这个寄存器很重要也很麻烦。
以上!就是32位汇编(又称平坦地址模式汇编)会使用到的所有寄存器,一共十个,都是32位的。啊不是说十六个寄存器吗?
对,还有6个寄存器,分别名为:
cs ;代码段寄存器code segment
ds ;数据段寄存器data segment
ss ;栈寄存器stack segment
es fs gs; 附加段寄存器
这6个寄存器都是16位寄存器。即使是现今的80686 32位系统中,它们仍然是16位的。这些段寄存器在8086中用来对内存地址进行段指定。有8086 16位汇编知识的同学都知道怎么回事,...还是解释一下吧,8086是16位CPU,而地址线是20位。20根地址线表明能寻址的空间是2^20也就是1M(1024 * 1024).16位不够表达1M的地址空间,因此由“段*16+偏移”得到内存地址值。
但是在32位系统中,这些段寄存器已经不怎么使用了。总之32位汇编不需要关注这些寄存器,因为32位系统CPU和各寄存器是32位,地址线也是32位,一个32位值足够表达32位寻址空间。...实际上这些段寄存器在32位系统中是同一个值,用来指向某个索引表,但这是本文不需要在此关注的东西。
以上,16个寄存器介绍完毕!接下来介绍简洁的编程模型抽象!