实验报告
系
班级
学号
姓名
指导教师 陆勤
实验一 汇编语言运行环境及方法、简单程序设计
一、程序说明
本程序用来比较两个字符串string1和string2所含的字符是否相同。若相同则显示‘Match’,否则显示‘Nomatch’。
在程序的数据段先定义两个字符串string1和string2,再定义两个字符串mess1和mess2,分别代表‘Match’和‘Nomatch’。再代码段比较字符串string1和string2,通过比较判断是否相同。若相同则显示‘Match’,否则显示‘Nomatch’ 二、结合你的调试过程,整理其中用到的debug命令的使用方法和效果截图,并解释每一步骤的结论
用汇编程序masm对源文件汇编产生目标文件obj C:\masm5\sample
用连接程序link尝试执行文件
exe
执行程序
使用debug程序调试
-g命令运行程序
-u命令显示程序,了解命令地址
-g0b将断点设置在程序的主要部分以前
-d0根据其中只是的ds寄存器内容查看数据段情况,显示地址0及地址0后面数据
e命令修改数据区的字符串
q命令退出
debug
t命令逐条跟踪程序的执行
e命令修改一段字符串
三、调试中遇到的问题及解决方法
E命令修改数据区的一个字符,而不是一段字符串
实验二 用DEBUG编程:使用堆栈段将
AX和BX的内容进行交换等
一、程序说明:
1、设堆栈指针SP=2000H,AX=3000H,BX=5000H;编一程序段将AX和BX的内容进行交换。请用堆栈作为两寄存器交换内容的中间存储单元,用DEBUG调试程序进行汇编与调试。
2、设DS=当前段地址,BX=0300H,SI=0002H;请用DEBUG的命令将存储器偏移地址300H~304H连续单元顺序装入0AH,0BH,0CH,0DH,0EH。在DEBUG状态下送入下面程序,并用单步执行的方法,分析每条指令源地址的形成过程,当数据传送完毕时,AX中的内容是什么。
二、调试说明 第一部分先将程序编好后,在DOS环境下用masm程序生成obj文件,再用link程序生成exe文件,然后进入debug进行调试,用-t命令逐步运行程序,查看AX和BX中内容的变化。如果发现AX和BX中的内容进行了交换,则说明程序运行成功。
进入debug程序,先用—u指令查看一下程序,结果如下:
用—t指令逐步调试,结果如下:
第二部分:如前面第一章最终生成可执行程序。也可进入进入debug进行编写,如下:
三:程序清单和执行结果: 第一个程序清单:
DATAS SEGMENT DATAS ENDS
STACKS SEGMENT STACKS ENDS CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS START: MOV AX,DATAS MOV DS,AX MOV AX,3000H MOV BX,5000H PUSH AX MOV AX,BX POP BX
MOV AH,4CH
INT 21H CODES ENDS END START
在debug 中进行调试,逐步执行结果:
第二个程序清单: DATAS SEGMENT DATAS ENDS CODES SEGMENT
ASSUME CS:CODES,DS:DATAS START: MOV AX,DATAS MOV DS,AX MOV BX,0300h MOV SI,0002h MOV AH,4CH INT 21H CODES ENDS END START
在debug中进行调试,逐步执行结果:
实验三、存储器块清零和内存块移动
一、 程序说明:
第一个程序是存储块清零。程序流程大概为首先设置起始地址,然后设置块长度,然后将当前地址内容清零,地址加1,然后查看是否清除完全,若没有则回到当前地址清零,然后再查看,直到地址内容清除完,结束程序。
第二个程序是内存块移动。程序流程框图为:首先设置块的源地址,然后设置筷的目的地址,然后再设置移动长度,然后按长度重复传送数据,然后结束。 二、 调试说明:
第一个程序在进入debug后,先用-u指令查看一下程序,再将断点设置在指令Loop again之后,通过指令-g加上指令Loop again后的地址,将程序运行到Loop again之后停止,然后再通过-d指令查看相关内存内容是否被清零。 第二个程序在进入到debug后,先用-u指令查看一下程序,再将断点设置在指令rep movsb之前,通过指令-g运行后,然后用-d指令查看一下内存块的相关内容,得到的结果如下:
三:源程序代码和执行结果:
实验一: data segment
block db 256 dup(55h) data ends
code segment
assume cs :code ,ds:data start proc near mov ax,data mov ds ,ax
mov bx,offset block mov cx,256 again:
mov [bx],byte ptr 0 inc bx
loop again jmp $
code ends
end start
实验二: 源代码:
地址块加一方法移动块的源程序: DATAS SEGMENT
SOURCE DB 256 DUP(055H) TARGET DB 256 DUP(0AAH) DATAS ENDS
STACKS SEGMENT STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,ES:DATAS,SS:STACKS START: MOV AX,DATAS MOV DS,AX MOV ES,AX
MOV SI,OFFSET SOURCE
MOV DI,OFFSET TARGET MOV CX,256 REP MOVSB MOV AH,4CH INT 21H CODES ENDS END START
第二部分地址块减一方法移动块的源程序: DATAS SEGMENT
SOURCE DB 256 DUP(055H) T ARGET DB 256 DUP(0AAH) DATAS ENDS
STACKS SEGMENT STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,ES:DATAS,SS:STACKS START: MOV AX,DATAS MOV DS,AX MOV ES,AX
MOV SI,OFFSET SOURCE ADD SI,255
MOV DI,OFFSET TARGET MOV CX,256
NEXT:MOV AL,[SI] MOV [DI],AL DEC SI INC DI LOOP NEXT MOV AH,0 MOV AH,4CH INT 21H
CODES ENDS END START 执行结果:
实验四 将键盘输入的小写字母用大写字母显示出来
一、 程序说明
本程序用来将小写字母转变为大写,并在屏幕上显示出来。先利用DOS功能调用INT21H的1号功能从键盘输入字符,然后判断输入的是否是小写字母,若不是小写字母,则显示输入出错,重新输入。若输入的是小写字母,则通过将其减去20h,从而变为大写字母。在通过DOS功能调用INT21H的2号功能显示出来。若输入的是Enter键,则结束程序。 二、 调试说明
调试程序可以在debug中进行,基本步骤和前面的实验大致相同,在软件Masm 集成实验环境 2008.4中编辑程序,则可以直接点击程序上的调试按钮,即可进行调试。调试时可通过-t指令来逐步运行程序,观察相关内容变化,来调试程序。
三:源程序代码和执行结果:
DATAS SEGMENT
string1 db ' this not is a zimu!Please input between a to z!',0ah,0dh,'$'
string2 db ' $'
DATAS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS
START:
MOV AX,DATAS
MOV DS,AX
L0:mov ah,1
int 21h
cmp al,0dh
jz exit
cmp al,'a'
jae L1
jb L3
L1: cmp al,'z'
jna L2
ja L3
L2:sub al,20h
mov cl,al
lea dx,string2
mov ah,9 int 21h
mov dl,0
mov dl,cl
mov ah,2
int 21h
mov dl,0ah
mov ah,2
int 21h
mov dl,0dh
mov ah,2
int 21h
jmp L0
L3: lea dx,string1
mov ah,9
int 21h
jmp L0
exit: MOV AH,4CH
int 21H codes ends end start 运行结果:
实验报告
系
班级
学号
姓名
指导教师 陆勤
实验一 汇编语言运行环境及方法、简单程序设计
一、程序说明
本程序用来比较两个字符串string1和string2所含的字符是否相同。若相同则显示‘Match’,否则显示‘Nomatch’。
在程序的数据段先定义两个字符串string1和string2,再定义两个字符串mess1和mess2,分别代表‘Match’和‘Nomatch’。再代码段比较字符串string1和string2,通过比较判断是否相同。若相同则显示‘Match’,否则显示‘Nomatch’ 二、结合你的调试过程,整理其中用到的debug命令的使用方法和效果截图,并解释每一步骤的结论
用汇编程序masm对源文件汇编产生目标文件obj C:\masm5\sample
用连接程序link尝试执行文件
exe
执行程序
使用debug程序调试
-g命令运行程序
-u命令显示程序,了解命令地址
-g0b将断点设置在程序的主要部分以前
-d0根据其中只是的ds寄存器内容查看数据段情况,显示地址0及地址0后面数据
e命令修改数据区的字符串
q命令退出
debug
t命令逐条跟踪程序的执行
e命令修改一段字符串
三、调试中遇到的问题及解决方法
E命令修改数据区的一个字符,而不是一段字符串
实验二 用DEBUG编程:使用堆栈段将
AX和BX的内容进行交换等
一、程序说明:
1、设堆栈指针SP=2000H,AX=3000H,BX=5000H;编一程序段将AX和BX的内容进行交换。请用堆栈作为两寄存器交换内容的中间存储单元,用DEBUG调试程序进行汇编与调试。
2、设DS=当前段地址,BX=0300H,SI=0002H;请用DEBUG的命令将存储器偏移地址300H~304H连续单元顺序装入0AH,0BH,0CH,0DH,0EH。在DEBUG状态下送入下面程序,并用单步执行的方法,分析每条指令源地址的形成过程,当数据传送完毕时,AX中的内容是什么。
二、调试说明 第一部分先将程序编好后,在DOS环境下用masm程序生成obj文件,再用link程序生成exe文件,然后进入debug进行调试,用-t命令逐步运行程序,查看AX和BX中内容的变化。如果发现AX和BX中的内容进行了交换,则说明程序运行成功。
进入debug程序,先用—u指令查看一下程序,结果如下:
用—t指令逐步调试,结果如下:
第二部分:如前面第一章最终生成可执行程序。也可进入进入debug进行编写,如下:
三:程序清单和执行结果: 第一个程序清单:
DATAS SEGMENT DATAS ENDS
STACKS SEGMENT STACKS ENDS CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS START: MOV AX,DATAS MOV DS,AX MOV AX,3000H MOV BX,5000H PUSH AX MOV AX,BX POP BX
MOV AH,4CH
INT 21H CODES ENDS END START
在debug 中进行调试,逐步执行结果:
第二个程序清单: DATAS SEGMENT DATAS ENDS CODES SEGMENT
ASSUME CS:CODES,DS:DATAS START: MOV AX,DATAS MOV DS,AX MOV BX,0300h MOV SI,0002h MOV AH,4CH INT 21H CODES ENDS END START
在debug中进行调试,逐步执行结果:
实验三、存储器块清零和内存块移动
一、 程序说明:
第一个程序是存储块清零。程序流程大概为首先设置起始地址,然后设置块长度,然后将当前地址内容清零,地址加1,然后查看是否清除完全,若没有则回到当前地址清零,然后再查看,直到地址内容清除完,结束程序。
第二个程序是内存块移动。程序流程框图为:首先设置块的源地址,然后设置筷的目的地址,然后再设置移动长度,然后按长度重复传送数据,然后结束。 二、 调试说明:
第一个程序在进入debug后,先用-u指令查看一下程序,再将断点设置在指令Loop again之后,通过指令-g加上指令Loop again后的地址,将程序运行到Loop again之后停止,然后再通过-d指令查看相关内存内容是否被清零。 第二个程序在进入到debug后,先用-u指令查看一下程序,再将断点设置在指令rep movsb之前,通过指令-g运行后,然后用-d指令查看一下内存块的相关内容,得到的结果如下:
三:源程序代码和执行结果:
实验一: data segment
block db 256 dup(55h) data ends
code segment
assume cs :code ,ds:data start proc near mov ax,data mov ds ,ax
mov bx,offset block mov cx,256 again:
mov [bx],byte ptr 0 inc bx
loop again jmp $
code ends
end start
实验二: 源代码:
地址块加一方法移动块的源程序: DATAS SEGMENT
SOURCE DB 256 DUP(055H) TARGET DB 256 DUP(0AAH) DATAS ENDS
STACKS SEGMENT STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,ES:DATAS,SS:STACKS START: MOV AX,DATAS MOV DS,AX MOV ES,AX
MOV SI,OFFSET SOURCE
MOV DI,OFFSET TARGET MOV CX,256 REP MOVSB MOV AH,4CH INT 21H CODES ENDS END START
第二部分地址块减一方法移动块的源程序: DATAS SEGMENT
SOURCE DB 256 DUP(055H) T ARGET DB 256 DUP(0AAH) DATAS ENDS
STACKS SEGMENT STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,ES:DATAS,SS:STACKS START: MOV AX,DATAS MOV DS,AX MOV ES,AX
MOV SI,OFFSET SOURCE ADD SI,255
MOV DI,OFFSET TARGET MOV CX,256
NEXT:MOV AL,[SI] MOV [DI],AL DEC SI INC DI LOOP NEXT MOV AH,0 MOV AH,4CH INT 21H
CODES ENDS END START 执行结果:
实验四 将键盘输入的小写字母用大写字母显示出来
一、 程序说明
本程序用来将小写字母转变为大写,并在屏幕上显示出来。先利用DOS功能调用INT21H的1号功能从键盘输入字符,然后判断输入的是否是小写字母,若不是小写字母,则显示输入出错,重新输入。若输入的是小写字母,则通过将其减去20h,从而变为大写字母。在通过DOS功能调用INT21H的2号功能显示出来。若输入的是Enter键,则结束程序。 二、 调试说明
调试程序可以在debug中进行,基本步骤和前面的实验大致相同,在软件Masm 集成实验环境 2008.4中编辑程序,则可以直接点击程序上的调试按钮,即可进行调试。调试时可通过-t指令来逐步运行程序,观察相关内容变化,来调试程序。
三:源程序代码和执行结果:
DATAS SEGMENT
string1 db ' this not is a zimu!Please input between a to z!',0ah,0dh,'$'
string2 db ' $'
DATAS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS
START:
MOV AX,DATAS
MOV DS,AX
L0:mov ah,1
int 21h
cmp al,0dh
jz exit
cmp al,'a'
jae L1
jb L3
L1: cmp al,'z'
jna L2
ja L3
L2:sub al,20h
mov cl,al
lea dx,string2
mov ah,9 int 21h
mov dl,0
mov dl,cl
mov ah,2
int 21h
mov dl,0ah
mov ah,2
int 21h
mov dl,0dh
mov ah,2
int 21h
jmp L0
L3: lea dx,string1
mov ah,9
int 21h
jmp L0
exit: MOV AH,4CH
int 21H codes ends end start 运行结果: