7) 现在,我们不但要编写一个汇编程序,而且我们还要把它存盘
(下面这个程序就要比原来的程序复杂一点了-显示输出:"ABC")
PROMPT> DEBUG<按回车>(运行DEBUG程序;系统默认启始IP寄存器值为100h)
-A 100<按回车> (用汇编语言编写一个程序,启始地址是100h)
MOV AH,02<按回车> (选择DOS的02号功能调用, 显示输出)
MOV DL,<按回车> (在DX寄存器的后八位存入41h,41h就是大写A的ASCII码)
INT 21<按回车> (当AH=02时这是DOS显示输出的中断号,显示"A")
MOV DL,42<按回车> (在DX寄存器的后八位存入41h,41h就是大写B的ASCII码)
INT 21<按回车> (当AH=02时这是DOS显示输出的中断号,显示"B")
MOV DL,43<按回车> (在DX寄存器的后八位存入41h,41h就是大写C的ASCII码)
INT 21<按回车> (当AH=02时这是DOS显示输出的中断号,显示"C")
INT 20<按回车> (程序结束,退出DEBUG)
<按回车> (结束汇编命令输入,回到DEBUG命令输入)
-R BX<按回车> (查看寄存器BX的值)
:0000<按回车> (设置BX为0000h,这是程序的结尾地址是BX:CX)
(注意,只要BX = 0000, 文件的大小就小于 < 64 Kb.)
-R CX<按回车> (设置CX为Fh,这是程序的长度:16位)
:0010<按回车> (现在我们可以把这个16字节的程序写入硬盘了)
-N printabc.com<按回车> (将要存盘的程序命名)
-W<按回车> (把这十六字节写到文件里面)
-Q<按回车> (退出DEBUG)
PROMPT> DIR printabc.com<按回车>
这里将会报告这个文件的大小是16字节 (10h 字节).
PROMPT> printabc.com<按回车>
会马上在屏幕上打印出"ABC"
C:\WINDOWS>DEBUG
-A 100
127C:0100 MOV AH,02
127C:0102 MOV DL,41
127C:0104 INT 21
127C:0106 MOV DL,42
127C:0108 INT 21
127C:010A MOV DL,43
127C:010C INT 21
127C:010E INT 20
127C:0110
-R
AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=127C ES=127C SS=127C CS=127C IP=0100 NV UP EI PL NZ NA PO NC
127C:0100 B402 MOV AH,02
-R BX
BX 0000
:
-R CX
CX 0000
:0010
-N PRINTABC.COM
-W
Writing 00010 bytes
-Q
C:\WINDOWS>DIR PRINTABC.COM
Volume in drive C has no label
Volume Serial Number is 28FB-70BA
Directory of C:\WINDOWS
PRINTABC COM 16 03-21-01 11:02 PRINTABC.COM
1 file(s) 16 bytes
0 dir(s) 557,711,360 bytes free
C:\WINDOWS>PRINTABC
ABC
C:\WINDOWS>
这里可以有人告诉我,为什么要存入是BX:CX代表程序长度吗?(写信给译者,谢谢)
返回目录
8) 现在,我们试一试查看一个已经编好的程序:
PROMPT> DEBUG<按回车>(运行DEBUG程序在CS:IP = CS:0100h)
-N printabc.com<按回车> (告诉电脑你想装载的程序名)
-L<按回车> (装载那个名字的程序进入内存)
-U 100 L 10<按回车> (从偏移地址100开始反汇编16位字节)
-R<按回车> (现在看看寄存器里面的内容)
注意:DEBUG本身是没有自动纪录文件大小的。
-G (运行被命名的程序,打印"ABC")
你将看到"ABC",然后是"Program terminated normally")
C:\WINDOWS>DEBUG
-N PRINTABC.COM
-L
-U 100 L 10
12A4:0100 B402 MOV AH,02
12A4:0102 B241 MOV DL,41
12A4:0104 CD21 INT 21
12A4:0106 B242 MOV DL,42
12A4:0108 CD21 INT 21
12A4:010A B243 MOV DL,43
12A4:010C CD21 INT 21
12A4:010E CD20 INT 20
-R
AX=0000 BX=0000 CX=0010 DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000
DS=12A4 ES=12A4 SS=12A4 CS=12A4 IP=0100 NV UP EI PL NZ NA PO NC
12A4:0100 B402 MOV AH,02
-G
ABC
Program terminated normally
返回目录
2004-5-26 09:45
IceMe
正式会员
积分 170
发贴 305
注册 2004-3-15
来自 紫色星云
状态 离线 9)你可以用DEBUG的计算功能计算程序的长度。
一开始的时候你的程序初始地址是在0100h:
107F:0100 MOV AH,02 <--这就是 100h
你的程序的最后一行在010Eh:
107F:010E INT 20 <--最后一行
然后,最后一条命令的下一行的地址是0110h:
107F:0110 <--这就是110h
所以,从0110h里减去100h我们得到得长度是10h 字节.
PROMPT> DEBUG<按回车>
-H 110 100<按回车> (这条命令将运算110h+100h和110h-100h)
0210 0010<按回车> (汇报 110h-100h=0010h; 16-byte 程序长度16位)
-Q<按回车> (退出DEBUG) |