我们可以用U命令将十六进制的机器码反汇编(Unassemble)成汇编指令。你将发现每一行右边的汇编指令就是被汇编成相应的机器码,而8086实际上就是以机器码来执行程序。
1.输入 U100,106
1FED:0100 B201 MOV DL,01
1FED:0102 B402 MOV AH,02
1FED:0104 CD21 INT 21
1FED:0106 CD20 INT 20
DEBUG可以用R命令来查看、改变寄存器内容。CS:IP寄存器,保存了将执行指令地址。
1.输入R
AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=1FED ES=1FED SS=1FED CS=1FED IP=0100 NV UP EI PL NZ NA PO NC
1FED:0100 B201 MOV DL,01
当程序由DS:100开始执行,那么终止程序时,DEBUG会自动将IP内容重新设定为100。当你要将此程序做成一个独立的可执行文件,则可以用N命令对该程序命名。但一定要为COM文件,否则无法以DEBUG载入。
输入N SMILE.COM ;我们得告诉DEBUG程序长度:程序从100开始到106,故占用7
;字节。我们利用BX存放长度值高位部分,而以CX存放低位部分。
2.输入RBX ;查看 BX 寄存器的内容,本程序只有7个字节,故本步可省略
3.输入 RCX ;查看 CX 寄存器的内容
4.输入 7 ;程序的字节数
5.输入 W ;用W命令将该程序写入(Write)磁盘中
修行至此,我们便可以真正接触8086汇编指令了。 当我们写汇编语言程序的时候,通常不会直接将机器码放入内存中,而是打入一串助记符号(Mnemonic Symbols),这些符号比十六进制机器码更容易记住,此之谓汇编指令。助记符号,告诉CPU应执行何种运算。 也就是说,助忆符号所构成的汇编语言是为人设计的,而机器语言是对PC设计的。
现在,我们再来剖析一个可以将所有ASCII码显示出来的程序。
1. 输入 DEBUG
2. 输入 A100
3.输入 MOV CX,0100 ;装入循环次数
MOV DL,00 ;装入第一个ASCII码,随后每次循环装入新码
MOV AH,02
INT 21
INC DL ;INC:递增指令,每次将数据寄存器 DL 内的数值加 1
LOOP 0105 ;LOOP:循环指令,每执行一次LOOP,CX值减1,并跳
;到循环的起始地址105,直到CX为0,循环停止
INT 20
4.输入 G即可显示所有ASCII码
当我们想任意显示字符串,如:UNDERSTAND?,则可以使用DOS21H号中断9H号功能。输入下行程序,存盘并执行看看:
1.输入 A100
MOV DX,109 ;DS:DX = 字符串的起始地址
MOV AH,9 ;DOS的09h功能调用
INT 21 ;字符串输出
INT 20
DB ''UNDERSTAND?