比较两个字符串是否相等
一、实验内容
本实验将通过编写一个简单的汇编程序来比较两个字符串是否相等。程序将定义两个字符串 S1
和 S2
,比较它们是否完全匹配,并根据比较结果输出“Match!”或“No match!”。
二、实验步骤
-
初始化环境
在DOS环境下,先导航到包含MASM的目录。这是开始编程前的准备步骤,确保所有必要的工具都可用。 -
编辑和编译程序
以下是详细的程序开发步骤:a. 启动编辑器:在MASM目录下,打开EDIT编辑器来编写源代码。例如,输入
edit abc.asm
来创建或编辑名为abc.asm
的源文件。b. 汇编源程序:使用MASM汇编器对源代码进行汇编,生成目标文件(
.obj
)。例如,输入masm abc
。这个过程可能会揭示编码错误,需要反复修改直到代码正确汇编为止。c. 链接生成可执行文件:使用链接器
link
将目标文件转换为可执行文件(.exe
)。例如,输入link abc
。这一步是将编译好的代码转换成可以在DOS环境下运行的程序。d. 执行程序:最后,在DOS环境中直接运行程序。只需输入生成的文件名,例如
abc.exe
,即可执行并观察程序的行为。 -
记录和分析
在整个实验过程中,细致地记录每一个使用的命令,以及程序运行的结果。这不仅有助于跟踪实验步骤,也便于之后分析程序的行为和输出。特别是在调试阶段,详细的记录可以帮助识别和解决编程中遇到的问题。
注意:整个实验过程中,应保持耐心和细心,因为汇编语言编程通常比高级语言编程更为复杂和细节导向。每一步都可能对最终结果产生重大影响。
三、实验报告
1. 程序流程图和源程序清单
程序流程图
源程序清单
; 数据段定义
DATA SEGMENT
; 定义字符串S1,并结束于两个感叹号
S1 DB 'HELLO WORLD!!'
; 计算字符串S1的长度
LEN1 EQU $-S1
; 定义字符串S2,并结束于一个感叹号
S2 DB 'HELLO WORLD!'
; 计算字符串S2的长度
LEN2 EQU $-S2
; 定义匹配成功时显示的字符串
SAME DB 'Match!',0DH,0AH,'$'
; 定义匹配失败时显示的字符串
DIFFERENT DB 'No match!',0DH,0AH,'$'
DATA ENDS
; 代码段定义
CODE SEGMENT
; 设置段寄存器
ASSUME CS:CODE,DS:DATA
START:
; 初始化数据段
MOV AX,DATA
MOV DS,AX
MOV ES,AX
; 将S1的长度加载到CX
MOV CX,LEN1
; 比较S1和S2的长度
CMP CX,LEN2
; 如果长度不等,则跳转到NO标签
JNZ NO
; 加载S1的地址到SI
LEA SI,S1
; 加载S2的地址到DI
LEA DI,S2
; 清除方向标志,确保字符串从低地址向高地址比较
CLD
; 重复比较字符串,直到找到不匹配的字符或完成比较
REPE CMPSB
; 如果找到不匹配的字符,则跳转到NO标签
JNZ NO
; 加载匹配成功的消息地址到DX
LEA DX,SAME
; 跳转到显示消息
JMP DISPLAY
NO:
; 加载匹配失败的消息地址到DX
LEA DX,DIFFERENT
DISPLAY:
; 设置打印字符串的功能号
MOV AH,9
; 调用中断21H来打印字符串
INT 21H
; 设置程序结束的功能号
MOV AX,4C00H
; 调用中断21H来结束程序
INT 21H
CODE ENDS
END START
2. 如何启动和退出EDIT程序
EDIT启动
在命令行中直接输入edit启动edit文本编辑器:
退出EDIT
点击File,出现exit,点击exit退出
3. 如何对源程序进行汇编及编辑
Step1:编辑源程序
方法一:在DosBox中编写源程序
(1) 打开DosBox
(2) 在命令行输入edit
(3) 在Edit中编译程序
a) 编辑程序
b) 保存程序
c) 再进行完上述对源程序的编辑之后,在保存asm文件的位置找到1.ASM
方法二:在记事本或者其他除DosBox的软件中编写源程序
(1) 编写
(2) 保存文件格式为ASM
Step2:编译
输入要编译的源程序文件名:masm 文件名.asm,按三次回车键enter
Step3:连接
输入link 文件名.obj; 按三次回车键enter
Step4:运行
输入文件名.exe
4. 如何启动和退出DEBUG程序。
启动debug程序:在命令行输入debug 程序名.exe,进入debug
退出debug程序:输入-q, 退出
5. 整理每个DEBUG命令使用的方法,实际示例及执行结果。
DEBUG基本指令
(1) R命令(Register) 显示和修改寄存器
输入r:查看所有寄存器的值
输入r 寄存器名称:修改寄存器的值
(2) D命令(Dump) 内存16进制显示
a) 输入d:可以查看内存中的内容,
右边是每个内存单元中的数据对应的可显示的ASCII码字符,如果没有对应的ASCII字符,就显示“.”
b) 连续输入d,可以查看连续内存中的内容
c) 输入d 段地址:偏移地址:查看特定位置的内存数据
d) 输入d 段地址:起始偏移地址 结尾偏移地址:查看特定位置和特定范围的内存数据
e) 输入d 偏移地址、 d 起始偏移地址 结尾偏移地址:会将DS的内容作为段地址
(3) E命令(Enter) 修改内存字节
a) 输入 e 段地址:偏移地址 数据串 向指定编号的内存当中进行数据的写入操作,使用d命令来对该内存当中写入的数据进行查看
b) 输入 e 段地址:偏移地址 后按Enter也可以修改特定位置的内存数据,数据之间用空格隔开
(4) U命令(Unassemble) 反汇编
将内存中的机器指令翻译为汇编指令来进行查看,输入 u u 段地址:偏移地址
由3部分组成
最左边一列:是指令的地址段地址:偏移地址
中间那一列:是指令对应的机器指令
最右边一列:是汇编指令
(5) A命令(Assemble) 逐行汇编
以汇编指令的格式在内存中写入一条机器指令
输入a、a 段地址:偏移地址在这里插入代码片可以从某位置开始写入汇编指令
(6) T命令(Trace) 跟踪执行
单步执行一条机器指令
(7) h指令(Hex)十六进制
计算两个十六进制数的和与差
运行结果的前一个数是计算出来的和,后一个数是计算出来的差。计算结果均用十六进制形式表示
6. 启动DEBUG后,要装入某一个.EXE文件,应通过什么方法实现?
进入DOS,输入DEBUG xxx.exe,其中xxx为文件名