您的位置:首页 > 编程语言

32位环境下的16汇编程序设计

2011-10-27 21:39 190 查看
本篇文章是年前写的,本不打算贴在csdn上的,但是为了避免其他新手在这上面走弯路,还是贴上来好了。

相信学过汇编的同学一定用汇编写过读写CMOS芯片的程序吧,最常见的就是从CMOS芯片读出当前系统的时间,但是无法向CMOS芯片写入数据来更改系统时间,这并不代表不能向CMOS写入数据,能写入,但不是在操作系统下。

masm5.0编译器只支持16位汇编,也就是说,编译出来的exe文件是16位程序,但是我们的电脑平时工作在保护模式下,以32位为主。有人会说,难道16位程序不能在保护模式下使用?答案嘛,很显然,不能,至于我们用汇编写的程序为什么可以运行,很好解释,因为我们的程序不是运行在保护模式下的,而是运行在虚拟8086模式下的,为什么16位程序不能运行在保护模式下呢,很好解释,看下面的例子

16位下,mov ax, 1234h对应的机器码是 B8 34 12

但是在32位下是这样的 66 B8 34 12

在32位下mov eax, 1234h B8 34 12 00 00

假设我写一个16位程序,用masm编译的

mov ax, 1234h B8 34 12

push ax 50

mov ax, bx 8B C3

如果我们写的16位程序直接通过CPU执行就会成这样

mov eax, 8b501234h B8 34 12 50 8B

ret C3

我们之所以写出来的读写CMOS程序只能读不能写,就是因为我们写出来的16位程序实在虚拟8086模式下运行的,相当于是在一个虚拟的环境里运行的,没有实际意义。

但并不是32位CPU的所有实际运行的模式下操作十六位寄存器的指令前都必须加66,实际上在实模式下,使用32位寄存器前需要加66,我们的读写CMOS芯片的程序直接开机引导运行的话,是可以将数据写入到CMOS芯片里的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: