计算机输入输出课程汇编实验部分_第1页
计算机输入输出课程汇编实验部分_第2页
计算机输入输出课程汇编实验部分_第3页
计算机输入输出课程汇编实验部分_第4页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、IO 汇编实验部分实验一一)实验目的学会安装“ 16 位汇编程序开发软件”的安装,完成将汇编语言源程序录入进计算机、利用 ml.exe 进行汇编, LINK 进行链接,并用 DEBUG 调试 16 位程序的全部过程。本实验大家不必了解程序细节,只是为了熟悉开发环境和上机过程。二)实验内容3. 写 16 位汇编程序,从键盘输入一个字符串,然后换行后将该字符串输出到屏幕。1)源程序data segmentbuffDB 255DB ?DB 255 dup (?)crlf db 0ah, 0dh, $; 回车换行data endscode segmentassume ds:data, cs:codes

2、tart:mov ax, datamovds, axlea dx, buffmov ah, 0ahint 21hlea dx, crlfmov ah, 9hint 21hlea si, buff + 2hmov cl, buff + 1hnext:cmp cl, 0hjefinishmov dl, byte ptr simov ah, 2hint 21h1/16dec clinc sijmp nextfinish:mov ah, 4chint 21hcode endsend start2)运行结果贴图3)编程与调试心得(遇到的问题和解决的办法,以及获得的收获)一开始写 buff byte 25

3、5显示 error ,换成 buffdb 255 可以运行Crlf db 0ah, 0dh, $; 回车换行关键在于获取字符串的长度,会存储在buff+1h中也可在末尾加$表示结尾。实验二一)实验目的通过这一部分的实验, 进一步熟悉汇编过程和 DEBUG 调试过程; 掌握用汇编语言编写顺序程序。二)实验内容2. 写完整程序16 位程序,在内存中从Table 开始的 10 个单元中连续存放0 到 9 的平方值,任给一个0 到 9 的数 X ,该数存放在内存单元XX 中,用 XLAT 指令查表求X 的平方值,并将结果存于内存YY 单元中。编写程序,并在DEBUG 中进行调试和验证结果。(X ,XX

4、 , YY 都是内存中的变量)1)源程序.8086.MODEL SMALL.STACK.DATATABLE db 0,1,4,9,16,25,36,49,64,81RESULT DB ?crlf db 0ah, 0dh, $; 回车换行.CODESTART:MOV AX,DATA2/16MOV DS,AXMOV BX,offset TABLEMOV AH,01HINT 21HSUB AL,30HXLATMOV RESULT,ALleadx, crlf; 输出回车换行mov ah, 9hint 21hMOV DL,RESULTMOV AH,02HINT 21HEXIT:MOV AH,4CHINT

5、 21Hend start2)运行结果贴图运行 debug,-u 反汇编 -g 至 001E ,输入值6,查表应为36,即 24H( 00100100)查 ASCII 为 $,图 0076A:0030 位置即为result值(通过对比一开始的存储单元得出)3/163)编程与调试心得(遇到的问题和解决的办法,以及获得的收获)一开始没有注意到输入的AL 是 ASCII 码,应当减去30H数据存储在 result 中可以用 -d 查询,学会了使用反汇编和查询存储单元通过输出是 ASCII 码,如 9 对应 result 的 81,即 51H,查表恰为 Q 说明存储正确(可用除 10 或循环移位的方法

6、,单个数转为十进制数输出)实验三一)实验目的通过本实验,熟练使用字符串的输入、读取与判断,通过实验,可以掌握循环结构的各种实现方法, 进一步了解循环结构中初始化部分、 循环体部分、 循环控制部分的功能以及他们彼此之间的关系。尤其是多重循环中外层循环和内层循环之间的关系。二)实验内容所谓回文字符串是指一个字符串正读和倒读都是一样的,例如字符串ABCDEFFEDCBA 就是一个回文字符串,而字符串ABCFDDCAB 就不是回文字符串。现在编写完整的16位汇编程序,输入一个字符串,判断该字符串是否为回文字符串,并用“It is a palindrome ”或“ It is NOT a palindr

7、ome ”作为输出。1)源程序data segmentbuff db 255db ?db 255 dup (?)crlf db 0ah, 0dh, $; 回车换行Y DB It is a palindrome$N DB It is NOT a palindrome$data endscode segmentassume ds:data, cs:codestart:mov ax, datamov ds, ax4/16lea dx, buffmov ah, 0ahint 21hlea dx, crlfmov ah, 9hint 21hmovbl, buff + 1hmov bh,0hmov di,

8、2hadd di,bxmov si, 1hdec blnext:dec bldec diinc sicmp bl, 0hjefinishmov dl,buffsimov ah, 2hint 21hmov dl,buffdimov ah, 2hint 21hmov dl, mov ah, 2hint 21hmov al,buffsimov cl,buffdicmp cl,aljne nojmp nextno:lea dx, crlfmov ah, 9hint 21h5/16mov dx,offset Nmov ah,09hINT 21Hmovah, 4chint 21hfinish: leadx

9、, crlfmov ah, 9hint 21hmov dx,offset Ymov ah,09hINT 21Hmov ah, 4chint 21hcode endsend start2)运行结果贴图3)编程与调试心得(遇到的问题和解决的办法,以及获得的收获)本程序存在 bug,如上图当输入 abvcba 时可以将 abvcab 与 abcvba 逐个字对比,发现第三个字符不同转入 no 段提示“ It is NOT a palindrome ,”而当输入确实为回文时首字母错误,原因实在是查不出来。实验四实验目的熟悉如何在数组中进行查找, 并返回是否成功的信息, 通过实验, 可以掌握循环结构的各

10、种实现方法, 进一步了解循环结构中初始化部分、 循环体部分、 循环控制部分的功能以及他们彼此之间的关系。尤其是多重循环中外层循环和内层循环之间的关系。实验内容6/162请编写 16 位完整汇编程序,在一个升序字节数组BUFF 中查找数N ,找到后将此数从数组中删除,并使得CF=0 ;没找到返回CF 1。1)源程序.8086.model small.databuff db abcdefghijklmn,$N db n.codestart:mov dx,datamov ds,dxmov al,Nmov,ah,$lea di,buffdec difinding:inc dicmp al,dijz y

11、escmp ah,di;检测是否读完buffjz nojmp findingyes:add ah,0mov si,diinc sisetarray: cmp ah,di;检测是否读完buffjz exitmov cl,simov di,clinc diinc sijmp setarrayno:mov ah,0cmp ah,1;设置 cfexit:mov ah,4chint 21hend start2)运行结果贴图7/16NC 说明 CF=0,查找到数N,查看存储单元由abcdefghijklmn,$, n变为 abcdefghijklm , $, n 已将数组中的数n 删去3)编程与调试心得(

12、遇到的问题和解决的办法,以及获得的收获)运用反汇编 -u 得到每个指令的地址,利用-g断点地址快速让程序运行到特定指令位置,可以方便快捷地排查错误进位标志CF(Carry flag) CY(1) NC(0)实验五实验目的通过本实验,掌握子程序的定义和调用方法。通过程序调试,进一步理解CALL指令和 RET 指令的功能,掌握子程序调用时参数传递的方法。实验内容请编写完整16 位汇编程序从键盘读取字符,如果是十进制的0 9则在屏幕上输出该数的 8 位二进制码, 并将数字依次存放到BUF 开头的数组中, 如果读入的字符是Q或者q,则程序退出,其他情况在屏幕上打印“You must input 09,

13、 orq”or。(如Q输入的字符是 9,则输出“ 00001001”) .提示:输出一个数的2 进制形式应该从最高位开始输出。要求打印一个数的 2 进制形式和输出回车换行分别定义成一个子程序可以将此段程序定义成一个过程。1)源程序.8086.model small.stack.dataSTR db you must input 09 or q,Q,$.codeLFCR PROCPUSH AX8/16MOV AH,02MOV DL,0AHINT 21HPOP AXRETLFCR ENDPPRINT PROCSUB AL,30HJL TCMP AL,9JG TMOV AH,02HMOV CX,8L

14、P:MOV DL,0SHL AL,1ADC DL,30HPUSH AXINT 21HPOP AXLOOP LPJMP RT:LEA DX,STRMOV AH,09HINT 21HR: RET PRINT ENDPstart:mov dx,datamov ds,dxMOV CX,-1L:MOV AH,01HINT 21HCMP AL,QJZ exitCMP AL,qJZ exitCALL LFCRCALL PRINT9/16CALL LFCRPOP CXDEC CXPUSH CXJNZ Lexit:mov ah,4chint 21hend start2)运行结果贴图3)编程与调试心得(遇到的问题

15、和解决的办法,以及获得的收获)输入的 AH是 ASCII 码 SUB AL,30H 使的转换为数字运用子程序调用可以使主程序看起来更加简洁明了,且易于调试,维护LFCR回车换行需注意将 ax 压栈,以便调用 int 21h 的输出功能Crlf db 0ah, 0dh, $; 即为回车换行实验六实验目的熟悉如何在数组中进行查找, 并返回是否成功的信息, 通过实验, 可以掌握循环结构的各种实现方法, 进一步了解循环结构中初始化部分、 循环体部分、 循环控制部分的功能以及他们彼此之间的关系。尤其是多重循环中外层循环和内层循环之间的关系。实验内容Programming a sub routine to

16、 calculate N!. Specific requirements :Read a number N(16) from keyboard,programming a sub routine named DAC to calcute N! , then print the result to screen in decimal form.1)源程序.8086.model small.stack.dataNUMBER DB ?,$STR db 0AH,0DH,you must input 16,$10/16OUTPUT DB 20H,4 DUP(20H),$.codePRINT PROCMO

17、V BX,10MOV SI,4L: IDIV BX ADD DX,30HMOV OUTPUTSI,DL MOV DX,0DEC SI CMP SI,0JG LCHECK0: INC SICMP OUTPUTSI,30HJNZ RIGHTMOV OUTPUTSI, CMP SI,4JL CHECK0RIGHT:LEA DX,OUTPUTMOV AH,9INT 21HMOV AH,4CHINT 21HRETPRINT ENDPstart:mov dx,datamov ds,dxLEA DX,NUMBERMOV AH,01HINT 21HSUB AL,30HJBE exitCMP AL,07HJAE

18、 EXITMOV CL,ALMOV CH,0HMOV AX,1MOV DX,011/16LP:IMUL CXLOOPNZ LPCALL PRINTexit:LEA DX,STRMOV AH,09HINT 21Hmov ah,4chint 21hend start2)运行结果贴图3)编程与调试心得(遇到的问题和解决的办法,以及获得的收获)一开始输出的十进制数带 0,如 0720,0002 等,后检测为 0 即赋值 20H(空格 ) ,发现 6!=72,不仅去掉了开头的 0,也去掉了末尾的 0,将 NUMBER由 +1 至 +4 检查,遇到非 0 的数就退出检测可以解决。实验七实验目的熟悉如何在数

19、组中进行查找, 并返回是否成功的信息, 通过实验, 可以掌握循环结构的各种实现方法, 进一步了解循环结构中初始化部分、 循环体部分、 循环控制部分的功能以及他们彼此之间的关系。尤其是多重循环中外层循环和内层循环之间的关系。实验内容在附加段中有一个从小到大排序的无符号数字数组,其首地址在DI 中,数组的第一个单元存放数组长度。要求用折半查找法在数组中查找数N,假设该数已在AX 中,如找到, CF=0 ,并在 SI 中给出该元素在数组中的偏移地址;如未找到,CF=1 。1)源程序12/16.8086.MODEL SMALL.STACK.DATATABLE db 1,4,7,9,16,31,36,4

20、9n DB 1r db 7l db 0crlf db 0ah, 0dh, $; 回车换行.CODESTART:MOV AX,DATAMOV DS,AXMOV di,offset TABLEmov bl,nmov cl,2check:MOV al,rcmp al,ljz noadd al,lmov ah,0div clmov ah,0mov si,diadd si,axcmp si,bljz yesjl rightmov r,aljmp checkright:mov l,aljmp checkno:mov ah,0sub ah,1jmp exityes:add si,axcmp ax,0EXIT

21、:MOV AH,4CHINT 21Hend start13/162)运行结果贴图查找数字n=1( BX),得数组中序号0,即 Table0 (AX)=1 满足搜索条件, 使 CF=0(NC),并 用 mov si,di add si,ax使得 si 获得 Table0 ( AX) 的偏移地址。3)编程与调试心得(遇到的问题和解决的办法,以及获得的收获)一开始 div cl时忘记将AH设置成 0,结果一直循环DIV C;? ,SI+BI,IRETMOV AH,0后恢复正常实验八实验目的熟悉如何在数组中进行查找, 并返回是否成功的信息, 通过实验, 可以掌握循环结构的各种实现方法, 进一步了解循环结构中初始化部分、 循环体部分、 循环控制部分的功能以及他们彼此之间的关系。尤其是多重循环中外层循环和内层循环之间的关系。实验内容在内存中有一个数组,里面是放着10个学生的某科的成绩,分别是:85,73,92,66,91,98,52,87,83,68 , 请用冒泡排序法将这 10

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论