计算机输入输出课程汇编实验部分文档格式.docx

上传人:b****3 文档编号:17005328 上传时间:2022-11-27 格式:DOCX 页数:20 大小:97.50KB
下载 相关 举报
计算机输入输出课程汇编实验部分文档格式.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

movcl,buff+1h

next:

cmpcl,0h

jefinish

movdl,byteptr[si]

movah,2h

deccl

incsi

jmpnext

finish:

movah,4ch

codeends

endstart

2)运行结果贴图

3)编程与调试心得(遇到的问题和解决的办法,以及获得的收获)

一开始写buffbyte255显示error,换成buffdb255可以运行

Crlfdb0ah,0dh,"

关键在于获取字符串的长度,会存储在buff+1h中

也可在末尾加‘$’表示结尾。

 

实验二

通过这一部分的实验,进一步熟悉汇编过程和DEBUG调试过程;

掌握用汇编语言编写顺序程序。

2.写完整程序16位程序,在内存中从Table开始的10个单元中连续存放0到9的平方值,任给一个0到9的数X,该数存放在内存单元XX中,用XLAT指令查表求X的平方值,并将结果存于内存YY单元中。

编写程序,并在DEBUG中进行调试和验证结果。

(X,XX,YY都是内存中的变量)

.8086

.MODELSMALL

.STACK

.DATA

TABLEdb0,1,4,9,16,25,36,49,64,81

RESULTDB?

.CODE

START:

MOVAX,@DATA

MOVDS,AX

MOVBX,offsetTABLE

MOVAH,01H

INT21H

SUBAL,30H

XLAT

MOVRESULT,AL

leadx,crlf;

输出回车换行

MOVDL,RESULT

MOVAH,02H

EXIT:

MOVAH,4CH

运行debug,-u反汇编-g至001E,输入值6,查表应为36,即24H(00100100)

查ASCII为$,图0076A:

0030位置即为result值(通过对比一开始的存储单元得出)

一开始没有注意到输入的AL是ASCII码,应当减去30H

数据存储在result中可以用-d查询,学会了使用反汇编和查询存储单元

通过输出是ASCII码,如9对应result的81,即51H,查表恰为Q

说明存储正确(可用除10或循环移位的方法,单个数转为十进制数输出)

实验三

通过本实验,熟练使用字符串的输入、读取与判断,通过实验,可以掌握循环结构的各种实现方法,进一步了解循环结构中初始化部分、循环体部分、循环控制部分的功能以及他们彼此之间的关系。

尤其是多重循环中外层循环和内层循环之间的关系。

所谓回文字符串是指一个字符串正读和倒读都是一样的,例如字符串‘ABCDEFFEDCBA’就是一个回文字符串,而字符串‘ABCFDDCAB’就不是回文字符串。

现在编写完整的16位汇编程序,输入一个字符串,判断该字符串是否为回文字符串,并用“Itisapalindrome”或“ItisNOTapalindrome”作为输出。

buffdb255

db?

db255dup(?

YDB"

Itisapalindrome$"

NDB"

ItisNOTapalindrome$"

movax,data

movds,ax

movbl,buff+1h

movbh,0h

movdi,2h

adddi,bx

movsi,1h

decbl

decbl

decdi

cmpbl,0h

movdl,buff[si]

movdl,buff[di]

int21h

movdl,"

"

moval,buff[si]

movcl,buff[di]

cmpcl,al

jneno

no:

movdx,offsetN

movah,09h

movdx,offsetY

INT21H

本程序存在bug,如上图当输入abvcba时可以将abvcab与abcvba逐个字对比,发现第三个字符不同转入no段提示“ItisNOTapalindrome”,而当输入确实为回文时首字母错误,原因实在是查不出来。

实验四

实验目的

熟悉如何在数组中进行查找,并返回是否成功的信息,通过实验,可以掌握循环结构的各种实现方法,进一步了解循环结构中初始化部分、循环体部分、循环控制部分的功能以及他们彼此之间的关系。

实验内容

2请编写16位完整汇编程序,在一个升序字节数组BUFF中查找数N,找到后将此数从数组中删除,并使得CF=0;

没找到返回CF=1。

.modelsmall

.data

buffdb'

abcdefghijklmn'

'

$'

Ndb'

n'

.code

movdx,@data

movds,dx

moval,N

mov,ah,'

leadi,buff

finding:

incdi

cmpal,[di]

jzyes

cmpah,[di];

检测是否读完buff

jzno

jmpfinding

yes:

addah,0

movsi,di

setarray:

jzexit

movcl,[si]

mov[di],cl

incdi

jmpsetarray

movah,0

cmpah,1;

设置cf

exit:

movah,4ch

endstart

NC说明CF=0,查找到数N,查看存储单元由'

,‘n’变为’abcdefghijklm’,’$’,’n’已将数组中的数n删去

运用反汇编-u得到每个指令的地址,利用-g断点地址快速让程序运行到特定指令位置,可以方便快捷地排查错误

进位标志CF(Carryflag)CY

(1)NC(0)

实验五

通过本实验,掌握子程序的定义和调用方法。

通过程序调试,进一步理解CALL指令和RET指令的功能,掌握子程序调用时参数传递的方法。

请编写完整16位汇编程序从键盘读取字符,如果是十进制的‘0’~‘9’则在屏幕上输出该数的8位二进制码,并将数字依次存放到BUF开头的数组中,如果读入的字符是’Q’或者‘q’,则程序退出,其他情况在屏幕上打印“Youmustinput0~9,or‘q’or‘Q’”。

(如输入的字符是‘9’,则输出“00001001”).提示:

输出一个数的2进制形式应该从最高位开始输出。

要求打印一个数的2进制形式和输出回车换行分别定义成一个子程序可以将此段程序定义成一个过程。

.stack

STRdb'

youmustinput0~9orq,Q'

LFCRPROC

PUSHAX

MOVAH,02

MOVDL,0AH

POPAX

RET

LFCRENDP

PRINTPROC

JLT

CMPAL,9

JGT

MOVCX,8

LP:

MOVDL,0

SHLAL,1

ADCDL,30H

LOOPLP

JMPR

T:

LEADX,STR

MOVAH,09H

R:

PRINTENDP

MOVCX,-1

L:

CMPAL,'

Q'

JZexit

q'

CALLLFCR

CALLPRINT

POPCX

DECCX

PUSHCX

JNZL

输入的AH是ASCII码SUBAL,30H使的转换为数字

运用子程序调用可以使主程序看起来更加简洁明了,且易于调试,维护

LFCR回车换行需注意将ax压栈,以便调用int21h的输出功能

Crlfdb0ah,0dh,"

即为回车换行

实验六

ProgrammingasubroutinetocalculateN!

.Specificrequirements:

ReadanumberN(1~6)fromkeyboard,programmingasubroutinenamedDACtocalcuteN!

thenprinttheresulttoscreenindecimalform.

NUMBERDB?

STRdb0AH,0DH,'

youmustinput1~6'

OUTPUTDB20H,4DUP(20H),'

MOVBX,10

MOVSI,4

L:

IDIVBX

ADDDX,30H

MOVOUTPUT[SI],DL

MOVDX,0

DECSI

CMPSI,0

JGL

CHECK0:

INCSI

CMPOUTPUT[SI],30H

JNZRIGHT

MOVOUTPUT[SI],'

'

CMPSI,4

JLCHECK0

RIGHT:

LEADX,OUTPUT

MOVAH,9

INT21H

RET

LEADX,NUMBER

JBEexit

CMPAL,07H

JAEEXIT

MOVCL,AL

MOVCH,0H

MOVAX,1

IMULCX

LOOPNZLP

MOVAH,09H

一开始输出的十进制数带0,如0720,0002等,后检测为0即赋值20H(空格),发现6!

=72,不仅去掉了开头的0,也去掉了末尾的0,将NUMBER由+1至+4检查,遇到非0的数就退出检测可以解决。

实验七

在附加段中有一个从小到大排序的无符号数字数组,其首地址在DI中,数组的第一个单元存放数组长度。

要求用折半查找法在数组中查找数N,假设该数已在AX中,如找到,CF=0,并在SI中给出该元素在数组中的偏移地址;

如未找到,CF=1。

TABLEdb1,4,7,9,16,31,36,49

nDB1

rdb7

ldb0

MOVdi,offsetTABLE

movbl,n

movcl,2

check:

MOVal,r

cmpal,l

addal,l

movah,0

divcl

movah,0

addsi,ax

cmp[si],bl

jlright

movr,al

jmpcheck

right:

movl,al

jmpcheck

subah,1

jmpexit

cmpax,0

查找数字n=1(BX),得数组中序号0,即Table[0(AX)]=1满足搜索条件,使CF=0(NC),并用movsi,diaddsi,ax使得si获得Table[0(AX)]的偏移地址。

一开始divcl时忘记将AH设置成0,结果一直循环DIVC;

[SI+BI],IRET

MOVAH,0后恢复正常

实验八

在内存中有一个数组,里面是放着10个学生的某科的成绩,分别是:

85,73,92,66,91,98,52,87,83,68,请用冒泡排序法将这10个数从大到小排序,并将排序的结果在屏幕上打印出来,要求一个数一行的格式输出。

nequ10

BUFFERDB85,73,92,66,91,98,52,87,83,68

MOVBL,10

MOVSI,0

moval,BUFFER[si]

IDIVBL

MOVCX,AX

MOVDl,CL

ADDDL,30H

MOVDl,CH

LEADX,CRLF

INCSI

CMPSI,10

JLL

movcx,n

deccx

loop1:

movdi,cx

movbx,0

loop2:

moval,buffer[bx]

cmpal,buffer[bx+1]

jgecontinue

xchgal,buffer[bx+1]

movbuffer[bx],al

continue:

addbx,1

looploop2

movcx,di

looploop1

callPRINT

movah,4ch;

程序结束,返回到操作系统系统

int21h

ENDstart

即可实现换行

注意输出字符时需转换成ASCII以便输出,idiv10,先输出商再输出余数

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

当前位置:首页 > 自然科学 > 化学

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

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