16位代码段与32位代码段的区别
16位代码段与32位代码段的区别如下:
16位代码段最长只能为64k,段内偏移量为16位,默认的指令地址及操作地址为16位;
32位代码段最长可以4G,段内偏移量为32位,默认的指令地址及操作地址为32位。
是否能够使用 eax, edx 等寄存器与是否使用16位代码段及32位代码段无关。16位代码段、32位代码段都可以使用 eax, edx 等寄存器。
如果要使用 eax, edx 等32位寄存器,必须在代码中指定 .386, .386p, .486, .486p 等指示符。
在DOS实模式下,只能使用16位代码段。
在MASM中,如果把 .386, .386p, .486, .486p 等指示符放在 .model 之前,那么所有的段(数据段、代码段)默认为32位; 如果把 .386, .386p, .486, .486p 等指示符放在 .model 之后,那么所有的段(数据段、代码段)默认为16位。
可以在定义段时,用 USE16 或 USE32 明确指定是使用16位的段(数据段、代码段)还是32位的段(数据段、代码段)。
部分参考资料:
http://www.arl.wustl.edu/~lockwood/class/cs306/books/artofasm/Chapter_8/CH08-3.html#HEADING3-42
首先要明确两个概念:寄存器的位数和段的位数是两个不同的概念。
寄存器的位数这个很容易理解~段的位数却有点麻烦。
我们知道,8086的CPU的寄存器是16位的,80386以上的CPU是32位的;这在汇编语言中的体现就是.386p等伪指令。
如果你使用了.386p伪指令,那么汇编的编译程序才会将你的指令编译为80386认识的机器指令,汇编语言默认的是使用.8086伪指令,很明显,这个时候汇编编译程序只是将你的汇编程序编译为8086认识的机器语言,这个时候当然也不可以用EAX等寄存器了,不然编译程序会出现错误提示。如果你要使用EAX等寄存器,就要这个之前加上.386或者之上的伪指令。
简单的来说,寄存器的位数是.386等伪指令决定的,和其他无关。
而段的位数却是由段定义说明中的use16和use32这两个中的其中一个决定的。其实,汇编编译程序在将USE16或者USE16编译成机器语言的时候,就是段描述符中的第6个字节的第6位(我们一般称为D位),如果是USE16,就将该为设为0,如果是USE32,就设置为1
16位的代码段和32位的代码段很明显的一个区别就是段大小的限制:一个是64k,一个是4G。细节上却有很多差别,比如对于一个Push 10h这样一个指令,如果段是16位的,sp=sp-2,如果段是32位
的,就是sp=sp-4,当然,如果如果你是PUSH EAX的话,无论段是16位还是32位,都是SP=SP-4。
还有很多细节,这里就不多说了。
16位代码段与32位代码段的区别相关推荐
- 汇编中各寄存器的作用(16位CPU14个,32位CPU16个)和 x86汇编指令集大全(带注释)
From:https://www.cnblogs.com/zimmerk/articles/2520011.html From:https://blog.csdn.net/bjbz_cxy/artic ...
- 汇编中各寄存器的作用(16位CPU14个,32位CPU16个)和 x86汇编指令集大全(带注释)...
From:https://www.cnblogs.com/zimmerk/articles/2520011.html From:https://blog.csdn.net/bjbz_cxy/artic ...
- QGIS编译---QGIS2.14.16 + Qt4.8.6 + VS2010 ---32位版本
编译前须知(有必要的几句啰嗦): 1.莫被这个教程的篇幅吓到,其实篇幅不大.就算大家觉得太啰嗦,请见谅,笔者写教程就是喜欢详细,喜欢面面俱到.再者,本教程是为了解答很多人编译QGIS遇到的头疼问题,虽 ...
- 64位的电脑比32位的电脑跑的快么?「多图预警」
前言 代码写了那么多,你知道 a = 1 + 2 这条代码是怎么被 CPU 执行的吗? 软件用了那么多,你知道软件的 32 位和 64 位之间的区别吗?再来 32 位的操作系统可以运行在 64 位的电 ...
- 32位算术逻辑运算单元alu设计_64位的电脑比32位的电脑跑的快么?多图预警
前言 代码写了那么多,你知道 a = 1 + 2 这条代码是怎么被 CPU 执行的吗? 软件用了那么多,你知道软件的 32 位和 64 位之间的区别吗?再来 32 位的操作系统可以运行在 64 位的电 ...
- 64位系统下一个32位的程序究竟可以申请到多少内存?
64位系统下一个32位的程序究竟可以申请到多少内存? cpu的位是指一次性可处理的数据量是多少,1字节=8位,32位处理器可以一次性处理4个字节的数据量,依次类推.32位操作系统针对的32位的CPU设 ...
- 64位系统VBS调用32位COM组件
64位系统VBS调用32位COM组件 标签: 32位, 64位, COM, COM组件, VB, VBS, VBScript 标题: 64位系统VBS调用32位COM组件 作者: Demon 链接: ...
- 在64位linux下编译32位程序
一般情况下我们最好是在一个平台上编译本平台的二进制程序,比如在32位平台上编译32位程序而在64位平台上编译64位程序. 现在64位的系统(这里主要指x86_64系统,包括AMD64和Intel的EM ...
- 你为什么需要在64位系统下用32位程序
在64位系统下,用64位的程序自然是能够充分利用cpu中的64位指令和64位的地址空间,可有的时候,我们却不得不在64位系统下使用32位的程序. 64位和32位 对于64位还是32位,首先要从概念上把 ...
最新文章
- php每分钟刷新一次的验证码,php如何在进入页面的时候自动刷新一次验证码
- js怎么获取访问页数记录(知道的能不能告诉我一下)
- boost::hana::comparing用法的测试程序
- mysql round 0.1111_听说Mysql你很豪横?-------------分分钟带你玩转SQL高级查询语句(库函数,存储过程)...
- JMeter中如何实现跨线程组关联
- linux video属性_Linux 下Video 的制作方法
- 很累很失败,发奋学英语
- WEB SERVER调优
- 使用pyqt开发gui(pyqt集成到pycharm)
- linux开启防火墙教程,linux系统开启防火墙及开放端口操作步骤
- 5G大规模MIMO技术
- 第3-4课:爱因斯坦的思考题(上)
- html5 拉弓,瞄准 拉弓 射出梦想
- 5s进水不开机怎么办 苹果5s进水后无法开机的维修方法
- 关于 C4D R18 载入闪退
- c语言肤色检测,基于肤色的人脸检测
- 如何实现广告精准投放?一文获得新思路
- Sql Server插入随机数
- ReactNative学习笔记(七)——ref属性的用法和可点击组件
- 计算机word茶的功效,乌龙茶的功效与作用 Microsoft Word 文档