汇编语言实验报告_第1页
汇编语言实验报告_第2页
汇编语言实验报告_第3页
汇编语言实验报告_第4页
汇编语言实验报告_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

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

文档简介

1、精选优质文档-倾情为你奉上 合肥工业大学实验报告课 程:汇编语言程序设计专业班级:学 号:姓 名: 实验一 Debug程序的使用1. 实验目的1、熟悉DEBUG程序中的命令,学会在DEBUG下调试运行汇编语言源程序。2、掌握8086/8088的寻址方式及多字节数据的处理方法。2. 实验内容1、利用DEBUG程序中的“E”命令,将两个多字节数“H”和“FEDCBA98H”分别送入起始地址为DS:0200H和DS:0204H两个单元中。2、分别用直接寻址方式和寄存器间接寻址方式编写程序段,实现将DS:0200H单元和DS:0204H单元中的数据相加,并将运算结果存放在DS:0208H单元中。要求:

2、本次实验的内容均在DEBUG下完成,实现数据的装入、修改、显示;汇编语言程序段的编辑、汇编和反汇编;程序的运行和结果检查。3. 实验过程和程序基础题:1、利用DEBUG程序中的“E”命令,将两个多字节数“H”和“FEDCBA98H”分别送入起始地址为DS:0200H和DS:0204H两个单元中。2、分别用直接寻址方式和寄存器间接寻址方式编写程序段,实现将DS:0200H单元和DS:0204H单元中的数据相加,并将运算结果存放在DS:0208H单元中。附加题:1.从DS:0000H开始的5个16位带符号数分别记为x,y,z,v,w,用E命令初始化为:540,1,-1,1080,0, 试求w=(v

3、-(x*y+z-540)/x2.完成BX中1的个数的统计。3.用串操作指令将DS:0000开始20个字节初始化为:0CCH。并将这20个字节的内容复制到其后的20个字节里。4. 实验结果(包括必要的截图)基础题 1:基础题 2:附加题 1:附加题 2:附加题 3:5. 实验体会1. 在汇编语言中,变量的其实都是地址。2. 在Debug中,数值都是16进制的。3. 在读写内存中的数据时,必须指出数据类型是byte还是word。实验二 汇编语言程序设计(顺序、多分支、循环)一. 实验目的1、掌握顺序和循环程序结构和设计方法;2、熟悉在PC机上建立、汇编、连接、调试和运行8086/8088汇编语言程

4、序的过程。二. 实验内容1、X、Y、Z、V均为字变量,在X、Y、Z、V字单元中存放是16位带符号数。试编写汇编语言程序完成以下功能:计算表达式值(V(X*Y+Z-720)/X;将上述表达式运算结果整数放在SUM1单元,余数放在SUM2单元。2、使用地址表实现如下功能:根据输入的数字17,分别显示相应的英文星期名,如果输入其他字符,则重新输入。3、求一个班50名学生成绩的平均值、最大值和最小值,并将结果显示出来。三. 实验过程和程序第一题:stacksegment stackdw 512 dup(?)stackendsdatasegmentX dw 021CHY dw 0001HZ dw 0FF

5、FFHV dw 0438HSUM1 dw 0HSUM2 dw 0Hdataendscodesegment assume cs:code,ds:data,ss:stackstart:mov ax,datamov ds,axmov ax, Ximul word ptr Ymov cx, dxmov bx, axmov ax, Zcwdadd bx, axadc cx, dxmov ax, 21CHcwdsub bx, axsbb cx, dxmov ax, Vcwdsub ax, bxsbb dx, cxidiv word ptr Xmov word ptr SUM1, axmov word pt

6、r SUM2, dxmov ah,4chint 21hcodeendsend start第二题:stacksegment stackdw 512 dup(?)stackendsdatasegmenttip db 'Input number(17, 0 for quit):', '$'msg1 db 'Monday',0DH, 0AH, '$'msg2 db 'Tuesday',0DH, 0AH, '$'msg3 db 'Wednesday',0DH, 0AH, '$'

7、msg4 db 'Thursday',0DH, 0AH, '$'msg5 db 'Friday',0DH, 0AH, '$'msg6 db 'Saturday',0DH, 0AH, '$'msg7 db 'Sunday',0DH, 0AH, '$'table dw show1, show2, show3, show4, show5, show6, show7dataendscodesegment assume cs:code,ds:data,ss:stackstart

8、:mov ax,datamov ds,axgetnum:; 打印提示信息mov dx, offset tipmov ah, 09Hint 21H; 用户输入数字mov ah, 01Hint 21Hmov bl, al; 换行保持美观mov ah, 02Hmov dl, 0DHint 21Hmov ah, 02hmov dl, 0AHint 21H; 非法数值重新输入cmp bl, '0'jb getnumcmp bl, '7'ja getnum; 输入'0'直接退出cmp bl, '0'je quitand bx, 000FHde

9、c bxshl bx, 01Hjmp tablebx; 输出对应单词print:mov ah, 09Hint 21Hjmp getnumquit:mov ah,4chint 21hshow1:mov dx, offset msg1jmp printshow2:mov dx, offset msg2jmp printshow3:mov dx, offset msg3jmp printshow4:mov dx, offset msg4jmp printshow5:mov dx, offset msg5jmp printshow6:mov dx, offset msg6jmp printshow7:

10、mov dx, offset msg7jmp printcodeendsend start第三题:stacksegment stackdw 512 dup(?)stackendsdata segmentstudent db 50 dup(2)table dw 10000, 1000, 100, 10, 1NewLine db 0DH, 0AH, '$'MaxStr db 'Max:$'MinStr db 'Min:$'Average db 'Average:$'data endscode segmentassume cs:code

11、,ds:data,ss:stackstart:mov ax,datamov ds,axcall calcAveragecall findMaxcall findMinmov ah, 4CHint 21HcalcAverage:lea si, studentmov cx, 50mov ax, 0PlusNext:add al, siadc ah, 0inc siloop PlusNextmov bl, 50div blmov bl, alxor bh, bhlea dx, Averagemov ah, 09Hint 21Hcall putnumlea dx, NewLinemov ah, 09H

12、int 21HretfindMax:lea si, studentmov cx, 50mov al, 0MaxNext:cmp al, sija MaxPassmov al, siMaxPass:inc siloop MaxNextmov bl, alxor bh, bhlea dx, MaxStrmov ah, 09Hint 21Hcall putnumlea dx, NewLinemov ah, 09Hint 21HretfindMin:lea si, studentmov cx, 50mov al, 0FFHMinNext:cmp al, sijb MinPassmov al, siMi

13、nPass:inc siloop MinNextmov bl, alxor bh, bhlea dx, MinStrmov ah, 09Hint 21Hcall putnumlea dx, NewLinemov ah, 09Hint 21Hretputnum:mov cx, 5lea di, tablenext:mov ax, bxmov dx, 0Hdivword ptrditest al, 0Hmov bx, dxadd al, '0'mov dl, almov ah, 02Hint 21Hadd di, 2loop nextretcode endsend start四.

14、实验结果(包括必要的截图)第一题:第二题:第三题:五. 实验体会1. 汇编中的分支、循环只能通过跳转实现。2. 地址表是实现多分支结构的常用方法。实验三 循环和子程序设计1. 实验目的1、掌握循环程序和子程序的设计方法;2、熟悉在PC机上建立、汇编、连接、调试和运行8086/8088汇编语言程序的过程。2. 实验内容1. 在内存Score缓冲区中存放有100个学生的成绩数据,为无符号字节数。设 计程序完成如下功能:根据用户输入的一个2位十进制数,作为查找对象,在该数组中查找,若找到则显示“Y”,若没找到则显示“N” 。2. 从键盘读入一个字符串,以Enter结束,字符串不超过50个字符,并打印

15、该字符串(附加题:查找中间是否有asm子串。如果有,输出Yes;否则,输出No)。3. 编写一个子程序计算z=f(x,y)=x*y+x-y(x,y,z有符号数内存数)。要求通过堆栈(寄存器、内存)传送所有参数。(要求输入输出实现,且有提示)3. 实验过程和程序第一题:stack segment stackdw 512 dup(0)stack endsdata segmentScore db 20, 21, 22, 23, 24, 25, 26, 27, 28, 29db 30, 31, 32, 33, 34, 35, 36, 37, 38, 39db 40, 41, 42, 43, 44, 4

16、5, 46, 47, 48, 49db 50, 51, 52, 53, 54, 55, 56, 57, 58, 59db 60, 61, 62, 63, 64, 65, 66, 67, 68, 69db 70, 71, 72, 73, 74, 75, 76, 77, 78, 79db 80, 81, 82, 83, 84, 85, 86, 87, 88, 89db 90, 91, 92, 93, 94, 95, 96, 97, 98, 99db 100, 101, 102, 103, 104, 105, 106, 107, 108, 109db 110, 111, 112, 113, 114,

17、 115, 116, 117, 118, 119NextLine db 0DH, 0AH, '$'Tip db 'Input a number:', '$'No db 'N', 0DH, 0AH, '$'Yes db 'Y', 0DH, 0AH, '$'InputBuf db 4, ?, 8 dup('$')data endscode segmentassume cs:code, ds:data, ss:stackstart:mov ax, datamov ds, a

18、x; 打印提示信息lea dx, Tipmov ah, 09Hint 21H; 获取用户的输入,放在alsub sp, 2call GetNumpop ax; 扫描Scorelea bx, Scoremov cx, 100L:cmp al, bx; 若bx = al, 找到je Foundinc bxloop L; 循环没有中断,没找到,打印'No'lea dx, Nojmp OutPutFound:lea dx, Yesjmp OutPutOutPut:mov ah, 09Hint 21HExit:mov ah, 4CHint 21H; 参数: 无; 返回值: 8位无符号数G

19、etNum proc farpush axpush bxpush cxpush dxpush bpmov bp, splea dx, InputBufmov ah, 0AHint 21Hmov dl, 10xor ax, axlea bx, InputBuf2mov cl, InputBuf1;设置CXxor ch, chNext_GetNum:mul dlmov dh, bxsub dh, '0'add al, dhinc bxloop Next_GetNumxor ah, ahmov ss:bp+14, axlea dx, NextLinemov ah, 09Hint 21

20、Hpop bppop dxpop cxpop bxpop axretGetNum endpcode endsend start第二题:stack segment stackdw 512 dup(0)stack endsdata segmentStrBuf db 50, ?, 50 dup('$'), '$'Tip1 db 'Input a string:', 0DH, 0AH, '$'Tip2 db 'You input:', 0DH, 0AH, '$' No db 'No', 0D

21、H, 0AH, '$'Yes db 'Yes', 0DH, 0AH, '$'NextLine db 0DH, 0AH, '$'data endscode segmentassume cs:code, ds:data, ss:stackstart:mov ax, datamov ds, axcall GetLinelea bx, StrBuf2;BX为字符串首地址L_BEGIN:; 每次循环的开始cmp byte ptr bx, '$' 如果bx是'$',字符串已经结束,跳出循环je L_ENDcmp

22、 byte ptr bx, 'a' 若bx是'a',比较bx+1是不是's'jne NEXTcmp byte ptr bx+1, 's'jne NEXTcmp byte ptr bx+2, 'm' 若bx+2是'm',找到了'asm',跳出循环je L_ENDNEXT:inc bxjmp L_BEGINL_END:cmp byte ptr bx, '$'若bx='$',则没找到'asm',否则就是找到了jne Foundlea dx,

23、Nojmp OutPutFound:lea dx, Yesjmp OutPutOutPut:mov ah, 09Hint 21HExit:mov ah, 4CHint 21HGetLine proc farpush axpush bxpush dx; 打印输入提示lea dx, Tip1mov ah, 09Hint 21H; 获取用户输入lea dx, StrBufmov ah, 0AHint 21H; 在StrBuf结尾添加'$'lea bx, StrBuf2mov al, StrBuf1xor ah, ahadd bx, axmov byte ptr bx, '$&

24、#39; 换行打印lea dx, NextLinemov ah, 09Hint 21H; 输出提示lea dx, Tip2mov ah, 09Hint 21H; 打印用户输入的字符串lea dx, StrBuf2mov ah, 09Hint 21H; 换行打印lea dx, NextLinemov ah, 09Hint 21Hpop dxpop bxpop axretGetLine endpcode endsend start第三题:stack segment stackdw 512 dup(0)stack endsdata segmentX db 0Y db 0Z dw 0NextLine

25、db 0DH, 0AH, '$'TipX db 'Input X:', '$'TipY db 'Input Y:', '$'TipZ db 'Z = ', '$'InputBuf db 6, ?, 10 dup('$')OutputBuf db 16 dup('$')Table dw 10000, 1000, 100, 10, 1data endscode segmentassume cs:code, ds:data, ss:stackstart:mo

26、v ax, datamov ds, ax; 用户输入 Xlea dx, TipXmov ah, 09Hint 21Hsub sp, 2call GetNumpop axmov X, allea dx, NextLinemov ah, 09Hint 21H; 用户输入 Ylea dx, TipYmov ah, 09Hint 21Hsub sp, 2call GetNumpop axmov Y, allea dx, NextLinemov ah, 09Hint 21Hmov al, Xmov ah, Ypush axcall Funcpop axmov Z, axpush word ptr Zca

27、ll PutNumExit:mov ah, 4CHint 21H; 参数 8位有符号数X, Y; 返回值: 16位有符号数Func proc farpush axpush bxpush dxpush bpmov bp, spmov bx, bp+12;bl=X, bh=Ymov al, blimul bh; ax = X*Ymov dx, ax; dx = X*Y; dx += Xmov al, blcbw add dx, ax; dx -= Ymov al, bhcbwsub dx, axmov bp+14, dxpop bppop dxpop bxpop axret 2Func endp;

28、 参数: 无; 返回值: 8位有符号数GetNum proc farpush axpush bxpush cxpush dxpush bpmov bp, splea dx, InputBufmov ah, 0AHint 21Hmov dl, 10xor ax, axlea bx, InputBuf2mov cl, InputBuf1;设置CXxor ch, chcmp byte ptr InputBuf2, '-'jne Next_GetNumdec cxinc bxNext_GetNum:mul dlmov dh, bxsub dh, '0'add al, d

29、hinc bxloop Next_GetNumcmp byte ptr InputBuf2, '-'jne End_GetNummov bl, alxor al, alsub al, blEnd_GetNum:xor ah, ahmov ss:bp+14, axlea dx, NextLinemov ah, 09Hint 21Hpop bppop dxpop cxpop bxpop axretGetNum endp; 参数: 16位有符号数; 返回值: 无PutNum proc far push axpush bxpush cxpush dxpush dipush sipush

30、 bpmov bp, spmov bx, bp+18cmp word ptr bp+18, 0jge P1_PutNummov bx, 0sub bx, bp+18P1_PutNum:mov cx, 5lea si, tablelea di, OutputBufNext_PutNum:mov ax, bxmov dx, 0Hdivword ptr simov bx, dxadd al, '0'mov di, aladd si, 2inc diloop Next_PutNummov byte ptr di, '$'lea di, OutputBuf-1L_PutN

31、um:inc dicmp byte ptr di, '0'je L_PutNumcmp byte ptr di, '$'jne OutPut_PutNumdec diOutPut_PutNum:cmp word ptr bp+18, 0jge P2_PutNumdec dimov byte ptr di, '-'P2_PutNum:mov dx, dimov ah, 09Hint 21Hpop bppop sipop dipop dxpop cxpop bxpop axret 2PutNum endp code endsend start4. 实

32、验结果(包括必要的截图)第一题:第二题:第三题:5. 实验体会1.汇编没有易用的IO模块,在处理IO时应采用缓存方法。2.函数可以通过栈传参数,但在调用函数前后要维持堆栈平衡。实验四 宏与中断程序设计一. 实验目的1、汇编语言宏程序设计;2、掌握中断服务子程序的编写。二. 实验内容1、编写一个宏,求三个数的最小数,原型为:MIN3 x,y,z,min2、挂接1CH中断,正计时60秒后退出。要求屏幕显示0-59的秒数。3、VC+中编写内联汇编,将字节数组的每个元素高低四位互换。 char dbyte = 0x34,0x45,0x56,0x67,0xaf;三. 实验过程和程序第一题:MIN3 ma

33、cro x, y, z, minlocal L1, L2push axmov ax, xcmp ax, yjb L1mov ax, yL1: cmp ax, zjb L2mov ax, zL2: mov min, axpop axendm第二题:INTNO EQU 1CH DATA SEGMENTOLDISR DW ?,?; 记录原来的中断向量TIMER DB 100COUNTER DW 60; 60秒ISDONE DB 0; 标记,1 表示结束 DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AX MOV AX,0MOV ES,AX ;PROTECT; 保存 1CH 原有的中断向量CLIMOV AX, ES:INTNO*4MOV OLDISR0,AXMOV AX,ES:INTNO*4+2MOV OLDISR2, AXSTI ;SET NEW ISR; 挂接自己的中断过程CLIMOV

温馨提示

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

评论

0/150

提交评论