实验一:DEBUG的启动及其基本命令的使用
一.实验目的:
掌握DEBUG 的基本命令及其功能
二.实验操作步骤:
6.设堆栈指针SP=2000H,AX=3000H,BX=5000H;请仿照例程的格式编一程序段将AX和BX的内容进行交换。请用堆栈作为两寄存器交换内容的中间存储单元,用DEBUG调试程序进行汇编与调试。
1)调用字处理程序建立源程序文件,源程序如下:
DATA SEGMENT
DATA1 DW 3000H,5000H
XX DW 2000H
DATA ENDS
PROGNAM SEGMENT
ASSUME CS:PROGNAM,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
MOV SP,XX
MOV BP,SP
MOV SI,0
MOV AX,DATA1[SI]
MOV BX,DATA1[SI+2]
PUSH AX
PUSH BX
POP AX
POP BX
MOV AH,4CH
INT 21H
PROGNAM ENDS
END START
2).在DOS环境下,用汇编程序MASM对源文件汇编产生目标文件OBJ,命令格式如下:
F:\masm5>masm one1.asm
经过汇编后源程序为:0 Warning Errors
0 Severe Errors。
即为汇编通过
3). 用连接程序link产生执行文件exe
F:\masm5>link one1.obj
4).用DEBUG调试程序
调用格式如下:
F:\masm5>debug one1.exe
此时,DEBUG已将执行程序装入内存,可直接用g命令运行程序。
-g
Match.
对程序进行反汇编:
-u
0B9B:0000 B89A0B MOV AX,0B9A
0B9B:0003 8ED8 MOV DS,AX
0B9B:0005 8B260400 MOV SP,[0004]
0B9B:0009 8BEC MOV BP,SP
0B9B:000B BE0000 MOV SI,0000
0B9B:000E 8B840000 MOV AX,[SI+0000]
0B9B:0012 8B9C0200 MOV BX,[SI+0002]
0B9B:0016 50 PUSH AX
0B9B:0017 53 PUSH BX
0B9B:0018 58 POP AX
0B9B:0019 5B POP BX
0B9B:001A B44C MOV AH,4C
0B9B:001C CD21 INT 21
0B9B:001E F6EB IMUL BL
反汇编后,与源程序的要求相符合
堆栈指令运行前AX,BX的内容
-g16
AX=3000 BX=5000 CX=002E DX=0000 SP=2000 BP=2000 SI=0000 DI=0000
DS=0B9A ES=0B8A SS=0B9A CS=0B9B IP=0016 NV UP EI PL NZ NA PO NC
0B9B:0016 50 PUSH AX
堆栈指令执行后ZX,BX的值如下所示:
-g1A
AX=5000 BX=3000 CX=002E DX=0000 SP=2000 BP=2000 SI=0000 DI=0000
DS=0B9A ES=0B8A SS=0B9A CS=0B9B IP=001A NV UP EI PL NZ NA PO NC
0B9B:001A B44C MOV AH,4C
由以上可知:AX与BX的内容得到了交换
5)汇编以及调试中所遇到的问题:
1.MOv语句比较容易出现错误
対源程序进行汇编时无法通过,编程序时应该多注意语法错误。
2.使用debug进行调试时,忘记让程序只运行到断点之前,导致查找出来的AX与BX的内容分并没有进行交换,还是保持原来的值不变,修正后在堆栈指令前先查出AX与BX的值,堆栈后在次查询Ax与BX的值,对比之后AX确实与BX的内容交换了。
实验二 内存操作数及寻址方法
一.实验目的:
1、熟练掌握DEBUG的常用命令,学会用DEBUG调试程序。
2、掌握数据在内存中的存放方式和内存操作数的几种寻址方式。
3、掌握简单指令的执行过程。
二.实验内容:
1、设堆栈指针SP=2000H,AX=3000H,BX=5000H;请编一程序段将AX和BX的内容进行交换。请用堆栈作为两寄存器交换内容的中间存储单元,用字处理程序编辑程序,用masm.exe和link.exe对源程序进行汇编程和连接,用DEBUG调试程序。
程序步骤与实验一的第六个题目一致
2、用masm和link 对以下程序进行汇编和连接,调试程序在DEBUG调试程序状态下进行。用单步执行的方法,分析每条指令源地址的形成过程,当数据传送完毕时,AX中的内容是什么。
DATA SEGMENT
ORG 0300H
A DB 12H,23H,34H,45H,56H,67H,78H,89H,9AH
DATA ENDS
PROGNAM SEGMENT
ASSUME CS:PROGNAM,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV AX,BX
MOV AX,0300H
MOV AX,[0300H]
MOV AX,[BX]
MOV SI,2
MOV AX,0001[BX]
MOV AX,[BX][SI]
MOV AX,0001[BX][SI]
MOV AH,4CH
INT 21H
PROGNAM ENDS
END START
1.在DOS环境下,用汇编程序MASM对源文件汇编产生目标文件OBJ,命令格式如下:
F:\masm5>masm one1.asm
经过汇编后源程序为:0 Warning Errors
0 Severe Errors。
即为汇编通过
2. 用连接程序link产生执行文件exe
F:\masm5>link one1.obj
3.用debug调试程序:
F:\masm5>debug one1.exe
-g
Match.
4.对程序进行反汇编:
-u
180E:0000 B8DD17 MOV AX,17DD
180E:0003 8ED8 MOV DS,AX
180E:0005 8BC3 MOV AX,BX
180E:0007 B80003 MOV AX,0300
180E:000A B80003 MOV AX,0300
180E:000D 8B07 MOV AX,[BX]
180E:000F BE0200 MOV SI,0002
180E:0012 8B4701 MOV AX,[BX+01]
180E:0015 8B00 MOV AX,[BX+SI]
180E:0017 8B4001 MOV AX,[BX+SI+01]
180E:001A B44C MOV AH,4C
180E:001C CD21 INT 21
180E:001E C406FF76 LES AX,[76FF]
由第五行:180E:000A B80003 MOV AX,0300
并没有执行源程序中的:
MOV AX,[0300H]指令,所以执行后AX的结果为0000;
应该对程序进行修改
修改后的原程序如下:
DATA SEGMENT
ORG 0300H
A DB 12H,23H,34H,45H,56H,67H,78H,89H,9AH
DATA ENDS
PROGNAM SEGMENT
ASSUME CS:PROGNAM,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV DX,0300H
MOV BX,DX
MOV AX,[BX]
MOV SI,2
MOV AX,0001[BX]
MOV AX,[BX][SI]
MOV AX,0001[BX][SI]
MOV AH,4CH
INT 21H
PROGNAM ENDS
END START
-u
180E:0000 B8DD17 MOV AX,17DD
180E:0003 8ED8 MOV DS,AX
180E:0005 BA0003 MOV DX,0300
180E:0008 8BDA MOV BX,DX
180E:000A 8B07 MOV AX,[BX]
180E:000C BE0200 MOV SI,0002
180E:000F 8B4701 MOV AX,[BX+01]
180E:0012 8B00 MOV AX,[BX+SI]
180E:0014 8B4001 MOV AX,[BX+SI+01]
180E:0017 B44C MOV AH,4C
180E:0019 CD21 INT 21
180E:001B 057183 ADD AX,8371
180E:001E C406FF76 LES AX,[76FF]
使用单步执行方法分析每条指令源地址的形成过程:
将数据段的首地址存入寄存器AX中
-t
AX=17DD BX=0000 CX=032B DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=17CD ES=17CD SS=17DD CS=180E IP=0003 NV UP EI PL NZ NA PO NC
180E:0003 8ED8 MOV DS,AX
把AX的值作为DS的首地址
-t
AX=17DD BX=0000 CX=032B DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=17DD ES=17CD SS=17DD CS=180E IP=0005 NV UP EI PL NZ NA PO NC
180E:0005 BA0003 MOV DX,0300
-t
AX=17DD BX=0000 CX=032B DX=0300 SP=0000 BP=0000 SI=0000 DI=0000
DS=17DD ES=17CD SS=17DD CS=180E IP=0008 NV UP EI PL NZ NA PO NC
180E:0008 8BDA MOV BX,DX
-t
AX=17DD BX=0300 CX=032B DX=0300 SP=0000 BP=0000 SI=0000 DI=0000
DS=17DD ES=17CD SS=17DD CS=180E IP=000A NV UP EI PL NZ NA PO NC
180E:000A 8B07 MOV AX,[BX] DS:0300=2312
将偏移量BX存到寄存器AX中
-t
AX=2312 BX=0300 CX=032B DX=0300 SP=0000 BP=0000 SI=0000 DI=0000
DS=17DD ES=17CD SS=17DD CS=180E IP=000C NV UP EI PL NZ NA PO NC
180E:000C BE0200 MOV SI,0002
将0002赋值给SI
-t
AX=2312 BX=0300 CX=032B DX=0300 SP=0000 BP=0000 SI=0002 DI=0000
DS=17DD ES=17CD SS=17DD CS=180E IP=000F NV UP EI PL NZ NA PO NC
180E:000F 8B4701 MOV AX,[BX+01] DS:0301=3423
-t
AX=3423 BX=0300 CX=032B DX=0300 SP=0000 BP=0000 SI=0002 DI=0000
DS=17DD ES=17CD SS=17DD CS=180E IP=0012 NV UP EI PL NZ NA PO NC
180E:0012 8B00 MOV AX,[BX+SI] DS:0302=4534
-t
AX=4534 BX=0300 CX=032B DX=0300 SP=0000 BP=0000 SI=0002 DI=0000
DS=17DD ES=17CD SS=17DD CS=180E IP=0014 NV UP EI PL NZ NA PO NC
180E:0014 8B4001 MOV AX,[BX+SI+01] DS:0303=5645
-t
AX=5645 BX=0300 CX=032B DX=0300 SP=0000 BP=0000 SI=0002 DI=0000
DS=17DD ES=17CD SS=17DD CS=180E IP=0017 NV UP EI PL NZ NA PO NC
180E:0017 B44C MOV AH,4C
;系统功能调用的功能号:4C 功能:带返回码结束
-t
AX=4C45 BX=0300 CX=032B DX=0300 SP=0000 BP=0000 SI=0002 DI=0000
DS=17DD ES=17CD SS=17DD CS=180E IP=0019 NV UP EI PL NZ NA PO NC
180E:0019 CD21 INT 21
段中指;
有以上可知经过调试后AX=5645H
实验三 算术运算指令
一.实验目的
1.学习算术运算指令的用法。
2.熟悉在PC机上编辑、汇编、连接、调试和运行汇编语言程序的过程。
二.实验内容
编写三个完整的汇编语言源程序,完成以下计算。其中X、Y、Z、R、W均为存放16位带符号数单元的地址。
(1)Z←W+(Z-X)
(2)Z←W-(X+6)-(R+9)
(3)Z←(W*X)/(Y+6),R←余数
三.实验操作步骤:
(1)Z←W+(Z-X)
1)实验的源程序如下:
DATA SEGMENT
X DW 2567H
W DW 5841H
Z DW 36C2H
DATA ENDS
PROGNAM SEGMENT
ASSUME CS:PROGNAM,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV SI,0
MOV AX,X
SUB [Z],AX ;(Z-X)
MOV AX,[W]
ADC [Z],AX ;W+(Z-X)
MOV AH,4CH
INT 21H
PROGNAM ENDS
END START
2)对程序进行反汇编:
-u
0B9B:0000 B89A0B MOV AX,0B9A
0B9B:0003 8ED8 MOV DS,AX
0B9B:0005 BE0000 MOV SI,0000
0B9B:0008 A10000 MOV AX,[0000]
0B9B:000B 29060400 SUB [0004],AX
0B9B:000F A10200 MOV AX,[0002]
0B9B:0012 11060400 ADC [0004],AX
0B9B:0016 B44C MOV AH,4C
0B9B:0018 CD21 INT 21
0B9B:001A 46 INC SI
0B9B:001B FE8946F6 DEC BYTE PTR [BX+DI+F646]
0B9B:001F EB06 JMP 0027
反汇编后,以上结果可以看出与源程序相符合
查询:
-d0b9a:0000,000f
0B9A:0000 67 25 41 58 C2 36 00 00-00 00 00 00 00 00 00 00 g%AX.6..........
执行到断点前
-gf
AX=2567 BX=0000 CX=002A DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=0B9A ES=0B8A SS=0B9A CS=0B9B IP=000F NV UP EI PL NZ AC PO NC
0B9B:000F A10200 MOV AX,[0002] DS:0002=5841
查询执行后的结果:
-d0b9a:0000,000f
0B9A:0000 67 25 41 58 5B 11 00 00-00 00 00 00 00 00 00 00 g%AX[...........
36c2H-2567H=115BH 满足题意得到Z-X的值
-t2
AX=5841 BX=0000 CX=002A DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=0B9A ES=0B8A SS=0B9A CS=0B9B IP=0012 NV UP EI PL NZ AC PO NC
0B9B:0012 11060400 ADC [0004],AX DS:0004=115B
AX=5841 BX=0000 CX=002A DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=0B9A ES=0B8A SS=0B9A CS=0B9B IP=0016 NV UP EI PL NZ NA PE NC
0B9B:0016 B44C MOV AH,4C
-d0b9a:0000,000f
0B9A:0000 67 25 41 58 9C 69 00 00-00 00 00 00 00 00 00 00 g%AX.i..........
115BH+5841H=699CH 得到W+(Z-X)的值
(2)Z←W-(X+6)-(R+9)
DATA SEGMENT
X DW 2674H
W DW 7046H
R DW 310CH
Z DW ?
DATA ENDS
PROGNAM SEGMENT
ASSUME CS:PROGNAM,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV SI,0
ADC [X],0006H
ADC [R],0009H
MOV AX,[X]
SUB [W],AX
MOV AX,[R]
SUB [W],AX
MOV AX,[W]
MOV [Z],AX
MOV AH,4CH
INT 21H
PROGNAM ENDS
END START
对程序进行反汇编:
-u
0B9B:0000 B89A0B MOV AX,0B9A
0B9B:0003 8ED8 MOV DS,AX
0B9B:0005 BE0000 MOV SI,0000
0B9B:0008 8316000006 ADC WORD PTR [0000],+06
0B9B:000D 8316040009 ADC WORD PTR [0004],+09
0B9B:0012 A10000 MOV AX,[0000]
0B9B:0015 29060200 SUB [0002],AX
0B9B:0019 A10400 MOV AX,[0004]
0B9B:001C 29060200 SUB [0002],AX
-u
0B9B:0020 A10200 MOV AX,[0002]
0B9B:0023 A30600 MOV [0006],AX
0B9B:0026 B44C MOV AH,4C
0B9B:0028 CD21 INT 21
0B9B:002A FF76F6 PUSH [BP-0A]
0B9B:002D B8D205 MOV AX,05D2
0B9B:0030 50 PUSH AX
0B9B:0031 FF362421 PUSH [2124]
0B9B:0035 E81864 CALL 6450
0B9B:0038 83C408 ADD SP,+08
0B9B:003B C45E06 LES BX,[BP+06]
0B9B:003E 26 ES:
0B9B:003F 837F0600 CMP WORD PTR [BX+06],+00
-d0b9a:0000,000F
0B9A:0000 7A 26 46 50 15 31 00 00-00 00 00 00 00 00 00 00 z&FP.1..........
-g12
AX=0B9A BX=0000 CX=003A DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=0B9A ES=0B8A SS=0B9A CS=0B9B IP=0012 NV UP EI PL NZ AC PO NC
0B9B:0012 A10000 MOV AX,[0000] DS:0000=267A
-d0b9a:0000,000f
0B9A:0000 7A 26 46 50 15 31 00 00-00 00 00 00 00 00 00 00 z&FP.1..........
2674H+6=267AH;310cH+9=3115H;分别表示X+6,R+9的值;
-g26
AX=F8B7 BX=0000 CX=003A DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=0B9A ES=0B8A SS=0B9A CS=0B9B IP=0026 NV UP EI NG NZ NA PE CY
0B9B:0026 B44C MOV AH,4C
-d0b9a:0000
0B9A:0000 7A 26 B7 18 15 31 B7 18-00 00 00 00 00 00 00 00 z&...1..........
0B9A:0010 B8 9A 0B 8E D8 BE 00 00-83 16 00 00 06 83 16 04 ................
0B9A:0020 00 09 A1 00 00 29 06 02-00 A1 04 00 29 06 02 00 .....)......)...
0B9A:0030 A1 02 00 A3 06 00 B4 4C-CD 21 FF 76 F6 B8 D2 05 .......L.!.v....
0B9A:0040 50 FF 36 24 21 E8 18 64-83 C4 08 C4 5E 06 26 83 P.6$!..d....^.&.
0B9A:0050 7F 06 00 74 09 A1 A4 07-39 86 72 FF 76 0A FF 36 ...t....9.r.v..6
0B9A:0060 24 21 B8 DD 05 EB 30 90-80 3E 60 08 00 74 21 8B $!....0..>`..t!.
0B9A:0070 9E 72 FF 8B 36 D2 25 80-38 00 74 0A FF 36 24 21 .r..6.%.8.t..6$!
7046H-267AH-3115H=187BH;实现了:W-(X+6)-(R+9)
(3)Z←(W*X)/(Y+6),R←余数
1.源程序如下:
DATA SEGMENT
X DW 5201H
W DW 1357H
Y DW 3671H
R DW ?
Z DW ?
DATA ENDS
PROGNAM SEGMENT
ASSUME CS:PROGNAM,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV AX,X
IMUL [W]
ADD [Y],0006H
IDIV [Y]
MOV [Z],AX
MOV [R],DX
MOV AH,4CH
INT 21H
PROGNAM ENDS
END START
-u
0B9B:0000 B89A0B MOV AX,0B9A
0B9B:0003 8ED8 MOV DS,AX
0B9B:0005 A10000 MOV AX,[0000]
0B9B:0008 F72E0200 IMUL WORD PTR [0002]
0B9B:000C 8306040006 ADD WORD PTR [0004],+06
0B9B:0011 F73E0400 IDIV WORD PTR [0004]
0B9B:0015 A30800 MOV [0008],AX
0B9B:0018 89160600 MOV [0006],DX
0B9B:001C B44C MOV AH,4C
0B9B:001E CD21 INT 21
-gc
AX=F157 BX=0000 CX=0030 DX=0631 SP=0000 BP=0000 SI=0000 DI=0000
DS=0B9A ES=0B8A SS=0B9A CS=0B9B IP=000C OV UP EI PL NZ NA PO CY
0B9B:000C 8306040006 ADD WORD PTR [0004],+06 DS:0004=3671
-g15
AX=1D1E BX=0000 CX=0030 DX=1465 SP=0000 BP=0000 SI=0000 DI=0000
DS=0B9A ES=0B8A SS=0B9A CS=0B9B IP=0015 NV UP EI PL NZ NA PE NC
0B9B:0015 A30800 MOV [0008],AX DS:0008=0000
-g1c
AX=1D1E BX=0000 CX=0030 DX=1465 SP=0000 BP=0000 SI=0000 DI=0000
DS=0B9A ES=0B8A SS=0B9A CS=0B9B IP=001C NV UP EI PL NZ NA PE NC
0B9B:001C B44C MOV AH,4C
-d0b9a:0006
0B9A:0000 65 14-1E 1D 00 00 00 00 00 00 e.........
0B9A:0010 B8 9A 0B 8E D8 A1 00 00-F7 2E 02 00 83 06 04 00 ................
0B9A:0020 06 F7 3E 04 00 A3 08 00-89 16 06 00 B4 4C CD 21 ..>..........L.!
0B9A:0030 06 90 C7 46 F6 00 00 FF-76 F8 FF 76 F6 B8 D2 05 ...F....v..v....
0B9A:0040 50 FF 36 24 21 E8 18 64-83 C4 08 C4 5E 06 26 83 P.6$!..d....^.&.
0B9A:0050 7F 06 00 74 09 A1 A4 07-39 86 72 FF 76 0A FF 36 ...t....9.r.v..6
0B9A:0060 24 21 B8 DD 05 EB 30 90-80 3E 60 08 00 74 21 8B $!....0..>`..t!.
0B9A:0070 9E 72 FF 8B 36 D2 25 80-38 00 74 0A FF 36 24 21 .r..6.%.8.t..6$!
0B9A:0080 B8 E5 05 EB 12 90
......
实现了Z=(W*X)/(Y+6)=1465H,R←1D1EH
实验四 查表程序设计
一.实验目的:
1、熟练掌握编写汇编语言原程序的基本方法和基本框架。
2、掌握查表法和查表指令XLAT。
3、熟练使用DEBUG调试程序。
二.实验内容:
用查表的方法将一位十六进制数转换成与它相应的ASCII码,并将结果存放到ASCI单元中。
三.编程提示:
既然指定用查表的方法,那么首先要建立一个表TABLE。我们在表中按照十六进制数从小到大的顺序放入他们对应的ASCII码值。
DATA SEGMENT
TABLE DB 30H,31H,32H,33H,34H,35H,36H,37H
DB 38H,39H,41H,42H,43H,44H,45H,46H
HEX DB X ;X为待转换的十六进制数
ASCI DB ?;存放转换后的ASCII码
DATA ENDS
四、实验操作:
1.实验源程序如下:
DATA SEGMENT
TABLE DB 30H,31H,32H,33H,34H,35H,36H,37H
DB 38H,39H,41H,42H,43H,44H,45H,46H
HEX DB 0AH ;0AH为待转换的十六进制数
ASCI DB ?;存放转换后的ASCII码
DATA ENDS
PROGNAM SEGMENT
ASSUME CS:PROGNAM,DS:DATA
START:MOV AX,DATA
MOV DS,AX
MOV BX,OFFSET TABLE
MOV AL,HEX
XLAT TABLE
MOV ASCI,AL
MOV AH,4CH
INT 21H
PROGNAM ENDS
END START
使用Debug调试:
E:\masm5>debug one1.exe
先对程序进行反汇编:
-u
0BB3:0000 B8B10B MOV AX,0BB1
0BB3:0003 8ED8 MOV DS,AX
0BB3:0005 BB0000 MOV BX,0000
0BB3:0008 A01000 MOV AL,[0010]
0BB3:000B D7 XLAT
0BB3:000C A21100 MOV [0011],AL
0BB3:000F B44C MOV AH,4C
0BB3:0011 CD21 INT 21
0BB3:0013 C404 LES AX,[SI]
0BB3:0015 50 PUSH AX
0BB3:0016 8D867CFF LEA AX,[BP+FF7C]
0BB3:001A 50 PUSH AX
0BB3:001B E8446E CALL 6E62
0BB3:001E 83C406 ADD SP,+06
由以上反汇编可得所查数据的段首地址为0bb1,偏移量为:0011
-gf
AX=0B41 BX=0000 CX=0033 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=0BB1 ES=0BA1 SS=0BB1 CS=0BB3 IP=000F NV UP EI PL NZ NA PO NC
0BB3:000F B44C MOV AH,4C
-d0bb1:0011,0019
-d0bb1:0010 41 00 00 00 00 00 00-00 00 A…………
.
由上面的内容易知0AH的ASCII码为41
五、调试中所遇到的问题:
1.指令输入错误
立即数传送给段寄存器DS时,错误的使用了 mov DS,DATA
这在程序会变时产生错误
经过修改 mov AX,DATA
Mov DS,AX
将DATA传入到DS当中
2.程序基本框架错误
刚开始不太熟悉程序的基本框架,虽然汇编通过,没有错误,但是在执行程序或者使用debug调试程序时,程序无反应,这是由于结构框架错误导致的
通过书本上的例题,对程序框架进行改进
3.调试让程序运行到中断点之前,但是在查询时不知道所要查询的数据的地址以及其范围,这就使得查询出来的数据太多也比较难找,所以应该确定所要查询数据的地址范围,以方便查找。