汇编实验报告.docx

上传人:b****1 文档编号:2090366 上传时间:2023-05-02 格式:DOCX 页数:41 大小:879.06KB
下载 相关 举报
汇编实验报告.docx_第1页
第1页 / 共41页
汇编实验报告.docx_第2页
第2页 / 共41页
汇编实验报告.docx_第3页
第3页 / 共41页
汇编实验报告.docx_第4页
第4页 / 共41页
汇编实验报告.docx_第5页
第5页 / 共41页
汇编实验报告.docx_第6页
第6页 / 共41页
汇编实验报告.docx_第7页
第7页 / 共41页
汇编实验报告.docx_第8页
第8页 / 共41页
汇编实验报告.docx_第9页
第9页 / 共41页
汇编实验报告.docx_第10页
第10页 / 共41页
汇编实验报告.docx_第11页
第11页 / 共41页
汇编实验报告.docx_第12页
第12页 / 共41页
汇编实验报告.docx_第13页
第13页 / 共41页
汇编实验报告.docx_第14页
第14页 / 共41页
汇编实验报告.docx_第15页
第15页 / 共41页
汇编实验报告.docx_第16页
第16页 / 共41页
汇编实验报告.docx_第17页
第17页 / 共41页
汇编实验报告.docx_第18页
第18页 / 共41页
汇编实验报告.docx_第19页
第19页 / 共41页
汇编实验报告.docx_第20页
第20页 / 共41页
亲,该文档总共41页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

汇编实验报告.docx

《汇编实验报告.docx》由会员分享,可在线阅读,更多相关《汇编实验报告.docx(41页珍藏版)》请在冰点文库上搜索。

汇编实验报告.docx

汇编实验报告

汇编实验报告

 

姓名:

管仕敏

班级:

软件124

学号:

129074257

指导老师:

陆勤

 

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

1.程序说明:

本程序用来比较两个字符串string1和string2所含的字符是否相同。

若相同则显示‘Match’,否则显示‘Nomatch’。

在程序的数据段先定义两个字符串string1和string2,再定义两个字符串mess1和mess2,分别代表‘Match’和‘Nomatch’。

再代码段比较字符串string1和string2,通过比较判断是否相同。

若相同则显示‘Match’,否则显示‘Nomatch’。

2.程序代码(比较两字符串):

datareasegment

string1db'Movethecursorbackward.'

string2db'Movetheecursorbackward.'

mess1db'Match.',13,10,'$'

mess2db'Nomatch!

',13,10,'$'

datareaends

prognamsegment

mainprocfar

assumecs:

prognam,ds:

datarea,es:

datarea

start:

pushds

subax,ax

pushax

movax,datarea

movds,ax

moves,ax

leasi,string1

leadi,string2

cld

movcx,25

repzcmpsb

jzmatch

leadx,mess2

jmpshortdisp

match:

leadx,mess1

disp:

movah,09

int21h

ret

 

mainendp

prognamends

endstart

3.截图:

 

该程序是用来判断两字符串string1和string2是否相同,相同则显示match。

 

实验二用DEBUG编程:

使用堆栈段将AX和BX的内容进行交换等

1.程序说明:

(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中的内容是什么。

2.程序代码:

MOVAX,BX

MOVAX,0304H

MOVAX,[0304H]

MOVAX,[BX]

MOVAX,0001[BX]

MOVAX,[BX][SI]

MOVAX,0001[BX][SI]

HLT

3.截图:

先使用-r设置sp,ax,bx,在使用-a输入指令然后再-t单步调试

刚开始ax3000,bx5000debug调试后ax,5000bx3000

 

首先用-r设置bx,si然后再用-e将a,b,c,d,e分配到指定的内存中,-a输入指令最后-t单步调试

执行单步调试后ax的值一直变化从000E,0B0A,0C0B,0D0C,0E0D

 

实验三存储器块清零和内存块移动

1.程序说明:

第一个程序是存储块清零。

程序流程大概为首先设置起始地址,然后设置块长度,然后将当前地址内容清零,地址加1,然后查看是否清除完全,若没有则回到当前地址清零,然后再查看,直到地址内容清除完,结束程序。

第二个程序是内存块移动。

程序流程框图为:

首先设置块的源地址,然后设置筷的目的地址,然后再设置移动长度,然后按长度重复传送数据,然后结束。

2.调试及截图:

第一个程序进入debug先用-u指令查看程序代码然后-d查看内存的情况再执行-g讲程序执行完在用-d查看内存

 

第二个程序进入debug后先用-u查看程序然后-g运行到指令repmovsd之前再用–d查看内存的内容

-g前

-g后

 

实验四将键盘输入的小写字母用大写字母显示出来

1.程序说明:

本程序用来将小写字母转变为大写,并在屏幕上显示出来。

先利用DOS功能调用INT21H的1号功能从键盘输入字符,然后判断输入的是否是小写字母,若不是小写字母,则显示输入出错,重新输入。

若输入的是小写字母,则通过将其减去20h,从而变为大写字母。

在通过DOS功能调用INT21H的2号功能显示出来。

若输入的是Enter键,则结束程序。

2.程序代码:

TITLESHIYAN

CODESEGMENT

ASSUMECS:

CODE

START:

MOVAH,01H

INT21H

CMPAL,61H

JLSTART

SUBAL,20H

MOVDL,AL

MOVAH,02H

INT21H

CODEENDS

ENDSTART

3.截图:

实验五循环程序设计

1.程序说明:

第一个程序是用来显示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’。

2.程序代码:

CODESEGMENT

ASSUMECS:

CODE

START:

MOVAL,3EH

PUSHAX

MOVDL,AL

MOVCL,4

SHRDL,CL

CMPDL,9

JBENEXT1

ADDDL,7

NEXT1:

ADDDL,30H

MOVAH,2

INT21H

POPAX

MOVDL,AL

ANDDL,0FH

CMPDL,9

JBENEXT2

ADDDL,7

NEXT2:

ADDDL,30H

MOVAH,2

INT21H

MOVAH,4CH

INT21H

CODEENDS

ENDSTART

3.截图:

4.程序代码:

codesegment

assumecs:

code

start:

movah,1

int21h

cmpal,0dh

jzdone

cmpal,'0'

jbnext

cmpal,'9'

jacharup

movdl,al

movah,2

int21h

jmpstart

charup:

cmpal,41h

jbnext

cmpal,5ah

jachrdn

dispc:

movdl,'c'

movah,2

int21h

next:

jmpstart

chrdn:

cmpal,61h

jbnext

cmpal,7ah

janext

jmpdispc

done:

movah,4ch

int21h

codeends

endstart

5.截图:

实验六分支程序设计

1.程序说明:

第一个程序是用来显示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’

2.程序代码:

CODESEGMENT

ASSUMECS:

CODE

START:

MOVAL,3EH

PUSHAX

MOVDL,AL

MOVCL,4

SHRDL,CL

CMPDL,9

JBENEXT1

ADDDL,7

NEXT1:

ADDDL,30H

MOVAH,2

INT21H

POPAX

MOVDL,AL

ANDDL,0FH

CMPDL,9

JBENEXT2

ADDDL,7

NEXT2:

ADDDL,30H

MOVAH,2

INT21H

MOVAH,4CH

INT21H

CODEENDS

ENDSTART

3.截图:

可以对ax的值进行修改为00ad

4.程序代码

codesegment

assumecs:

code

start:

movah,1

int21h

cmpal,0dh

jzdone

cmpal,'0'

jbnext

cmpal,'9'

jacharup

movdl,al

movah,2

int21h

jmpstart

charup:

cmpal,41h

jbnext

cmpal,5ah

jachrdn

dispc:

movdl,'c'

movah,2

int21h

next:

jmpstart

chrdn:

cmpal,61h

jbnext

cmpal,7ah

janext

jmpdispc

done:

movah,4ch

int21h

codeends

endstart

5.截图:

实验七统计不同成绩段学生的人数

1.程序说明:

本程序用来统计在不同分数段的学生人数并显示出来。

有三个子程序,分别用来统计各分数段的学生人数、输出相关内容、换行回车。

子程序一中,先将每个学生的分数从100、90、80、70、60逐个比较,在哪一分数段,则将其个数加一。

直到所有分数都完成比较。

子程序二则利用DOS功能调用INT21H的9号功能在显示器上显示一个字符串和2号功能在显示器上显示一个字符来实现输出相关内容。

子程序三通过DOS功能调用INT21H的2号功能在显示器上显示一个字符实现换行和回车的。

2.程序框图:

3.程序代码:

datasegment

gradedb72,69,83,90,75,80,87,99,63,100

adb'<60renshu','$'

bdb0ah,0dh,'60~70renshu:

','$'

cdb0ah,0dh,'70~80renshu:

','$'

ddb0ah,0dh,'80~90renshu:

','$'

edb0ah,0dh,'90~100renshu:

','$'

fdb0ah,0dh,'100renshu:

','$'

countdb10

dataends

stackssegment

stacksends

codesegment

assumecs:

code,ds:

data,ss:

stacks

mainprocfar

start:

movax,data

movds,ax

xorax,ax

xorbx,bx

xorcx,cx

xordh,dh

callcountgrade

calloutput

movah,4ch

int21h

mainendp

countgradeprocnear

movdi,0

io:

cmpgrade[di],60

jbl1

cmpgrade[di],70

jbl2

cmpgrade[di],80

jbl3

cmpgrade[di],90

jbl4

cmpgrade[di],100

jbl5

incal

jmpcontinue

l1:

incbh

jmpcontinue

l2:

incbl

jmpcontinue

l3:

incch

jmpcontinue

l4:

inccl

jmpcontinue

l5:

incdh

jmpcontinue

continue:

incdi

deccount

jnzio

ret

countgradeendp

outputprocnear

movah,0

pushax

pushdx

pushcx

pushbx

leadx,a;分数小于60的人数

movah,9

int21h

popbx

movdl,bh

adddl,30h

movah,2

int21h

leadx,b;分数60至69的人数

movah,9

int21h

movdl,bl

adddl,30h

movah,2

int21h

leadx,c;分数70至79的人数

movah,9

int21h

popbx

movdl,bh

adddl,30h

movah,2

int21h

leadx,d;分数80至89的人数

movah,9

int21h

movdl,bl

adddl,30h

movah,2

int21h

leadx,e;分数90至99的人数

movah,9

int21h

popbx

movdl,bh

adddl,30h

movah,2

int21h

leadx,f;分数100的人数

movah,9

int21h

popbx

movdl,bl

adddl,30h

movah,2

int21h

ret

outputendp

codeends

endstart

4.截图:

附加实验:

练习题

3.编写程序,将DATA_NUM起的一个压缩BCD码转换成十六进制数,并存放在DATA_NUM下面的相邻字节中。

DATASEGMENT

DATA_NUMDB59h

DATAENDS

CODESEGMENT

ASSUMECS:

CODE,DS:

DATA

START:

MOVAX,DATA

MOVDS,AX

MOVBX,OFFSETDATA_NUM

XORAX,AX

MOVAL,[BX];将原数保存到AL中

MOVCL,10H

MOVCH,0AH

DIVCL;除16,商为AL,余数为AH

MOVDL,AH

XORAH,AH;将AH保存到DL,并清零AH

MULCH

ADDAL,DL;将AL乘10,再加上个位

MOV[DATA_NUM+1],AL

MOVAH,4CH

INT21H

CODEENDS

ENDSTART

 

结果如下图:

4.试着编写一程序,用查表法将一位十六进制数转换成与之对应的ASCII码,程序的数据段如下:

DATASEGMENT

TABDB30H,31H,32H,33H,34H,35H,36H,37H

DB38H,39H,41H,42H,43H,44H,45H,46H

HEXDB6;0BH

ASCDB?

DATAENDS

CODESEGMENT

ASSUMECS:

CODE,DS:

DATA

START:

MOVAX,DATA

MOVDS,AX

MOVBX,OFFSETTAB

XORAH,AH

MOVAL,HEX;DECAL

ADDBX,AX

MOVAL,[BX];查表得到结果保存到AL

MOVASC,AL

MOVAH,4CH

INT21H

CODEENDS

ENDSTART

结果如下图:

查找到6的ASCII码为36,保存到AX以及ASC中。

5.试编程求解表达式S=(2300-(X*Y+Z))/Z,其中X=600,Y=25,Z=-2000.

datasegment

Xdw600

Ydw25

Zdw-2000

Sdw?

;S=(2300-(X*Y+Z))/Z

dataends

codesegment

assumecs:

code,ds:

data

start:

movax,data

movds,ax;初始化ds

movax,X

mulY;ax<-X*Y

addax,Z;ax<-X*Y+Z

movbx,23000d

subbx,ax;bx<-23000-(X*Y+Z)

movax,bx

idivZ;ax=(23000-(X*Y+Z))/Z

movS,ax

movah,4ch

int21h

codeends

endstart

结果如下图:

最终结果ax=-5(FFFB),保存到S中

 

补充实验:

1.试编制一程序,要求从键盘上接收一个4位的16进制数,并在屏幕上显示与它等值的二进制数。

源程序代码如下:

datasegment

CRdb0ah,0dh,'$'

dataends

codesegment

assumecs:

code,ds:

data

start:

movax,data

movds,ax

xorbx,bx

movch,4

lab1:

;循环输入四次,字符放在AL中

movah,1

int21h

cmpal,'0'

jblab1

cmpah,'9'

jbelab3;小于等于9,直接取出

cmpal,'A'

jblab1

cmpal,'F'

jbelab22

cmpal,'a'

jblab1

cmpal,'f'

jalab1

lab2:

subal,20h

lab22:

subal,37h;转换为10--15

jmplab4

lab3:

;取al低四位,正好为一位十六进制数

andal,0fh

lab4:

movcl,4

shlbx,cl

addbl,al;将低四位移到高位,加上低四位

decch

jnzlab1;循环输入

leadx,CR;换行

movah,9

int21h

movcx,16

lab5:

xordl,dl

rolbx,1;循环左移,将高位放入cf

rcldl,1;带进位循环左移,取cf到dl中

adddl,30h;转换为0或1的ASCII码

movah,2

int21h

looplab5

movah,4ch

int21h

codeends

endstart

程序运行结果如下:

 

2.从键盘上输入一系列字符串(以回车符结束),按字母、数字和其他字符分类计数,最后显示这三类的计数结果。

源程序代码如下:

(只能输出小于10的个数)

datasegment

adb0ah,0dh,"zimugeshu:

$"

bdb0ah,0dh,"shuzigeshu:

$"

cdb0ah,0dh,"qitazifugeshu:

$"

dataends

codesegment

assumecs:

code,ds:

data

start:

subax,ax

pushax

movax,data

movds,ax

subcx,cx

subbl,bl

lab0:

movah,1

int21h

cmpal,0dh

jzlab4;输入回车结束,否则循环输入

cmpal,'0'

jblab3

cmpal,'9'

jalab1

incch;数字计数

jmplab0

lab1:

cmpal,'A'

jblab3

cmpal,'Z'

jalab2

inccl;字母计数

jmplab0

lab2:

cmpal,'a'

jblab3

cmpal,'z'

jalab3

inccl;字母计数

jmplab0

lab3:

incbl;其他字符计数

jmplab0

lab4:

leadx,a;输出字母个数

movah,9

int21h

movdl,cl

ordl,30h;转换为数的ASCII码显示

movah,2

int21h

leadx,b;输出数字个数

movah,9

int21h

movdl,ch

ordl,30h

movah,2

int21h

leadx,c;输出其他字符个数

movah,9

int21h

movdl,bl

ordl,30h

movah,2

int21h

codeends

endstart

3.根据键盘输入的字符A-E(或a-e),分别显示ONE,TWO,THREE,FOUR,FIVE,当输入其他字符时,显示ERROR,然后重新输入。

程序源代码如下:

datasegment

messagedb0ah,0dh,'ONE','$'

db0ah,0dh,'TWO','$'

db0ah,0dh,'THREE','$'

db0ah,0dh,'FOUR','$'

db0ah,0dh,'FIVE','$'

errordb0ah,0dh,'ERROR',0ah,0dh,'$'

dataends

codesegment

assumecs:

code,ds:

data

start:

movax,data

movds,ax

movah,1

int21h;输入字符

cmpal,'A'

jberr

cmpal,'E'

jaupchar

subal,65

jmpdisp

upchar:

cmpal,'a'

jberr

cmpal,'e'

jaerr

subal,97;转换为对应的数字0-4

jmpdisp

err:

leadx,err

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 人文社科 > 法律资料

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2