微机原理及汇编语言
程序设计
实 验 指 导 书
计算机实验中心
目 录
个人资料整理 仅限学习使用
实验一 DEBUG的使用
【实验目的】
1.学习使用DEBUG调试程序的各种命令。
2.掌握8088/8086指令系统---数据传送指令、算术指令。 3.掌握用DEBUG调试程序的方法。
4.掌握8088/8086 CPU寄存器的用途和存储器组织及它们之间的关系。
个人资料整理 仅限学习使用
5.掌握内存操作数及寻址方法。
6.掌握汇编语言伪操作:BYTE PTR,WORD PTR。
7.熟悉在PC机上建立、汇编、连接、调试和运行汇编语言程序的过程。
8.掌握数据传送、算术运算、BCD码调整和循环指令的用法,掌握字符显示的方法。
【实验性质】
验证性实验<学时数:2H)
【实验内容】
一、DEBUG 命令的使用
1.敲 DEBUG 进入 DEBUG 环境,显示提示符 '_ '。
2.用命令 D100 10F 观察内存中的16进制码及屏幕右边的ASCII字符。
3.用命令 E100 30 31 32 ……3F 将30H~3FH写入地址为100H开始的内存单元 中,再用D命令观察结果,看键入的16进制数是什么字符的ASCII码? 4.用命令 F100 L0F 'A' 将'A'的ASCII码填入内存,用D命令查看结果。 5.用命令 F110 11F 41 将41H 填入内存,用D命令观察结果并比较。
6.用R 命令检查各寄存器内容,特别注意AX,BX,CX,DX,IP及标志位中ZF,CF和AF 的内容。
7.用R命令将AX,BX内容改写为1234H及5678H。
8.用H命令检查下列各组16进制数加减结果并和你的手算结果比较: (1>34H,22H (2>56H,78H (3>A5,79H (4>1284H,5678H (5>A758,347FH 二、8088/8086常用指令练习
1.传送指令
1>用A命令在内存100H处键入下列内容: MOV AX,1234 MOV BX,5678 XCHG AX,BX MOV AH,34 MOV AL,56 MOV CX,75AB XCHG AX,CX
2>用U命令检查键入的程序,特别注意左边的机器码。
3>用T命令逐条运行这些指令,每运行一行检查并记录有关寄存器及IP的变化情况。并注意标志位有无变化。
2.加减法指令:
1>用A命令在内存200H处键入下列内容:
MOV AH,34 MOV AL,2E ADD AL,AH SUB AL,78 MOV CX,1234 MOV DX,5678 ADD CX,DX SUB CX,AX SUB CX,CX
2>用U命令检查键入的程序及对应的机器码。
3>用T命令逐条运行这些指令,检查并记录有关寄存器及ZF情况。
思考题:
这次运行还是打入T,行不行?如何单步运行上述小程序?用R命令检查一下IP的内容。注意T命令与IP的关系。 3.带进位加减法:
个人资料整理 仅限学习使用
1>用A命令在内存300H处键入下列内容,并用U命令检查:
MOV AH,12 MOV AL,89 MOV CH,56 MOV CL,98 ADD AL,CL ADC AH,CH MOV DH,A7 MOV DL,58 SUB DL,7F SBB DH,34
2>用T命令逐条运行这些指令,检查并记录有关寄存器及CF内容。
3>上面这段程序若改用16位操作指令达到同样结果,怎么改?试修改并运行之。 4.BCD码加减法
1>内容:
MOV AL,58 ADD AL,25 DAA
2>要求:用A 命令键入,U命令检查,T命令逐条运行并记录有关寄存器及AF内容。 三、内存操作数及各种寻址方式使用:
1>用A命令在内存400H处键入下列内容,并用U命令检查: MOV AX,1234
MOV [1000],AX MOV BX,1002 MOV BYTE PTR[BX],20 MOV DL,39 INC BX MOV [BX],DL DEC DL MOV SI,3 MOV [BX+SI],DL MOV [BX+SI+1],DL MOV WORD PTR[BX+SI+2],2846
2>用T命令逐条运行这些指令,每运行一条有关内存操作数的指令,要用D命令检查并记录有关内存单元的内容并注明是什么寻址方式。 注意:D命令显示结果中右边的ASCII字符及双字节数存放法。
思考题: 有关指令中BYTE PTR及WORD PTR伪操作不加行不行?试一试。
四、DEBUG环境下汇编运行程序方法
用A命令汇编程序,编程完成将DS:1000开始的10个字节的内存单元的内容相加,并把相加结果存放在DS:100A 内存单元中,用DEBUG调试运行该程序,并察看运行结果。 内容:
MOV CX,0AH MOV AL,0 MOV BX,1000 LL: ADD AL,[BX] INC BX DEC CX JNZ LL
MOV [BX],AL INT 3 步骤:
1>用A命令将程序键入到100H开始的内存中,在键入时记下标号LL的实际地址,在键入JNZ指令时LL用实际
个人资料整理 仅限学习使用
地址值代替。 2>用U命令检查键入的程序及对应的机器码。
3>用E1000 01 02 03 04 05 06 07 08 09 0A将1000H开始的前10个内存单元的内容修改为01,02,03,04,05……0A,用D命令查看修改结果。 4>用T命令逐条运行上述小程序指令,检查并记录有关寄存器、存储单元内容及ZF情况。
5>用F2000 L0A 02 03 04 05 ……0B 将1000H开始的10 个内存单元的内容修改为02,03,04,05……0B。用D命令查看修改结果。 6>用G=100 全速运行上述小程序,用D1000 100F 查看运行结果。
思考题:
可否随意在DEBUG提示符“-”后不带参数发出命令G?什么情况下使用命令G时,可不用“=”给出执行的首地址? 五、两个多位十进制数相加
要求:将下面程序在汇编平台下,完整地进行汇编、连接、运行,然后用DEBUG软件调入可执行文件到内存,用反汇编命令查看实际程序及数据区内容,用t命令逐条执行,以观察各寄存器及数据区内存的数据变化情况,然后使用p命令和g命令执行,以观察执行过程有何特点。 将两个5位十进制数相加,要求被加数<本题选47193)和加数<本题选28056)均以ASCII码形式各自顺序存放在以DATAl和DATA2为首的5个内存单元中(低位在前>,结果送回以DATA3为首的5个内存单元中(低位在前>,并显示相加的结果。 实验程序和结果如下:
DATA SEGMENT
DATA1 DB 33H,39H,31H,37H,34H 。存放被加数47193,ASCII码形式,低位在前 DATA2 DB 36H,35H,30H,38H,32H 。存放加数28056,ASCII码形式,低位在前 DATA3 DB 5 DUP(?> 。留出5个存放结果的单元 DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV CX,5 。循环次数置5,5个位要相加5次 MOV SI,0 。SI放地址位移量,每个数的第一字节地址位移量为0 CLC 。CF清0,防止第1个字节相加时ADC指令多加CF中可能的1 NEXT: MOV AL,DATA1[SI] 。取被加数一个字节送AL,DATA1偏移地址+SI为有效地址 ADC AL,DATA2[SI] 。AL+加数对应字节+CF<低位相加时可能的进位)结果送AL AAA 。AL中两字节相加的和调整成非压缩的BCD码,进位在CF中 MOV DATA3[SI],AL 。结果送入DATA3对应字节单元中 INC SI 。地址位移量加1指向高一位字节单元 LOOP NEXT 。5次未到,继续循环 MOV SI,5 。显示5个位,SI中的数既是循环次数又作地址位移量 DISP: ADD DATA3[SI-1],30H 。将结果从高位单元开始把非压缩的BCD码变成ASCII码 MOV DL,DATA3[SI-1] 。将ASCII码送DL以满足2号功能调用的规定要求 MOV AH,2 。功能号送AH INT 21H 。调用2号功能,显示一位数字 DEC SI 。次数减1 JNZ DISP 。5次未到,继续循环 MOV AH,4CH 。功能号送AH INT 21H 。调用4CH号功能,返回DOS CODE ENDS END START
运行结果:
75249
个人资料整理 仅限学习使用
思考题:
1.上述程序只显示了相加的结果,没有显示被加数和加数,如果在上述程序的基础上将显示格式改为47193+28056=75249,则程序如何修改? 2.上述程序没有考虑运算结果最高位有进位的情况,如果考虑可能产生的进位,则要显示完整的结果,程序如何修改?<提示:INC和LOOP指令均不影响CF)
【报告要求】
1.列出8086常用指令练习部分的逐条运行记录。
2.列出DEBUG下调试运行小程序的运行步-------------------运行结果。 3.回答思考题。
附:
DEBUG 命令
1.打 DEBUG 进入 DEBUG,显示提示苻 '_ '。 2.退出DEBUG命令:Q
3.显示内存命令:D 起始地址结束地址
4.修改内存命令:E 起始地址,连续修改打空格键。打回车键退出E命令。 5.检查寄存器命令:R 标志位显示 1 0
CF CY NC ZF ZR NZ SF NG PL AF AC NA OF OV NV PF PE PO DF DN UP IF EI DI
6.修改寄存器命令:R 寄存器名
7.小汇编命令:A 起始地址,不输入指令打回车键退出A命令。 8.反汇编命令:U 起始地址 结束地址 9.文件命名命令:N 盘号:文件名 10.读文件命令:L 内存地址 11.写文件命令:W 内存地址
10.读扇区命令:L 内存地址 盘号(0--A:,1--B:> 扇区号 扇区数 11.写扇区命令:W 内存地址 盘号 扇区号 扇区数 12.运行命令:G=起始地址 结束(断点>地址
13.单步命令:T=起始地址 运行指令数,进入子程序内部。 14.单步命令:P=起始地址 运行指令数,不进入子程序内部。 15.内存搬家命令:M 起始地址 结束地址 目的地址
实验二 数制转换程序
【实验目的】
1.掌握汇编语言程序结构。
2.掌握建立、汇编、链接、调试和运行汇编程序的过程。 3.掌握DOS功能调用 INT 21H 02号功能字符显示输出方法。 4.掌握INT 21H 4C号功能返回系统的方法。
【实验性质】
验证性实验<学时数:2H)
【实验内容】
一、完成一个十六位二进制数到十六进制数的转换操作程序设计。
个人资料整理 仅限学习使用
参考程序:
。将二进制数一边转换成十六进制数一边显示<用2号功能调用) DATA SEGMENT BUFA DW 1111001000110100B 。F234H DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA BEG: MOV AX,DATA MOV DS,AX MOV DX,BUFA MOV CH,4 。循环控制十六进制数显示位数 MOV CL,4 ROTATE: ROL DX,CL 。循环左移4位,将高位十六进制数移到低位 MOV BX,DX 。保护移动后的数 AND DX,0FH 。屏蔽掉高位保留该低位数 CMP DL,9 JG L ADD DL,30H ;转换成ASCII码 MOV AH,2 ;送显示 INT 21H JMP NEXT L: ADD DL,37H MOV AH,2 INT 21H NEXT: MOV DX,BX DEC CH
JNZ ROTATE
MOV AH,4CH INT 21H CODE ENDS END START 二、把上题改造成COM文件的编程格式,汇编、链接和运行调试该程序。 参考程序:
CODE SEGMENT ASSUME CS:CODE ORG 100H BEG: JMP START BUFA DW 0001001000110100B 。1234H(用户程序数据区> START: MOV DX,BUFA MOV CH,4 。循环控制十六进制数显示位数 MOV CL,4 ROTATE: ROL DX,CL 。循环左移4位,将高位十六进制数移到低位 MOV BX,DX 。保护移动后的数 AND DX,0FH 。屏蔽掉高位保留该低位数 CMP DL,9 JG L ADD DL,30H ;转换成ASCII码 MOV AH,2 ;送显示 INT 21H JMP NEXT L: ADD DL,37H MOV AH,2 INT 21H NEXT: DEC CH MOV DX,BX
个人资料整理 仅限学习使用
JNZ ROTATE MOV AH,4CH INT 21H CODE ENDS END BEG
三、参照上述程序完成一个十六位二进制数到十进制数的转换操作程序设计。
四、加分题:完成从键盘输入一个任意十六位二进制数到十六进制数的转换操作程序设计。
提示:在数据区定义19个字节的字符串区,用INT 21H 的10#功能,进行字符串输入,判断实际输入的字节数是否为16个,每个字节的内容是否为30H或31H,不是,则提示重新输入或退出,是,则把该区域的16个ASCII码30H、31H的字符从低位到高位<或相反顺序)转换成1010110101110111的形式,用上述程序进行转换输出。 思考题:
1)若在源程序中把INT 21H的'H'省去,会产生什么现象? 2)把 INT 21H 4CH号功能改为 INT 20H,行不行?
3)从键盘输入的二进制ASCII字符串,在转换成十六进制数据时,有哪几大步骤?
【实验要求】
1.列出自编程序的程序清单,并加适当注释。
2.写出汇编,连接及调试程序时产生的错误,其原因及解决办法。 3.总结EXE文件和COM文件的编程格式。 4.回答思考题。
实验三 数组排序程序
【实验目的】
1.循环控制条件的设计。 2.存储器操作数的寻址方式。 3.对内存的数据处理方法。
【实验性质】
验证性实验<学时数:3H)
【实验内容】
1、在内存缓冲区存放10个无序整数,按照从小到大的顺序进行排序,用debug查看排序结果。 参考程序:
DATA SEGMENT
ST_AD DW 23,78,45,99,128,64,32,200,1,0 DATA ENDS PROGRAM SEGMENT MAIN PROC FAR ASSUME CS:PROGRAM,DS:DATA START: PUSH DS SUB AX,AX PUSH AX MOV AX,DATA MOV DS,AX MOV CX,10 DEC CX LOOP1: MOV DI,CX MOV BX,0 LOOP2: MOV AX,ST_AD[BX]
个人资料整理 仅限学习使用
CMP AX,ST_AD[BX+2] JGE COTINUE XCHG AX,ST_AD[BX+2] MOV ST_AD[BX],AX COTINUE:ADD BX,2 LOOP LOOP2 MOV CX,DI LOOP LOOP1 RET MAIN ENDP PROGRAM ENDS END START
2、加分题:从键盘输入10个无序10进制整数,对这10个数进行排序,将排序后的结果送屏幕显示。 3、加分题:从键盘输入一个10进制整数,插入前面已整序的10个数中,要求插入后的11个数也是整序好的,将插入后的结果送屏幕显示。 【报告要求】
1.给出该程序的流程图。
2.给出调试通过的自编程序清单和调试记录 3.写出实验体会。
实验四数据的输入与输出程序
【实验目的】
1.掌握键盘输入字符的方法和十六进制数字字符的ASCII码转换为二进制数的原理。 2.掌握子程序定义和调用的方法。
3.掌握循环移位指令的用法和无符号数比较大小的方法。
【实验性质】
验证性实验<学时数:2H)
【实验内容】
从键盘上输入4位十六进制数,将其转换为16位二进制数并在显示器上显示出来。要求输入的数字字符串以回车键结束。如果输入的数字超过4个,则以最后输入的4个为准。若按下的键不是十六进制数字字符,则显示出错信息。 参考程序:
【实验提示】
从键盘上输入的十六进制数字字符进入计算机后并不是相应的十六进制数或二进制数,而是与字符对应的ASCII码,现要找出ASCII码与该数字对应的二进制数之间的关系。关系如下:
十六进制数字字符 字符对应的ASCII码 数字对应的二进制数 0 ~ 9 30H ~ 39H ASCII码 - 30H A ~ F 41H ~ 46H ASCII码 - 37H a ~ f 61H ~ 66H ASCII码 - 57H 【报告要求】
1.给出该问题的程序设计流程图。
2.给出该程序的全部代码,并加上注释。 3.总结实验体会。
个人资料整理 仅限学习使用
实验五 子程序设计
【实验目的】
掌握一般子程序的调用和返回方法,掌握定义过程的伪指令的用法。
【实验性质】
设计性实验<学时数:3H)
【实验内容】
1、完成两个四位十进制数相加的程序设计,形式为:2345+7869=10214 <1)要求所有中断调用全部采用子程序的形式完成。 <2)要求考虑进位位。完善程序并调试通过。
<3)仿照下述程序,完成八位十进制数相加的程序设计。要求考虑进位位。完善程序并调试通过。
参考程序:
DISP MACRO VAR MOV AH,2 MOV DL,VAR INT 21H ENDM
DATA SEGMENT
STR1 DB 'PLEASE INPUT A NUMBER (EXP:2345>$'
STR2 DB 'PLEASE INPUT ANOTHER NUMBER(EXP:7868>$' STR3 DB 0DH,0AH,'$' BUF1 DB 10,?,11 DUP(?> BUF2 DB 10,?,11 DUP(?> BUF3 DB 4 DUP(?>,'$' DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA BEGIN: MOV AX,DATA MOV DS,AX
MOV DI,OFFSET STR1 CALL DISPL 。SHOW 'PLEASE INPUT NUMBER1:' MOV DI,OFFSET BUF1 CALL GETNUM 。GET NUMBER1 FROM KEYBOARD MOV DI,OFFSET STR3 CALL DISPL 。CRLF MOV DI,OFFSET STR2 CALL DISPL 。SHOW 'PLEASE INPUT NUMBER2:' MOV DI,OFFSET BUF2 CALL GETNUM 。GET NUMBER2 FROM KEYBOARD MOV DI,OFFSET STR3
个人资料整理 仅限学习使用
CALL DISPL 。CRLF XOR BX,BX MOV BL,BUF1+1
MOV BUF1+2[BX],'$' 。BEHIND NUMBER1 ADD '$' MOV DI,OFFSET BUF1+2 CALL DISPL 。SHOW NUMBER1 DISP '+' 。SHOW '+' XOR BX,BX MOV BL,BUF2+1
MOV BUF2+2[BX],'$' 。BEHIND NUMBER2 ADD '$' MOV DI,OFFSET BUF2+2 CALL DISPL 。SHOW NUMBER2 DISP '=' 。SHOW '=' LEA SI, BUF1+2 LEA DI, BUF2+2 CALL DAAD 。ADD NUMBERS MOV DI,OFFSET BUF3 CALL DISPL 。SHOW RESULT MOV AH,4CH 。RETURN DOS INT 21H
DAAD PROC NEAR 。SUBPROCESS OF ADD MOV BX,4 N1: MOV AL,[SI+BX-1] ADC AL,[DI+BX-1] AAA ADD AL,30H MOV BUF3[BX-1],AL DEC BX JNZ N1 RET
DAAD ENDP
DISPL PROC NEAR 。SUBPROCESS OF DISPLAY MOV AH,9 MOV DX,DI INT 21H RET
DISPL ENDP
GETNUM PROC NEAR 。SUBPROCESS OF GETNUM MOV AH,0AH MOV DX,DI INT 21H RET
GETNUM ENDP CODE ENDS END BEGIN
2、加分题:根据输入的运算符来实现+、-、*、/ 四则运算,并考虑进位。做除运算时,应考虑除数为0。
【实验要求】
1.设计一个子程序,完成将缓冲区中的两个四位十进制数据送屏幕显示功能。 2.设计一个子程序,完成从键盘输入两个四位十进制数的加法操作程序设计。 3.设计一个子程序,完成两个八位十进制数作的加法运算操作程序设计。
4.设计一个子程序,完成两个四位十进制数作四则运算操作。运算要求从键盘输入。
【报告要求】
1.给出该程序设计的方案步骤。 2.列出自编程序清单并加注释。
个人资料整理 仅限学习使用
3.写出心得体会。
实验六 宏调用程序设计
【实验目的】
1.熟悉宏定义的一般结构。
2.掌握宏指令的编写方法和调用方法。 3.能区别宏调用和子程序调用的不同之处。 4.了解LOCAL伪操作的用法。
5.熟悉无参数宏指令和有参数宏指令的定义与调用。
【实验性质】
验证性实验<学时数:2H)
【实验内容】
1.设计一个子功能,完成显示一串文字信息。
2.设计一个子功能,能实现多个字或字节10进制数据连加或连减的功能。要求多字节10进制数据从屏幕输入。加或减按实际输入的符号决定。
因篇幅问题不能全部显示,请点此查看更多更全内容