| |||
新浪首页 > 游戏世界 > 游民论谈 > 文章内容 |
INTELX86体系32位汇编语言速成
游民部落网友free_mind
怎么样,看起来大半部分都应该是我们以前很熟的了吧。现在,我们只需要侃侃那些在386上才开始出现的新的寄存器就行了。 首先必须强调的是,在用32位汇编语言编程的时候,所有的地址偏移量都是32位的,在寻址时千万不要还用原来的16位方式。 对于通用寄存器来说,多了种形如(Exx)的32位寄存器,它的低16位内容就是原来的16位寄存器,而多出的高16位的内容,则只能通过使用32位寄存器来访问。 再以指针寄存器为例,在寻址时一定要用ESI、EDI、EBP等等,必须要把以前那种movax,[si]之类的指令改为movax,[ESI]。 从386开始,多出了FS、GS这两个新的段寄存器。由于我们学习的目的是为了今后写在线汇编,所以很多繁琐的问题都不会直接遇到。为了能更快地投入实际运用,这里就不打算去讲述保护模式的细节了,而直接给大家提出一个结论,你只管按照这个结论去做就行了。 这个简单的结论就是:你在VC中写在线汇编时,尽量不要去碰段寄存器! 得出这个结论的第一个原因是VC生成的应用程序的DS、ES和SS是相同的。换种说法,整个应用程序的数据段、附加段、堆栈段都在同一个地址,你根本就没有去改变它们的必要。第二个原因是,因为是保护模式,每个段都有4GB大小,所有数据都可以轻易地放进去,于是当然就用不着去改段寄存器了。最后一个原因是,保护模式下的段寄存器使用方法同实模式下完全不一样,在你没弄懂以前,最好别去乱改,否则……嘿嘿,死掉了别怨我。 至于状态寄存器,大家肯定是非常熟悉了,虽然多了几位,但这些内容我们一般都用不着,所以也可以略过。 下面将开始讲述INTELX86的32位偏移地址构成方式。 这里给出关于80386寻址模式的一张列表: 基地址+(变址X比例因子)+偏移量
其中,“---”表示ESP不能被用作变址寄存器 注意到比例因子,这个可是从386才开始加入的好东西,它对处理表结构大有好处,而且还衍生出了不少技巧,详情请参考《图形程序开发人员指南(MichaelAbrash"sGraphicsProgrammingBlackBook SpecialEdition)》一书第6.3节。
|