《汇编语言程序设计》
实验报告
学院
班级
班级
姓名
学号、
实验一汇编运行环境及方法、简单程序设计
一、程序说明
本程序用来比较两个字符串string1和string2所含的字符是否相同。若相同则显示‘Match’,否则显示‘Nomatch’。
在程序的数据段先定义两个字符串string1和string2,再定义两个字符串mess1和mess2,分别代表‘Match’和‘Nomatch’。再代码段比较字符串string1和string2,通过比较判断是否相同。若相同则显示‘Match’,否则显示‘Nomatch’。
二、调试说明
我们可以通过这一简单的比较程序,熟悉汇编语言上机的过程。首先在EDIT 中编写好程序代码并以ASM形式保存,然后在汇编程序MASM中汇编代码,生成OBI文件,再在连接程序LINK中连接,生成可执行文件EXE,然后直接执行程序即可,至此基本的汇编语言程序操作完成,过程如下。
我们也可以利用DUBGU对已生成的程序进行调试
其中常用到的指令有:
用—g命令来运行程序,用—u命令来显示程序,用—d查看数据段情况,用—e或—f命令来修改需要改正的部分,用—t指令来逐步执行程序,用—r指令来查看寄存器和修改器的值,用—q命令用来退出debug程序。在这些命令的后面加上地址,可以将命令执行到相应的地方。其中每几个代码执行情况如下:
三:源程序和执行结果:
DATA SEGMENT
STRING1 DB 'Move the cursor backward.' STRING2 DB 'Move the cursor backward.' mess1 db 'match.',10,13,'$'
mess2 db 'no match.',10,13,'$'
DATA ENDS
code segment
main proc far
assume cs:code,ds:DATA,es:DATA
start:mov ax,DATA
mov ds,ax
mov es,ax
lea si,STRING1
lea di,STRING2
cld
mov cx,25
repz cmpsb
jz match
lea dx,mess2
jmp short disp
match:lea dx,mess1
disp:mov ah,9
int 21h
mov ah,4ch
int 21h
ret
main endp
code ends
end start
执行结果:
实验二用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)
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
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
执行结果
实验五:循环程序设计
一、程序说明
第一个程序是用来显示AL寄存器中的两位十六进位制数,通过DOS功能调用INT21H的2号功能显示出来。
第二个程序是用来判别键盘上输入的字符:若是1-9字符,则显示之;若为A-Z 或a-z字符,均显示“c”;若是回车字符
二、调试说明
调试程序可以在debug中进行,基本步骤和前面的实验大致相同,在软件Masm 集成实验环境2008.4中编辑程序,则可以直接点击程序上的调试按钮,即可进行调试。调试时可通过-t指令来逐步运行程序,观察程序是如何进行循环的。修改AL中的内容,可以通过-r指令来实现,如修改ax 中的内容,通过指令-r ax 来实现,如下图所示:
三:源程序代码和执行结果:第一源程序:
CODES SEGMENT
ASSUME CS:CODES START:
mov al,3eh
push ax
mov dl,al
mov cl,4
shr dl,cl
cmp dl,9
jbe next1
add dl,7
next1:add dl,30h
mov ah,2
int 21h
pop ax
mov dl,al
and dl,0fh
cmp dl,9
jbe next2
add dl,7
next2:add dl,30h
mov ah,2
int 21h
mov ah,4ch
int 21h
CODES ENDS
END START
执行结果:
第二源程序;
CODES SEGMENT
ASSUME CS:CODES START:
mov ah,1
int 21h
cmp al,0dh
jz done
cmp al,'0'
jb next
cmp al,'9'
ja charup
int 21h
mov dl,al
mov ah,2
jmp START
charup:cmp al,41h jb next
cmp al,5ah
ja chrdn
dispc:mov dl,'c' mov ah,2
int 21h
next:jmp START
chrdn:cmp al,61h jb next
jmp dispc
done:MOV AH,4CH
INT 21H
CODES ENDS
END START
执行结果:
实验六:分支程序设计
一、程序说明
第一个程序是用来显示AL寄存器中的两位十六进位制数,通过DOS功能调用INT21H的2号功能显示出来。
第二个程序是用来判别键盘上输入的字符:若是1-9字符,则显示之;若为A-Z 或a-z字符,均显示“c”;若是回车字符
调试程序可以在debug中进行,基本步骤和前面的实验大致相同,在软件Masm 集成实验环境2008.4中编辑程序,则可以直接点击程序上的调试按钮,即可进行调试。调试时可通过-t指令来逐步运行程序,观察程序是如何进行分支的。修改AL中的内容,可以通过-r指令来实现,如修改ax 中的内容,通过指令-r ax 来实现,如下图所示:
三:源程序代码和执行结果:第一个源程序:
CODES SEGMENT
ASSUME CS:CODES START:
mov al,3eh
push ax
mov dl,al
mov cl,4
shr dl,cl
cmp dl,9
jbe next1
add dl,7
next1:add dl,30h
mov ah,2
int 21h
pop ax
mov dl,al
and dl,0fh
cmp dl,9
jbe next2
add dl,7
next2:add dl,30h
mov ah,2
int 21h
mov ah,4ch
int 21h
CODES ENDS
END START
执行结果:
第二个源程序;
CODES SEGMENT
ASSUME CS:CODES START:
mov ah,1
int 21h
cmp al,0dh
jz done
cmp al,'0'
jb next
cmp al,'9'
ja charup
int 21h
mov dl,al
mov ah,2
jmp START
charup:cmp al,41h jb next
cmp al,5ah
ja chrdn
dispc:mov dl,'c' mov ah,2
int 21h
next:jmp START
chrdn:cmp al,61h jb next
jmp dispc
done:MOV AH,4CH
INT 21H
CODES ENDS
END START
执行结果:
实验七统计不同成绩段学生的人数
一、程序说明
本程序用来统计在不同分数段的学生人数并显示出来。有三个子程序,分别用来统计各分数段的学生人数、输出相关内容、换行回车。子程序一中,先将每个学生的分数从100、90、80、70、60逐个比较,在哪一分数段,则将其个数加一。直到所有分数都完成比较。子程序二则利用DOS功能调用INT21H的9号功能在显示器上显示一个字符串和2号功能在显示器上显示一个字符来实现输出相关内容。子程序三通过DOS功能调用INT21H的2号功能在显示器上显示一个字符实现换行和回车的。
三、调试说明
调试程序可以在debug中进行,基本步骤和前面的实验大致相同,在软件Masm 集成实验环境2008.4中编辑程序,则可以直接点击程序上的调试按钮,即可进行调试。调试时可通过-t指令来逐步运行程序,观察相关内容变化,来调试程序。
我们通过设置断点来改变数据,从而逐步执行达到我们想要的效果。