Chinaunix首页 | 论坛 | 博客
  • 博客访问: 18672910
  • 博文数量: 7460
  • 博客积分: 10434
  • 博客等级: 上将
  • 技术积分: 78178
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-02 22:54
文章分类

全部博文(7460)

文章存档

2011年(1)

2009年(669)

2008年(6790)

分类: C/C++

2008-03-20 10:18:07

第一讲 基础知识

1 访问内存
程序在内存中,访问内存是几乎每一程序都要进行的操作,计算机对内存编址是线性的,也就是说是一维的,比如256M的内存,地址就应该是从0~(256M-1),这个地址称为物理地址或绝对地址。
1.1 地址表示
但从汇编程序员的角度看,内存却是二维的,要说明一个地址,需要给出两个值,就象你在平面上指定一点需要说出(X,Y)坐标一样,汇编程序员的内存视角也需要两个“坐标”,前一个称为段地址(Segment),后一个称为偏移地址(Offset),该地址称为逻辑地址。
比如“1234:3DF5”就是一个地址。“1F3F:”不是一个地址,因为他只有段地址,没有编移地址。注意此后的地址都用十六进制表示。
1.2 地址计算
前面提到,计算机编址是一维的,汇编程序员是二维的,那么二者怎么换算呢?由后者到前者的换算方法是,“段地址串”后面加个“0”,然后再加上偏移地址。
比如“1234:3DF5”(十六进制的加减运算参见相关资料)
12340 ‘串后加了一个0
3DF5
-----
16135 ’注意此串仍然是十六进制。
所以,汇编程序员眼中的地址“1234:3DF5”就是物理地址(计算机编址):16135。
知道了由后者向前者的转换,那么由前者向后者的转换呢?
“不知道”,为什么不知道,继续往下看。
1.3 到底哪个地址对。
知道了1.2的地址算法后,我又发现一个问题:
“1000:6135”的物理地址是多少呢? 10000+6135=16135。
“1001:6125”的物理地址呢? 10010+6125=16135。
......
那么到底哪个对呢?问题的回答是这样的:假设我现在让你按一下“L”键,我可以告诉你如下几种方法中的一种或几种。1 请按一下“L”键; 2请按一下键盘上第四行第十个键;3 请按一下第十列中的第四个键;4 请按一下“K”右边的键;5 按标准指法单击一下右手无名指。
举上面的例子也就是说,同一个地址有很多种表示方式,具体用哪一种,要看实际使用时的情况。但无论用哪种方式,只要能达到目的即可。(实际中该问题一般不会受此问题困扰,但初学时突然想不通)。
1.4 有多少内存可以访问
无论是段地址还是偏移地址都是四位十六进制(如果不够四位,前面补0)。也就是说:总共可以访问的地址说是:0000:0000~FFFF:FFFF。 总共FFFF0+FFFF+1=10FFF0个地址。也就是不到1M的空间。
记住如下结论:
*)不管你实际内存有多少,目前我们只能访问不到1M的空间。
*)而实际上连这1M也用不完。其中上端的384K的址只能读不能写,只能读,一般称为ROM。
*)低端的640K可以读写。但这640K的低端100多K也不能随便写,因此DOS系统使用该区。
*)原来1024M的内存,汇编程序只能使用其中400多K。这段内存的容易相当于一个普通文档的大小。不过这就足够了。

2 DEBUG的使用
先记住以下两个命令:D命令和Q命令。前者是显示内存内容,后者是退出DEBUG命令。
-------------以下为抄别的人内容---------------
DEBUG.EXE程序是专门为分析、研制和开发汇编语言程序而设计的一种调试工具,具有跟踪程序执行、观察中间运行结果、显示和修改寄存器或存储单元内容等多种功能。它能使程序设计人员或用户触及到机器内部,因此可以说它是80X86CPU的心灵窗口,也是我们学习汇编语言必须掌握的调试工具。

1)DEBUG程序使用

在DOS提示符下键入命令:

C>DEBUG [盘符:][路径][文件名.EXE][参数1][参数2]

这时屏幕上出现DEBUG的提示符“-”,表示系统在DEBUG管理之下,此时可以用DEBUG进行程序调试。若所有选项省略,仅把DEBUG装入内存,可对当前内存中的内容进行调试,或者再用N和L命令,从指定盘上装入要调试的程序;若命令行中有文件名,则DOS把DEBUG程序调入内存后,再由DEBUG将指定的文件名装入内存。
2)DEBUG的常用命令
(1)退出命令 Q
格式:Q
功能:退出DEBUG,返回到操作系统。
(2)显示存储单元命令 D
格式1:D[起始地址]
格式2:D[起始地址][结束地址|字节数]
功能:格式1从起始地址开始按十六进制显示80H个单元的内容,每行16个单元,共8行,每行右边显示16个单元的ASCII码,不可显示的ASCII码则显示“·”。格式2显示指定范围内存储单元的内容,其他显示方式与格式1一样。如果缺省起始地址或地址范围,则从当前的地址开始按格式1显示。
例如: -D 200 ;表示从DS:0200H开始显示128个单元内容
-D 100 120 ;表示显示DS:0100-DS:0120单元的内容
说明:在DEBUG中,地址表示方式有如下形式:
段寄存器名:相对地址,如:DS:100
段基值:偏移地址(相对地址),如:23A0:1500

--------------------------小抄结束--------------------------------

3 验证第一节里的内容
运行“开始/程序/附件/MS-DOS命令提示符”(这是win2000,win98下自己找吧)
在“_”下输入D,显示
-d
1398:0100 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
1398:0110 00 00 00 00 00 00 00 00-00 00 00 00 34 00 87 13 ............4...
1398:0120 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
1398:0130 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
1398:0140 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
1398:0150 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
1398:0160 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
1398:0170 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
-
我们记下:1398:011C的值是个34。1389:011C的物理地址应该是:13A9C。
那么1000:3A9C的物理地址也应该是13A9C,他的内存也应该是34,(因为本来就是一个地址吗,就象第三行第十列和第十列第三行当然应该是同一个位置)。
-d 1000:3A9C
1000:3A90 34 00 87 13 4...
1000:3AA0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
1000:3AB0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
1000:3AC0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
1000:3AD0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
1000:3AE0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
1000:3AF0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
1000:3B00 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
1000:3B10 00 00 00 00 00 00 00 00-00 00 00 00 ............
-
果然如此,同样你可以验证:13A9:000C也肯定是指这一个地址,不信试试。
阅读(340) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~