汇编入门总结(2)

来源:互联网 发布:x431pro软件下载 编辑:程序博客网 时间:2024/05/29 04:35
 

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也肯定是指这一个地址,不信试试。
4 DEBUG命令
——————-继续小抄—————-
前面已学过:显示存储单元命令 D
再学一个命令
(1)修改存储单元命令 E

格式1:E[起始地址] [内容表]

格式2:E[地址]

功能:格式1按内容表的内容修改从起始地址开始的多个存储单元内容,即用内容表指定的内容来代替存储单元当前内容。

例如:—E DS:0100 'VAR' 12 34

表示从DS:0100 为起始单元的连续五个字节单元内容依次被修改为

'V'、'A'、'R'、12H、34H。

格式2是逐个修改指定地址单元的当前内容。

如:—E DS:0010

156F:0010 41.5F

其中156F:0010单元原来的值是41H,5FH为输入的修改值。若只修改一个单元的内容,这时按回车键即可;若还想继续修改下一个单元内容,此时应按空格键,就显示下一个单元的内容,需修改就键入新的内容,不修改再按空格跳过,如此重复直到修改完毕,按回车键返回DEBUG“-”提示符。如果在修改过程中,将空格键换成按“-”键,则表示可以修改前一个单元的内容。

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

5 使用DOS时,汇编用户可以从DOS操作系统中得到什么?
现在编程,通常很多功能都是通过调用系统API。很多高级语言都直接把这些API包装起来,以系统接口或函数的方式提供给用户,那么汇编函数都能得到什么呢?
首先,汇编用户有很多东西可以调用。他们主要是:
5.1 BIOS提供的接口。现在硬件与软件的区分已越来越不明显,很多硬件不仅仅是电路,而还要提供一些固化写入硬件的一部分“程序”,这些程序以ROM的方式出现,汇编用户最大的好处就是可以直接使用这些“程序”,这些使用不仅功能强大,而且效率非常高。
5.2 DOS功能调用,作为操作系统也象BIOS一样向用户提供了相应的“程序”。这些程序在很大程序上扩充了BIOS。与BIOS不同的是,这部分程序放在内存中,它可以被修改。而BIOS中不能再修改。
==========================================================
以上两种接口都通过一种相同的格式调用,这些程序统称为“中断”,现在先不要理解中断的本意,你现在可以认为是系统提供给你的函数。
============================================================
5.3 系统共享数据区。编过程序的人都知道全局变量的好处,全局变量方便之外在于任何函数、过程都可以调用、读取、修改。全局变量不足之处是危险性,有一个过程改了这个变量值,其它的也得跟着改变了。DOS操作系统同样也提供了这样的共享数据区,该区是整个系统的共享区,任何程序都可以查找、修改。当然,修改某处必然会对其它程序造成影响。

6 再谈中断
前面5.2已提到中断了,现在问题是不同硬件不一样,即使相同硬件的ROM,不同版本,各个BIOS中断程序所处的位置也不一样,DOS中断也一样,不同版本、不同配置,在内存位置也不一样。那么你使用某一个中断,系统怎么知道你使用的那个中断程序在哪呢?
为了解决这一问题,DOS会在启动的时候,把所有这些(BIOS和DOS)中断的首地址保存到一个地址。这个地址很容易记,这段地址是内存的绝对零地址(0000:0000)。前面已讲过,每个地址在汇编程序员角度来看是二维的,也就是分为段地址和偏移地址。每个地址各占两个字节,所以要表示这个二维地址需要4个字节。所以每个中断首地址由4个字节表示。一共256个中断,占用了1024个字节的位置。
另外需要注意的是,这4个表示地址的字节,数据是由低向高的。比如12 34 56 78所表示的地址是:7856:3412。
一般用INT M表示中断M,如果M是十六进制,则在后面加上一个H。比如19号中断,十六进制应该是13H。所以该中断就是INT 13H。

7 再谈系统共享数据区
该共享数据区在绝对地址:0040:0000开始。

8 验证我上面说的内容
8.1 找中断
运行DEBUG后。输入D 0000:0000。显示绝对零地址的内容。
C:\>debug
-d 0:0
0000:0000 68 10 A7 00 8B 01 70 00-16 00 9B 03 8B 01 70 00 h…..p…….p.
0000:0010 8B 01 70 00 B9 06 0E 02-40 07 0E 02 FF 03 0E 02 ..p…..@…….
0000:0020 46 07 0E 02 0A 04 0E 02-3A 00 9B 03 54 00 9B 03 F…….:…T…
0000:0030 6E 00 9B 03 88 00 9B 03-A2 00 9B 03 FF 03 0E 02 n……………
0000:0040 A9 08 0E 02 99 09 0E 02-9F 09 0E 02 5D 04 0E 02 …………]…
0000:0050 A5 09 0E 02 0D 02 DC 02-B8 09 0E 02 8B 05 0E 02 …………….
0000:0060 02 0C 0E 02 08 0C 0E 02-13 0C 0E 02 AD 06 0E 02 …………….
0000:0070 AD 06 0E 02 A4 F0 00 F0-37 05 0E 02 71 84 00 C0 ……..7…q…
-u 0070:018B
0070:018B 1E PUSH DS
0070:018C 50 PUSH AX
0070:018D B84000 MOV AX,0040
0070:0190 8ED8 MOV DS,AX
0070:0192 F70614030024 TEST WORD PTR [0314],2400
0070:0198 754F JNZ 01E9
0070:019A 55 PUSH BP
0070:019B 8BEC MOV BP,SP
0070:019D 8B460A MOV AX,[BP+0A]
0070:01A0 5D POP BP
0070:01A1 A90001 TEST AX,0100
0070:01A4 7543 JNZ 01E9
0070:01A6 A90002 TEST AX,0200
0070:01A9 7422 JZ 01CD
首先,D命令把中断首地址显示出来。每4个表示一个地址。其中INT 0的中断首地址为:00A7:1068,INT 1的中断地址为:0070:018B…….0070:018B是中断3的首地址。后面那个U命令就表示显示该地址的“中断程序”的内存。
你们可以试着找找INT 13H的位置在哪。
8.2 验证系统共享数据区
系统共享数据区内容极为丰富,我实在记不住哪么多了。我曾记在一个本上,可惜那个本早在N年前(3<n<6)就丢了。兄弟们谁找到这个地址的内容,一定要贴上来,这里有东西可以让大家眼界大开。
前几年,我用的286计算机是黑白显示器(555555~~~~~~~~~,别嫌我老、旧、慢呀),可当时有个游戏非要彩显,不是彩显不让运行。我就是改了这个区的某一个位,让哪游戏“以为”我用的是彩显,于是游戏能用了。虽然不好看,但总能用。
在DOS下,你每按一个键,系统都会记下来,下面我们一起找找这个键盘缓冲区的地址。知道这个地址,你就可以作一个“虚拟”键盘,通过发命令来模拟某个人在按键。这个地址位于:0040:001E。 其中每个键有两个字节,一个字节是ASCII码,一个是扫描码。共16个。
C:\>debug
-d 40:0
0040:0000 F8 03 F8 02 E8 03 E8 02-BC 03 78 03 78 02 80 9F ……….x.x…
0040:0010 22 C8 00 80 02 28 00 00-00 00 2A 00 2A 00 20 39 "….(….*.*. 9
0040:0020 34 05 30 0B 3A 27 30 0B-0D 1C 64 20 20 39 34 05 4.0.:'0…d 94.
0040:0030 30 0B 3A 27 30 0B 0D 1C-71 10 0D 1C 64 20 00 00 0.:'0…q…d ..
0040:0040 A2 00 C3 00 A2 AF 09 E1-C8 03 50 00 00 10 00 00 ……….P…..
0040:0050 00 18 00 00 00 00 00 00-00 00 00 00 00 00 00 00 …………….
0040:0060 0F 0C 00 D4 03 29 30 7F-03 00 C0 00 A1 B7 11 00 …..)0………
0040:0070 00 00 00 00 00 00 00 00-14 14 14 00 01 01 01 01 …………….
-d 0040:0000
0040:0000 F8 03 F8 02 E8 03 E8 02-BC 03 78 03 78 02 80 9F ……….x.x…
0040:0010 22 C8 00 80 02 28 00 00-00 00 2A 00 2A 00 3A 27 "….(….*.*.:'
0040:0020 30 0B 30 0B 30 0B 30 0B-0D 1C 64 20 20 39 30 0B 0.0.0.0…d 90.
0040:0030 30 0B 30 0B 30 0B 08 0E-08 0E 34 05 30 0B 00 00 0.0.0…..4.0…
0040:0040 1F 00 C3 00 A2 AF 09 E1-C8 03 50 00 00 10 00 00 ……….P…..
0040:0050 00 18 00 00 00 00 00 00-00 00 00 00 00 00 00 00 …………….
0040:0060 0F 0C 00 D4 03 29 30 7F-03 00 C0 00 24 B8 11 00 …..)0…..$…
0040:0070 00 00 00 00 00 00 00 00-14 14 14 00 01 01 01 01 …………….
-
既然是键盘缓冲区,每个输入的键都会显示在该区中,第一次我只输入了“d 40:0”,所以你可以在此后显示数据右边字符中找到这些字符,注意是间隔开的。
第二次我输入“d 0040:0000”,则右边显示的是“d 0040:0000”的内容。你可以找找。</n<6)就丢了。兄弟们谁找到这个地址的内容,一定要贴上来,这里有东西可以让大家眼界大开。