当前位置:文档之家› 汇编程序设计实验报告

汇编程序设计实验报告

汇编程序设计实验报告
汇编程序设计实验报告

《汇编语言程序设计》

实验报告

学院

班级

班级

姓名

学号、

实验一汇编运行环境及方法、简单程序设计

一、程序说明

本程序用来比较两个字符串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”;若是回车字符,z则结束程序,若为其他字符则不显示,继续等待新的字符输入。首先输入一个字符,将其和回车字符比较,若是回车字符,则结束程序。1-9字符,则显示之。若是若小于0,则重新等待输入。若大于9,则跳转到和‘A’、Z’比较,若小于’A’,则重新等待输入,若大于’Z’,则跳转到和’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”;若是回车字符,z则结束程序,若为其他字符则不显示,继续等待新的字符输入。首先输入一个字符,将其和回车字符比较,若是回车字符,则结束程序。1-9字符,则显示之。若是若小于0,则重新等待输入。若大于9,则跳转到和‘A’、Z’比较,若小于’A’,则重新等待输入,若大于’Z’,则跳转到和’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指令来逐步运行程序,观察相关内容变化,来调试程序。

我们通过设置断点来改变数据,从而逐步执行达到我们想要的效果。

相关主题
文本预览
相关文档 最新文档