新浪博客

汇编语言(王爽第三版)实验1查看CPU和内存,用机器指令和汇编指令编程

2017-05-10 16:28阅读:
实验前专题:开发环境搭建
目前我们能够搭建的开发环境:
1】纯DOS环境(DOS6.22或以前版本);使用Edit编辑器对汇编代码编辑;可以使用微软的masm汇编编译器编译和连接。以后实验中也多次使用纯DOS环境。这个模式可以使用实模式方式。随着操作系统发展,这种方式基本绝迹了。
2XP系统下的虚拟模式(笔者使用的环境,特意装的XP系统,太低的系统都不好找了);使用notepad++ for windows对汇编代码进行编辑(对C语言也使用这个写代码);可以使用微软的masm汇编编译器编译和连接。debug程序在XP系统中自带的。
3】通过Visual Studio 这个强大的 IDE 来实现汇编程序的编译,运行和调试,至于 Visual Studio 就不多做介绍了。这个不利于初学者,我认为没有学习的感觉。
4
】其他的一些集成实验环境,这里不介绍了。也不利于初学。
5】高于XP系统版本的操作系统,我们需要DOS-BOX这个模拟程序来支持,如果在win7系统搭建汇编开发环境,请查阅相关介绍,这个窗口虽然可调,但是用着不爽。
实验1 查看CPU和内存,用机器指令和汇编指令编程
1.预备知识:Debug的使用
我们以后所有的实验中,都将用到debug程序,首先学习一下它的主要用法。
1)什么是Debug
DebugDOSWindows都提供的实模式(8086方式)程序的调试工具。使用它,可以查看CPU各种寄存器中的内容、内存的情况和在机器码级跟踪程序的运行。
知识小贴士:实模式和保护模式
intel80286处理器于1982年问世了,它的地址总线位数增加到了24位,因此可以访问到16M的内存空间。更重要的是从此开始引进了一个全新理念--保护模式。这种模式下内存段的访问受到了限制。访问内存时不能直接从段寄存器中获得段的起始地址了,而需要经过额外转换和检查。为了和过去兼容,80286内存寻址可以有两种方式,一种是先进的保护模式,另一种是老式的8086方式,被成为实模式。系统启动时处理器处于实模式,只能访问1M空间,经过处理可进入保护模式,访问空间扩大到16M,但是要想从保护模式返回到实模式,你只有重新启动机器。还有一个致命的缺陷是80286虽然扩大了访问空间,但是每个段的大小还是64k,程序规模仍受到限制。因此这个先天低能儿注定寿命不会很久。很快它就被天资卓越的兄弟--80386代替了。
80386
是一个32位的CPU,也就是它的ALU数据总线是32位的,同时它的地址总线与数据总线宽度一致,也是32位,因此,其寻址能力达到4GB。对于内存来说,似乎是足够了。从理论上说,当数据总线与地址总线宽度一致时,其CPU结构应该简洁明了。但是,80386无法做到这一点。作为X86产品系列的一员,80386必须维持那些段寄存器的存在,还必须支持实模式,同时又要能支持保护模式,这给Intel的设计人员带来很大的挑战。Intel选择了在段寄存器的基础上构筑保护模式,并且保留段寄存器16位。在保护模式下,它的段范围不再受限于64K,可以达到4G。这一下真正解放了软件工程师,他们不必再费尽心思去压缩程序规模,软件功能也因此迅速提升。
808616位到8038632位处理器,这看起来是处理器位数的变化,但实质上是处理器体系结构的变化,从寻址方式上说,就是从实模式保护模式的变化。从80386以后,IntelCPU经历了80486PentiumPentiumIIPentiumIII等型号,虽然它们在速度上提高了好几个数量级,功能上也有不少改进,但基本上属于同一种系统结构的改进与加强,而无本质的变化,所以我们把80386以后的处理器统称为IA3232 Bit Intel Architecture)。
2)我们用到的Debug功能

R命令查看、改变CPU寄存器的内容;
D命令查看内存中的内容;
E命令改写内存中的内容;
U命令将内存中的机器指令翻译成汇编指令;
T命令执行一条机器指令;
A命令以汇编指令的格式在内存中写入一条机器指令。
P命令 到了 int 21H,我们要用P命令执行;进入循环时用p命令也可以退出循环
G命令g命令调试时能跳到想去的地址,特别是调试循环代码时
Debug的命令比较多(详细请看资料),共有20多个,但这6个命令是和汇编学习密切相关的。在以后的实验中,我们还会用到一个P命令。
3)进入Debug。(笔者使用的是XP系统)
直接在cmd窗口运行即可。
汇编语言(王爽第三版)实验1查看CPU和内存,用机器指令和汇编指令编程
或在运行窗口键入cmd回车(书中win2000方式类似)
汇编语言(王爽第三版)实验1查看CPU和内存,用机器指令和汇编指令编程
打开cmd窗口后,键入debug,如上图。
4)用R命令查看、改变CPU寄存器的内容。由于开发环境的不同,cmd调试结果也是不同的,这里只是将它们的意义说明。
-r
AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0B04 ES=0B04 SS=0B04 CS=0B04 IP=0100 NV UP EI PL NZ NA PO NC
0B04:0100 E80400 CALL 0107
看图说明:
1】红色标记的是我们讲过的6中寄存器,其中axbxcxdx都是通用寄存器,但是它们也有特定的用途,以后慢慢了解。csip寄存器是专门寄存器。
20B04:0100 E80400 CALL 0107
含义:CS=0B04 IP=0100 也就是CPU将要读取的从0B04:0100开始内存单元的指令,这个指令机器码是:E80400debug程序将这个机器码翻译成汇编指令是CALL 0107
理解:这个CPU指向的地址csip就是CPU将要读取并执行的指令代码。当然,这个代码对于我们来说是没有任何意义的。
debug状态下,我们可以使用R命令修改上述寄存器的值。
例如:
r cs 指令含义:修改cs寄存器值
r ip 指令含义:修改ip寄存器值
r ax 指令含义:修改ax寄存器值
5)使用D命令查看内存中的内容。
直接显示从某单元地址开始内容;
指令格式:d 段地址:偏移地址
例如:
-d 0b04:0
0B04:0000 CD 20 FF 9F 00 9A EE FE-1D F0 4F 03 68 05 8A 03 . ........O.h...
0B04:0010 68 05 17 03 68 05 1C 04-01 01 01 00 02 FF FF FF h...h...........
0B04:0020 FF FF FF FF FF FF FF FF-FF FF FF FF 15 05 4E 01 ..............N.
0B04:0030 28 0A 14 00 18 00 04 0B-FF FF FF FF 00 00 00 00 (...............
0B04:0040 05 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
0B04:0050 CD 21 CB 00 00 00 00 00-00 00 00 00 00 20 20 20 .!...........
0B04:0060 20 20 20 20 20 20 20 20-00 00 00 00 00 20 20 20 .....
0B04:0070 20 20 20 20 20 20 20 20-00 00 00 00 00 00 00 00 ........
1】中间的红色部分是从指定地址开始的内存单元中的内容,每一行为16个字节,用16进制格式输出。内存单元是从低地址向高地址显示的。在红色区域左边的是每行的起始地址(段地址:偏移地址);偏移地址的变化都是16的整数倍,在debug中就是10H。红色区域的右侧是将内存单元存储的值所对应的ASCII码字符,如果不在ASCII码的范围,以“.”形式列出(表示不可识别的ASCII码)。
2】在debug中,使用D命令显示的内存单元,是为了便于我们调试程序时查看内存的状态。此处注意,真正的内存依然是单列、连续的线性存储空间。而不是像debug中显示的按照表的形式存在。
3】使用d命令后,我们可以继续使用单个的“d”命令,继续显示连续的内存单元内容。每次显示128个单元(128个字节)内容。
4】使用 d 段地址:偏移地址(开始) 偏移地址(结束)来显示一段连续内存单元的内容;例如:-d

我的更多文章

下载客户端阅读体验更佳

APP专享