中南大学 汇编语言实验报告.docx

上传人:b****5 文档编号:6516564 上传时间:2023-01-07 格式:DOCX 页数:20 大小:20.67KB
下载 相关 举报
中南大学 汇编语言实验报告.docx_第1页
第1页 / 共20页
中南大学 汇编语言实验报告.docx_第2页
第2页 / 共20页
中南大学 汇编语言实验报告.docx_第3页
第3页 / 共20页
中南大学 汇编语言实验报告.docx_第4页
第4页 / 共20页
中南大学 汇编语言实验报告.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

中南大学 汇编语言实验报告.docx

《中南大学 汇编语言实验报告.docx》由会员分享,可在线阅读,更多相关《中南大学 汇编语言实验报告.docx(20页珍藏版)》请在冰豆网上搜索。

中南大学 汇编语言实验报告.docx

中南大学汇编语言实验报告

中南大学汇编语言实验报告

计算机原理与汇编实验报告

学生姓名学号专业班级

指导教师贺建飚

学院信息科学与工程学院

完成时间2019年6月

实验一二进制转十六进制

一、实验目的

(1)掌握循环程序的设计方法。

(2)掌握汇编语言源程序的编辑、汇编、连接及调试过程。

(3)进一步熟悉利用DEBUG程序修改参数的方法,并检查和验证结果的正确性。

(4)学会针对不同的问题,选用不同的组织循环的方法。

二、实验要求

掌握循环程序的过程和汇编实现原理,进一步熟练掌握DEBUG操作指令以及汇编语言源程序的编辑、汇编、连接及调试过程。

三、实验内容

掌握循环排序算法的思想:

二进制到十六进制转换程序

实验代码如下:

assumecs:

code

codesegment

mainprocfar

start:

movbx,[**************]0b;待转换成十六进制的二进制数movch,4;设置循环次数

rotate:

movcl,4;设置循环左移的位数

rolbx,cl;将bx中的每位依次循环左移4位,

;每左移一次,把最高位同时移入CF和操作数最低位

moval,bl

andal,0fh;将al高4位清0,保留从rol循环移位到al低四位的值

addal,30h;将4位二进制数转换成对应的ASCII码

cmpal,3ah;判定4位二进制数是否大于9

jlprint

addal,7h

print:

movdl,al;调用中断程序输出单个字符

movah,2

int21h

decch;继续循环,直到循环4次为止

jnzrotate

mainendp

movax,4c00h

int21h

codeends

end

四、实验结果

DEBUG调试如下:

五、实验心得

编了这个程序之后发现,想要真正理解一个程序都是需要掌握众多助记符的用法以及它的意思,只有了解并明白了这些之后才可以分析程序或者是编写简单的小程序。

实验二起泡排序算法的程序实现

一、实验目的

(1)掌握循环程序的设计方法。

(2)掌握汇编语言源程序的编辑、汇编、连接及调试过程。

(3)进一步熟悉利用DEBUG程序修改参数的方法,并检查和验证结果的正确性。

(4)学会针对不同的问题,选用不同的组织循环的方法。

二、实验原理

循环结构分DO_WHILE和DO_UNTIL两种,无论使用哪种循环结构,循环程序一般应包括以下几部分:

①循环初始化。

它包括设置循环次数的初始值、地址指针的初始设置等。

②循环体。

这是循环工作的主体,包括要重复执行的操作,以及循环的修改部分。

修改部分包括地址指针的修改、循环控制条件的修改等。

③循环控制部分。

它是控制循环的关键,判断循环条件满足与否。

特别要注意循环入口和循环次数的正确设置、地址指针及循环控制条件的修改等。

否则会得不到期望的结果。

三、实验内容

掌握循环排序算法的思想:

起泡排序算法的程序实现

实验代码如下:

DATASSEGMENT

BUFFERDB100DUP(?

XDB5DUP(?

STRING1DB"PLEASEINPUTDATAS:

","$"

STRING2DB"AFTERSORTIS:

","$"

SHIFTDB13,10,'$'

SPACEDB20H,'$'

DATASENDS

STACKSSEGMENT

DB256DUP(?

STACKSENDS

CODESSEGMENT

ASSUMECS:

CODES,DS:

DATAS,SS:

STACKS,ES:

DATAS

START:

MOVAX,DATAS

MOVDS,AX

MOVES,AX

MOVAX,STACKS

LEASI,BUFFER

MOVCX,0

LEADX,STRING1

MOVAH,09H

INT21H

L1:

MOVAH,01H;/////////////////键盘输入转成数

INT21H

CMPAL,0DH

JEL2

CMPAL,20H

JEL3

XORAH,AH

SUBAX,30H

XCHGAX,BX

MOVDX,10

MULDX

ADDBX,AX

JMPL1

L3:

INCCX

MOV[SI],BL

ADDSI,1

XORBX,BX

JMPL1

L2:

LEADX,SHIFT

MOVAH,09H

INT21H

MOV[SI],BL

LEADI,X

MOV[DI],CL

LABLE2:

LEASI,BUFFER

PUSHCX

LABLE:

MOVAL,[SI]

CMPAL,[SI+1]

JBEL4

XCHGAL,[SI+1]

MOV[SI],AL

L4:

ADDSI,1;跳到回车处理;空格处理;/////////////存储到buffer中;/////////排序算法

POPCX

LOOPLABLE2

LEADX,STRING2

MOVAH,09H

INT21H

LEADI,BUFFER

L7:

MOVCX,2

MOVBH,[DI]

L6:

PUSHCX

MOVCL,4

ROLBX,CL

MOVDL,BL

ANDDL,0FH

CMPDL,9

JBEL5

ADDDL,7

L5:

ADDDL,30H

MOVAH,02H

INT21H

POPCX

LOOPL6

INCDI

LEADX,SPACE

MOVAH,09H

INT21H

LEASI,X

MOVBL,[SI]

CMPBL,0

DECBL

LEASI,X

MOV[SI],BL

JGEL7

MOVAH,4CH

INT21H

CODESENDS

ENDSTART

四、实验结果;/////////////////////显示字符

DEBUG调试如下:

五、实验心得

1.在进行循环程序设计时,要注意循环初始化、内外层循环的控制、循环结束条件等的设置,对整个程序的执行逻辑要非常清楚,这样可以避免死循环等意外情况的出现。

2.多层循环的控制更为复杂,编写代码时,要注意注释重要的循环控制部分,这样思路才不会乱。

同时要对照流程图,随时观察代码的逻辑思路是否正确。

3.当要观察排序结果时,可利用D命令,显示数据段的内容,检查程序是否正常运行。

实验三查找匹配字符串

一、实验目的

(1)掌握循环程序的设计方法。

(2)掌握汇编语言源程序的编辑、汇编、连接及调试过程。

(3)进一步熟悉利用DEBUG程序修改参数的方法,并检查和验证结果的正确性。

(4)学会针对不同的问题,选用不同的组织循环的方法。

二、实验要求

掌握循环程序的过程和汇编实现原理,进一步熟练掌握DEBUG操作指令以及汇编语言源程序的编辑、汇编、连接及调试过程。

三、实验内容

掌握循环排序算法的思想:

查找匹配字符串:

程序接收用户键入的一个关键字以及一个句子。

如果句子中不包含关键字则显示‘NOmatch!

’;如果句子中包含关键字则显示‘MATCH’,且把该字在句子中的位置用十六进制数显示出来。

实验代码如下:

DATASEGMENT

mess1DB'Enterkeyword:

','$'

mess2DB'EnterSentence:

','$'

mess3DB'Matchatlocation:

','$'

mess4DB'NOTMATCH.',13,10,'$'

mess5DB'Hofthesentence',13,10,'$'

changeDB13,10,'$'

stoknin1labelbyte

max1db10

act1db?

stokn1db10dup(?

stoknin2labelbyte

max2db50

act2db?

stokn2db50dup(?

DATAENDS

STACKSSEGMENT

;此处输入堆栈段代码

STACKSENDS

CODESEGMENT

;*************************************代码段

mainprocfar

assumecs:

code,ds:

data,es:

data

START:

pushds

subAX,AX

subBX,BX

subDI,DI

subSI,SI

pushAX;为返回dos并清空后面要用到的寄存器

MOVAX,DATA

MOVDS,AX

LEADX,mess1

MOVah,09

INT21h;输出Enterkeyword

LEADX,stoknin1

MOVah,0ah;用21号中段的0ah号功能获取关键字

INT21h

cmpact1,0

jeexit;如果为空直接退出程序

a10:

;********************************输入Sentence并判断

LEADX,change

MOVah,09

INT21h;输出回程,换行

LEADX,mess2

MOVah,09

INT21h;输出EnterSentence:

LEADX,stoknin2

MOVah,0ah

INT21h;用21号中段的0ah号功能获取句子

MOVAL,act1

CBW

MOVCX,AX;保存关键字长度到cx

PUSHCX;cx入栈

MOVAL,act2

cmpAL,0

jea50;保存句子长度到al,若句子为空则跳转显示notmatchSUBAL,act1

jsa50;若句子长度小于关键字长度,则跳转显示notmatchINCAL

CBW

LEABX,stokn2;将句子的首地址放进BX

MOVDI,0

MOVSI,0

a20:

;****************************************比较,内循环

MOVAH,[BX+DI]

CMPAH,stokn1[SI];遇见字符不相等就跳转到a30

jnea30

INCDI

INCSI

DECCX;没遇到一个相等的字符,cx-1,cx不为0则比较下一个字符,当cx为0是说明关键字比较完

CMPCX,0

jea40

jmpa20

a30:

;*****************************************外循环,BX+1,清空si,di继续内循环比较INCBX

DECAL

cmpAL,0

jea50

MOVDI,0

MOVSI,0

POPCX

pushCX

jmpa20

a40:

;*****************************************match,将bx减去句子的首地址加一得到关键字所在位置,调用二进制转十六进制子函数将位置输出

SUBBX,offsetstokn2

INCBX

LEADX,change

MOVah,09

INT21h

LEADX,mess3

MOVah,09

INT21h

CALLbtoh

LEADX,mess5

MOVah,09

INT21h

jmpa10

;****************************************二进制转换十六进制

btohPROCNEAR

MOVCH,4

rotate:

MOVCL,4

ROLBX,CL

MOVAL,BL

andAL,0fh

addAL,30h

cmpal,3ah

jlprintit

addal,7h

printit:

MOVdl,al

MOVah,2

int21h

decch

jnzrotate

ret

btohendp

a50:

;*****************************************显示notmatch

LEADX,change

MOVah,09

INT21h

LEADX,mess4

MOVah,09

INT21h

jmpa10

exit:

ret

mainendp

CODEENDS

END

四、实验结果

五、实验心得

与第一次实验相比这次用到了数据段,应该注意数据段的定义和使用。

此外应该注意单个字符时的“边缘”情况,因为这时指针的移动和关键字的长度是一致的,但是这并不意味着,两个字符串匹配。

实验四求Fibonacci递归数

一、实验目的:

掌握子程序的设计方法,熟悉递归程序的设计。

二、实验要求:

掌握递归程序的调用、返回及入口、出口的传递方法。

三、实验内容

程序接受由用户键入的数N,根据给定的N值,计算Fibonacci数。

Fibonacci数的公式如下:

Fib

(1)=1;当n=1

Fib

(2)=1;当n=2

Fib(n)=Fib(n-1)+Fib(n-2)

实验代码如下:

DATASSEGMENT

;此处输入数据段代码

RESULTDB1D,24DUP(0)

XDB1D,24DUP(0)

MESS1DB0DH,0AH,'Pleaseinputadata:

','$'

MESS2DB0DH,0AH,'Theresultis:

','$'

MESS3DB0DH,0AH,'InputQ/qtoquit.','$'

MESS4DB0DH,0AH,'======================','$'

FLAGDW0DH

MESSERRORDB0DH,0AH,'Inputerror,pleasere-enter.','$'

QUITDB0DH,0AH,'YouhavetypedQ/qtoexit.','$'

DATASENDS

STACKSSEGMENT

;此处输入堆栈段代码

DW128DUP(?

STACKSENDS

CODESSEGMENT

ASSUMECS:

CODES,DS:

DATAS,SS:

STACKS,ES:

DATAS

START:

MOVAX,DATAS

MOVDS,AX

MOVES,AX

MOVAX,STACKS

MOVSS,AX

;此处输入代码段代码

REINPUT:

PUSHAX

PUSHBX

PUSHCX

PUSHDX

PUSHSI

PUSHDI

MOVAH,09

LEADX,MESS4

INT21H

LEADX,MESS3

INT21H

LEADX,MESS1

INT21H

MOVBX,0

INPUT:

MOVAH,01

INT21H

CMPAL,'q';

JZEND_

CMPAL,'Q';

JZEND_

CMPAL,0DH;

JZCONT

CMPAL,'0';

JBERROR;

CMPAL,':

'

JNBERROR

SUBAL,30H

CBW

XCHGAX,BX

MOVCX,10D

MULCX

XCHGAX,BX

ADDBX,AX

JMPINPUT

ERROR:

;

MOVAH,09

LEADX,MESSERROR

INT21H

JMPREINPUT

END_:

MOVAH,09

LEADX,QUIT

INT21H

INT21H

RET

CONT:

MOVCX,BX;

CMPCX,2

JLEPRINT;

SUBCX,2;

NEXT:

MOVDI,CX

MOVCX,25

MOVSI,0

ADDE:

MOVDL,X[SI]

MOVDH,RESULT[SI]

ADDDL,DH;

MOVRESULT[SI],DL

MOVX[SI],DH;

CMPDL,10D

JAEGREAT;

INCSI

JMPGOON

GREAT:

SUBRESULT[SI],10D;

INCSI

ADDX[SI],1;

GOON:

LOOPADDE

MOVCX,DI

LOOPNEXT

PRINT:

LEADX,MESS2

MOVAH,09

INT21H

MOVCX,25

MOVSI,24

DISPLAY1:

CMPFLAG,0;

JNZN2

CMPRESULT[SI],0

JZN3

ADDFLAG,1

N2:

MOVDL,RESULT[SI];

ADDDL,30H

MOVAH,02H

INT21H

N3:

DECSI

LOOPDISPLAY1

MOVFLAG,0

MOVRESULT[0],1D

MOVSI,1

MOVCX,24

INITIAL:

MOVRESULT[SI],0

MOVX[SI],0

ADDSI,1

LOOPINITIAL

MOVSI,0

POPDI;

POPSI

POPDX

POPCX

POPBX

POPAX

JMPREINPUT;

MOVAH,4CH

INT21H

CODESENDS

ENDSTART

四、实验结果

五、实验心得

在程序的制作过程中,遇到了很多意想不到的困难,自己一个人解决起来有很大的困难,于是也少不了同学的帮助,深刻体会到开发程序不只是一两个人就能很好地完成的,要大家互相帮助,共同探讨问题,才能更好的解决困难。

实验五分类统计字符个数

一、实验目的

掌握分支程序设计的原理与方法,重点掌握各种程序中形成和判断条件而产生的程序段的设计方法和技巧。

二、实验要求

掌握分支程序的调用及基本子程序的编写,判断程序运行的顺序。

三、实验内容

程序接受用户输入一行字符,并按照字符串中字符所属的类型分类,将结果输出(例如:

aaabb1234&中,字母5,数字4,其他字符1)

实验代码如下:

DATASSEGMENT

STRING1DB'InputYourString:

$';输入提示信息

STRING2DB'Digit:

$';各类字符提示信息

STRING3DB'UpLetter:

$'

STRING4DB'LowLetter:

$'

STRING5DB'Others:

$'

DIGITDB0;数字

ALPHAUDB0;大写字母

ALPHALDB0;小写字母

OTHERSDB0;其他

DATASENDS

CODESSEGMENT

ASSUMECS:

CODES,DS:

DATAS

START:

MOVAX,DATAS

MOVDS,AX

LEADX,STRING1;显示输入提示信息

MOVAH,9

INT21H

MOVCX,100;设置循环次数主够大

L1:

MOVAH,1;中断调用,单字符输入

INT21H

CMPAL,0DH;若输入回车符则结束

JZOVER2

CMPAL,30H

JBOTHER;若

CMPAL,39H;若>39H(9),跳转进一步比较

JAHIGHER1

JMPDIGITAL;DIGIT++

HIGHER1:

CMPAL,41H;if

JBOTHER

CMPAL,5AH;if>5AH(Z),跳转继续比较

JAHIGHER2

JMPUALPHA;ALPHAU++

HIGHER2:

CMPAL,61H;if

JBOTHER

CMPAL,7AH;if>7AH(z),OTHERS++

JAOTHER

JMPLALPHA;ALPHAL++

JMPOVER;比较结束

OTHER:

INCOTHERS;OTHERS++

JMPOVER

DIGITAL:

INCDIGIT;DIGIT++

JMPOVER

LALPHA:

INCALPHAL;ALPHAL++

JMPOVER

UALPHA:

INCALPHAU;ALPHAU++

JMPOVER

OVER:

NOP

LOOPL1;循环,输入下一字符

OVER2:

CALLENDLINE;回车换行

LEADX,STRING2;输出提示信息

MOVAH,9

INT21H

XORAX,AX

MOVAL,DIGIT;将统计的数字送AX,为输出做准备

CALLDISPLAY;调用输出两位数字的子程序

CALLENDLINE;下同

LEADX,STRING3

MOVAH,9

INT21H

XORAX,AX

MOVAL,ALPHAU

CALLDISPLAY

CALLENDLINE

LEADX,STRING4

MOVAH,9

INT21H

XORAX,AX

MOVAL,ALPHAL

CALLDISPLAY

CALLENDLINE

LEADX,STRING5

MOVAH,9

INT21H

XORAX,AX

MOVAL,OTHERS

CALLDISPLAY

MOVAH,4CH

INT21H

ENDLINEPROCNEAR;控制输出格式,输出回车换行子程序

MOVAH,2

MOVDL,0AH

INT21H

MOVAH,2

MOVDL,0DH

INT21H

RET

ENDLINEENDP

DISPLAYPROCNEAR;输出两位数字的子程序

MOVBL,10;10送BL

DIVBL;AX/BL,AL=商,AH=余数

PUS

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

当前位置:首页 > 医药卫生

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1