资源描述
实验一 汇编语言运行环境及方法、简单程序设计
一、 实验目的
1. 熟悉汇编语言运行环境和方法
2. 了解如何使用汇编语言编制程序
3. 熟悉DEBUG有关命令的使用方法
4. 利用DEBUG掌握有关指令的功能
5. 利用DEBUG运行简单的程序段
二、 实验内容
1. 学会输入、编辑汇编语言程序
2. 学会对汇编语言程序进行汇编、连接和运行
3. 进入和退出DEBUG程序
4. 学会DEBUG中的D命令、E命令、R命令、T命令、A命令、G命令等的使用。对于U命令、N命令、W命令等,也应试一下。
三、 实验准备
1. 仔细阅读有关汇编语言环境的内容,事先准备好使用的例子。
2. 准备好源程序清单、设计好调试步骤、测试方法、对运行结果的分析。
3. 编写一个程序:比较2个字符串所含的字符是否相同。若相同则显示’Match.’,否则显示’No match!’;(1)仔细阅读有关DEBUG命令的内容,对有关命令,都要事先准备好使用的例子。
四、 实验步骤
1. 在DOS提示符下,进入MASM目录。
2. 在MASM目录下启动EDIT编辑程序,输入源程序,并对其进行汇编、连接和运行。
1) 调用edit输入、编辑源程序并保存在指定的目录中;例:
edit abc.asm
2) 用汇编程序masm对源程序汇编产生目标文件obj。例:
masm abc
不断修改错误,直至汇编通过为止。
3) 用连接程序link产生执行文件exe.例:link abc
4) 执行程序
可直接从DOS执行程序,即在DOS环境中,输入文件名即可。
3. 详细记录每一步所用的命令,以及查看结果的方法和具体结果。
五、 实验方法
有关汇编语言程序的上机过程请读者参阅清华大学出版社1991年出版的《IBMPC
汇编语言程序设计》的4.4节。在这里,我们举例简要说明该过程以及程序的调试方法。
例1.1 比较字符串sample
试编写一程序:比较两个字符串string1和string2所含的字符是否相同。若相同则显
示'Match',否则,显示'Nomatch'。
我们可以用串比较指令来完成程序所要求的功能。上机过程如下:
1. 调用字处理程序wordstar建立asm文件
当然也可以用其它编辑程序如pced或行编辑程序edlin来建立源文件。
C>WS
使用非文本文件方式(n命令)建立以sample.asm为文件名的源文件如图1.1所示。然后用CTRL K X命令将文件存入磁盘,并使系统返回DOS。
;PROGRAM TITLE GOES HERE--Compare string
;******************************************************************
datarea segment ;define data segment
stringl db 'Move the cursor backward.'
string2 db 'Move the cursor backward.'
;
mess1 db 'Match.',13,10,'$'
mess2 db 'No match!',13,10,'$'
datarea ends
;*******************************************************************
prognam segment ;define code segment
;-------------------------------------------------------------------------------------------------
main proc far
assume cs:prognam,ds:datarea,es:datarea
start: ;starting execution address
;set up stack for return
push ds ;save old data segment
sub ax,ax ;put zero in AX
push ax ;save it on stack
;set DS register to current data segment
mov ax,datarea ;datarea segment addr
mov ds,ax ;into DS register
mov es,ax ;into ES register
;MAIN PART OF PROGRAM GOES HERE
lea si,stringl
lea di,string2
cld
mov cx,25
repz cmpsb
jz match
lea dx,mess2
jmp short disp
match:
lea dx,mess1
disp:
mov ah,09
int 21h
ret ;return to DOS
main endp ;end of main part of program
;------------------------------------------------------------------------------------------------
prognam ends ;end of code segment
;****************************************************************
end start ;end assembly
图1.1例1的原文件sample.asm
2. 用汇编程序masm(或asm)对源文件汇编产生目标文件obj
C:\>masm sample;
Microsoft (R) Macro Assembler Version 5.00
Copyright (C) Microsoft Corp 1981-1985, 1987. All rights reserved.
51520 + 423584 Bytes symbol space free
0 Warning Errors
0 Severe Errors
3. 用连接程序link产生执行文件exe
C:\>link sample;
Microsoft (R) Overlay Linker Version 3.60
Copyright (C) Microsoft Corp 1983-1987. All rights reserved.
LINK : warning L4021: no stack segment
4. 执行程序
C:\>sample
Match.
终端上已显示出程序的运行结果。为了调试程序的另一部分,可重新进编辑程序修改两个字符串的内容,使它们互不相同。如修改后的数据区为:
;******************************************************************
datarea segment ;define data segment
stringl db 'Move the cursor backward.'
string2 db 'Move the cursor backward.'
;
mess1 db 'Match.',13,10,'$'
mess2 db 'No match!',13,10,'$'
datarea ends
;********************************************************************
然后,重新汇编、连接、执行,结果为:
C>sample
No mateh!
至此,程序已调试完毕,运行结果正确。
另一种调试程序的方法是使用debug程序。可调用如下:
C>debug sample.exe
此时,debug已将执行程序装入内存,可直接用g命令运行程序。
-g
Match.
Program terminated normally
为调试程序的另一部分,可在debug中修改字符串内容。可先用u命令显示程,以便了
解指令地址。显示结果如图1.2所示。
-u
0D36:0000 1E PUSH DS
0D36:0001 2BC0 SUB AX,AX
0D36:0003 50 PUSH AX
0D36:0004 B8310D MOV AX,0D31
0D36:0007 8ED8 MOV DS,AX
0D36:0009 8EC0 MOV ES,AX
0D36:000B 8D360000 LEA SI,[0000]
0D36:000F 8D3E1900 LEA DI,[0019]
0D36:0013 FC CLD
0D36:0014 B91900 MOV CX,0019
0D36:0017 F3 REPZ
0D36:0018 A6 CMPSB
0D36:0019 7406 JZ 0021
0D36:001B 8D163B00 LEA DX,[003B]
0D36:001F EB04 JMP 0025
-u
0D36:0021 8D163200 LEA DX,[0032]
0D36:0025 B409 MOV AH,09
0D36:0027 CD21 INT 21
0D36:0029 CB RETF
0D36:002A 8A4608 MOV AL,[BP+08]
0D36:002D 98 CBW
0D36:002E 50 PUSH AX
0D36:002F 8B4604 MOV AX,[BP+04]
0D36:0032 03C6 ADD AX,SI
0D36:0034 50 PUSH AX
0D36:0035 E858FF CALL FF90
0D36:0038 83C406 ADD SP,+06
0D36:003B 8BF8 MOV DI,AX
0D36:003D 83FFFF CMP DI,-01
0D36:0040 750C JNZ 004E
图1.2例1.1用debug调试时,u命令的显示情况
将端点设置在程序的主要部分以前。
-g0b
AX=0D31 BX=0000 CX=007A DX=0000 SP=FFFC BP=0000 SI=0000 DI=0000
DS=0D31 ES=0D31 SS=0D31 CS=0D36 IP=000B NV UP EI PL ZR NA PE NC
0D36:000B 8D360000 LEA SI,[0000] DS:0000=6F4D
根据其中指示的ds寄存器内容查看数据段的情况如下:
-d0
0D31:0000 4D 6F 76 65 20 74 68 65-20 63 75 72 73 6F 72 20 Move the cursor
0D31:0010 62 61 63 6B 77 61 72 64-2E 4D 6F 76 65 20 74 68 backward.Move th
0D31:0020 65 20 63 75 72 73 6F 72-20 62 61 63 6B 77 61 72 e cursor backwar
0D31:0030 64 2E 4D 61 74 63 68 2E-0D 0A 24 4E 6F 20 6D 61 d.Match...$No ma
0D31:0040 74 63 68 21 0D 0A 24 00-00 00 00 00 00 00 00 00 tch!..$.........
0D31:0050 1E 2B C0 50 B8 31 0D 8E-D8 8E C0 8D 36 00 00 8D .+.P.1......6...
0D31:0060 3E 19 00 FC B9 19 00 F3-A6 74 06 8D 16 3B 00 EB >........t...;..
0D31:0070 04 8D 16 32 00 B4 09 CD-21 CB 8A 46 08 98 50 8B ...2....!..F..P.
可用e命令修改数据区的字符串,操作如下:
-e29
0D31:0029 62.66 61.6f 63.72 6B.77 77.61 61.72 72.64
0D31:0030 64.2e 2E.20
再次用d命令查看修改结果。
-d0
0D31:0000 4D 6F 76 65 20 74 68 65-20 63 75 72 73 6F 72 20 Move the cursor
0D31:0010 62 61 63 6B 77 61 72 64-2E 4D 6F 76 65 20 74 68 backward.Move th
0D31:0020 65 20 63 75 72 73 6F 72-20 66 6F 72 77 61 72 64 e cursor forward
0D31:0030 2E 20 4D 61 74 63 68 2E-0D 0A 24 4E 6F 20 6D 61 . Match...$No ma
0D31:0040 74 63 68 21 0D 0A 24 00-00 00 00 00 00 00 00 00 tch!..$.........
0D31:0050 1E 2B C0 50 B8 31 0D 8E-D8 8E C0 8D 36 00 00 8D .+.P.1......6...
0D31:0060 3E 19 00 FC B9 19 00 F3-A6 74 06 8D 16 3B 00 EB >........t...;..
0D31:0070 04 8D 16 32 00 B4 09 CD-21 CB 8A 46 08 98 50 8B ...2....!..F..P.
用g命令运行程序,结果为:
-g
No match!
Program terminated normally
用q命令退出debug。
-q
至此,程序已调试完毕。为了进一步数名debug命令的使用方法,我们再次重复上述程序的调试过程,只是使用e、a和f命令来修改数据区的内容而已。必须注意,由于在用debug调试程序时,只能修改当时有关的内存单元内容,因此重新用debug装入程序时,仍是原来在磁盘中的内容。操作如下:
C:\>debug sample.exe
-g0b
AX=0D31 BX=0000 CX=007A DX=0000 SP=FFFC BP=0000 SI=0000 DI=0000
DS=0D31 ES=0D31 SS=0D31 CS=0D36 IP=000B NV UP EI PL ZR NA PE NC
0D36:000B 8D360000 LEA SI,[0000] DS:0000=6F4D
-d0
0D31:0000 4D 6F 76 65 20 74 68 65-20 63 75 72 73 6F 72 20 Move the cursor
0D31:0010 62 61 63 6B 77 61 72 64-2E 4D 6F 76 65 20 74 68 backward.Move th
0D31:0020 65 20 63 75 72 73 6F 72-20 62 61 63 6B 77 61 72 e cursor backwar
0D31:0030 64 2E 4D 61 74 63 68 2E-0D 0A 24 4E 6F 20 6D 61 d.Match...$No ma
0D31:0040 74 63 68 21 0D 0A 24 00-00 00 00 00 00 00 00 00 tch!..$.........
0D31:0050 1E 2B C0 50 B8 31 0D 8E-D8 8E C0 8D 36 00 00 8D .+.P.1......6...
0D31:0060 3E 19 00 FC B9 19 00 F3-A6 74 06 8D 16 3B 00 EB >........t...;..
0D31:0070 04 8D 16 32 00 B4 09 CD-21 CB 46 FA 8B 5E FC C1 ...2....!.F..^..
-e29 'forward.'20
-d0
0D31:0000 4D 6F 76 65 20 74 68 65-20 63 75 72 73 6F 72 20 Move the cursor
0D31:0010 62 61 63 6B 77 61 72 64-2E 4D 6F 76 65 20 74 68 backward.Move th
0D31:0020 65 20 63 75 72 73 6F 72-20 66 6F 72 77 61 72 64 e cursor forward
0D31:0030 2E 20 4D 61 74 63 68 2E-0D 0A 24 4E 6F 20 6D 61 . Match...$No ma
0D31:0040 74 63 68 21 0D 0A 24 00-00 00 00 00 00 00 00 00 tch!..$.........
0D31:0050 1E 2B C0 50 B8 31 0D 8E-D8 8E C0 8D 36 00 00 8D .+.P.1......6...
0D31:0060 3E 19 00 FC B9 19 00 F3-A6 74 06 8D 16 3B 00 EB >........t...;..
0D31:0070 04 8D 16 32 00 B4 09 CD-21 CB 46 FA 8B 5E FC C1 ...2....!.F..^..
-g
No match!
Program terminated normally
可见这种e命令的方式避免使用ASCII码进入,对用户是比较方便的。其中最后一个20是空格键的ASCII码,以补足原来的内容恢复原状,具体如下:
-a0d31:29
0D31:0029 db 'backward.'
0D31:0032
-d0
0D31:0000 4D 6F 76 65 20 74 68 65-20 63 75 72 73 6F 72 20 Move the cursor
0D31:0010 62 61 63 6B 77 61 72 64-2E 4D 6F 76 65 20 74 68 backward.Move th
0D31:0020 65 20 63 75 72 73 6F 72-20 62 61 63 6B 77 61 72 e cursor backwar
0D31:0030 64 2E 4D 61 74 63 68 2E-0D 0A 24 4E 6F 20 6D 61 d.Match...$No ma
0D31:0040 74 63 68 21 0D 0A 24 00-00 00 00 00 00 00 00 00 tch!..$.........
0D31:0050 1E 2B C0 50 B8 31 0D 8E-D8 8E C0 8D 36 00 00 8D .+.P.1......6...
0D31:0060 3E 19 00 FC B9 19 00 F3-A6 74 06 8D 16 3B 00 EB >........t...;..
0D31:0070 04 8D 16 32 00 B4 09 CD-21 CB 56 FA 89 7E EE 8B ...2....!.V..~..
-g
Match.
由于a命令是汇编命令,因此信息是用汇编格式进入的。如果修改的是程序中的语句,方法也是相同的,下面我们还会看到这类的操作。现在再看一下用f命令修改数据区的方法。
C:\>debug sample.exe
-g0b
AX=0D31 BX=0000 CX=007A DX=0000 SP=FFFC BP=0000 SI=0000 DI=0000
DS=0D31 ES=0D31 SS=0D31 CS=0D36 IP=000B NV UP EI PL ZR NA PE NC
0D36:000B 8D360000 LEA SI,[0000] DS:0000=6F4D
-d0
0D31:0000 4D 6F 76 65 20 74 68 65-20 63 75 72 73 6F 72 20 Move the cursor
0D31:0010 62 61 63 6B 77 61 72 64-2E 4D 6F 76 65 20 74 68 backward.Move th
0D31:0020 65 20 63 75 72 73 6F 72-20 62 61 63 6B 77 61 72 e cursor backwar
0D31:0030 64 2E 4D 61 74 63 68 2E-0D 0A 24 4E 6F 20 6D 61 d.Match...$No ma
0D31:0040 74 63 68 21 0D 0A 24 00-00 00 00 00 00 00 00 00 tch!..$.........
0D31:0050 1E 2B C0 50 B8 31 0D 8E-D8 8E C0 8D 36 00 00 8D .+.P.1......6...
0D31:0060 3E 19 00 FC B9 19 00 F3-A6 74 06 8D 16 3B 00 EB >........t...;..
0D31:0070 04 8D 16 32 00 B4 09 CD-21 CB 56 FA 89 7E EE 8B ...2....!.V..~..
-f29 l9 'forward.'20
-g
展开阅读全文