北邮微机原理软件实验报告
- 格式:doc
- 大小:539.48 KB
- 文档页数:7
信息与通信工程学院微机原理软件实验报告班级:姓名:学号:班内序号:时间:微机原理软件实验·报告实验一DEBUG 的使用一、实验目的1.掌握汇编程序的编辑,编译,连接和执行的全过程;2.学习和掌握用DEBUG 调试程序的方法。
二、实验内容1. 用编辑软件,输入以下汇编语言源程序:DAT SEGMENTA DB 20 ;(自定)B DB 15 ;(自定)Y DB 3 DUP (0)Z DB 0, 0DAT ENDSSTA SEGMENT STACKDW 50 DUP (?)STA ENDSCOD SEGMENTASSUME CS: COD, DS: DATSTAR PROC FARPUSH DSXOR AX, AXPUSH AXMOV AX, DATMOV DS, AXMOV AX, STAMOV SS, AXMOV AL, AMOV Z, ALMOV Z+1, ALCALL SUB1MOV AL,B微机原理软件实验·报告MOV Z,ALMOV Z+1,ALCALL SUB1MOV AL,AMOV Z,ALMOV AL,BMOV Z+1,ALCALL SUB1ADD WORD PTR Y,AXADC BYTE PTR[Y+2],0RETSTAR ENDPSUB1 PROCMOV AL, ZMOV AH, Z+1MUL AHADD WORD PTR Y, AXADC BYTE PTR[Y+2], 0RETSUB1 ENDPCOD ENDSEND STAR2. 通过编译,连接形成可执行文件。
3. 用DEBUG 将可执行文件调入,并进行调试。
1) 用D 命令观察数据区在内存中的具体内容,记录单元A 和B 的具体地址。
2) 用U 命令对目标代码反汇编,观察反汇编后的结果。
注意发现源程序的起始位置,并记录这个起始地址。
3) 用T 命令作单步跟踪调试。
比较每条指令执行后的结果和原来的理解是否一致,得出程序运行的结果:它们是写在什么单元,具体内容是什么;并判断结果是否正确。
北京邮电大学微机原理软件实验·第二次实验目录题目一: (2)一、实验目的 (2)二、实验内容 (2)三、设计思路 (2)四、源程序 (3)五、实验结果(反色) (4)题目二: (5)一、实验目的 (5)二、实验内容 (5)三、设计思路 (5)四、源程序 (7)五、程序运行结果(反色) (9)题目三: (10)一、实验目的 (10)二、实验内容 (10)三、设计思路 (10)四、源程序 (11)五、程序运行结果(反色) (14)实验总结: (14)题目一:一、实验目的1、开始独立进行汇编语言程序设计,熟悉debug使用;2、掌握基本分支(如cmp,jmp,jne等),循环程序设计(如loop);3、掌握最简单的DOS 功能调用,如int 21h。
二、实验内容编一程序,在显示器上显示256个ASCII代码,要求显示格式为每行显示16个字符,两个ASCII字符间空一格三、设计思路2、可能使用到的函数①传送指令格式:MOV DEST,SRC功能:把一个字节,字或双字从源操作数SRC传送至目的操作数DEST。
②加1减1指令格式:INC DESTDEC DEST功能:INC指令将目的操作数加1,结果送目的操作数。
DEC指令将目的操作数减1,结果送目的操作数。
目的操作数为通用寄存器或存储器操作数。
③无条件转移指令格式:JMP TARGET功能:使程序无条件地转移到指令规定的目的地址TARGET去执行指令。
转移分为短转移、段内转移(近程转移)和段间转移(远程转移)。
④条件转移指令该类指令是根据上一条指令对标志寄存器中标志位的影响来决定程序执行的流程,若满足指令规定的条件,则程序转移;否则程序顺序执行。
⑤输出单字符这是2号系统功能调用,其使用格式为:MOV DL,‘A’MOV AH,2INT 21H执行2号系统功能调用,将置入DL寄存器中的字符(以ASCII码形式表示)通过显示器显示出来(或从打印机输出)。
微机原理软件实验报告学院:信息与通信工程学院班级:班内序号:姓名:学号:实验二分支,循环程序设计一.实验目的:1.开始独立进行汇编语言程序设计;2.掌握基本分支,循环程序设计;3.掌握最简单的DOS 功能调用.二.实验内容:1.安排一个数据区(数据段),内存有若干个正数,负数和零.每类数的个数都不超过9.2.编写一个程序统计数据区中正数,负数和零的个数.3.将统计结果在屏幕上显示.三.预习题:1.十进制数0 -- 9 所对应的ASCII 码是什么? 如何将十进制数0 -- 9 在屏幕上显示出来?答:0—9对应的ASCII 码是30H—39H;在屏幕上显示0—9,需要将对应字符的ASCII 码赋给DL,并进行DOS的2号功能调用,0—9的ASCII 码正是其本身的数值加上30H。
2.如何检验一个数为正,为负或为零? 你能举出多少种不同的方法?答:①用CMP命令和0比较,如果ZF为1,则该数为零;再用该数和8000H相与,取出符号位判断,可区分正负;②用CMP命令和0比较,结果不小于0时用JGE命令进行跳转,否则为负数;用JGE 命令跳转后,如果为0再用JZ命令跳转,否则为正数。
四.选作题:统计出正奇数,正偶数,负奇数,负偶数以及零的个数.五.实验过程1.流程图2.源代码DATA SEGMENTNUM DW 0,0,1,2,3,4,5,101,-6,-7,-8,-8,-9 ;有2个0,6 个正数,5 个负数N DW ($-NUM)/2 ;该组数据的个数Z DB 0 ;0 的个数P DB 0 ;正数的个数PO DB 0 ;正奇数的个数PE DB 0;正偶数的个数M DB 0 ;负数的个数MO DB 0;负奇数的个数ME DB 0 ;负偶数的个数STR0 DB 'number of zeros : $' ;STR0-4为用于显示的字符串STR1 DB 0DH, 0AH, 'number of positive numbers : $'STR2 DB 0DH, 0AH, 'number of negative numbers : $'STR3 DB 0DH, 0AH, ' odd : $'STR4 DB ' even : $'DATA ENDSSTACK SEGMENT STACKDW 100 DUP(?)STACK ENDSCODE SEGMENTASSUME DS:DATA, SS:STACK, CS:CODESTART: MOV AX, DATAMOV DS, AXMOV AX, STACKMOV SS, AX ;初始化DS、SSLEA BX, NUM ;将NUM 中第一个数字的地址送入BXMOV CX, N ;将数据个数送入CXAGAIN: MOV AX, [BX] ;取出NUM 中的第一个数字CMP AX, 0 ;和0比较JGE PLU ;大于等于0时转PLUINC M ;负数的个数加1TEST AX, 1 ;检测该数据最低位是否为1,即是否为负奇数JNZ MINODD ;ZF为0时转MINODD,该数为负奇数INC ME ;负偶数个数加1JMP NEXTMINODD: INC MO ;负奇数个数加1JMP NEXTPLU: JZ ZER ;等于0时转ZERINC P ;正数个数加1TEST AX, 1 ;检测该数据最低位是否为1,即是否为正奇数JNZ PLUODD ;ZF为0时转PLUODD,该数为正奇数INC PE ;正偶数个数加1JMP NEXTPLUODD: INC PO ;正奇数个数加1JMP NEXTZER: INC Z ;零的个数加1NEXT: ADD BX,2 ;偏移地址加2,指向下一数字LOOP AGAIN ;CX自减,CX≠0时继续循环DISPLAY: ;在屏幕上显示统计结果MOV AH, 09H ;9号功能调用,显示字符串MOV DX, OFFSET STR0 ;将字符串的首地址的偏移地址送到DX,DS已;是其段基址INT 21HMOV AH, 02H ;2号功能调用,显示单个字符MOV DL, Z ;将零的个数送到DLADD DL, 30H ;0—9数字本身加上30H即为其ASCII 码INT 21HMOV AH, 09H ;正数部分统计结果显示,原理同上MOV DX, OFFSET STR1INT 21HMOV AH, 02HMOV DL, PADD DL, 30HINT 21HMOV AH, 09HMOV DX, OFFSET STR3INT 21HMOV AH, 02HMOV DL, POADD DL, 30HINT 21HMOV AH, 09HMOV DX, OFFSET STR4INT 21HMOV AH, 02HMOV DL, PEADD DL, 30HINT 21HMOV AH, 09H ;负数部分统计结果显示,原理同上MOV DX, OFFSET STR2INT 21HMOV AH, 02HMOV DL, MADD DL, 30HINT 21HMOV AH, 09HMOV DX, OFFSET STR3INT 21HMOV AH, 02HMOV DL, MOADD DL, 30HINT 21HMOV AH, 09HMOV DX, OFFSET STR4INT 21HMOV AH, 02HMOV DL, MEADD DL, 30HINT 21HMOV AX, 4C00H ;返回DOSINT 21HCODE ENDSEND START3.运行结果数据为:0,0,1,2,3,4,5,101,-6,-7,-8,-8,-9运行结果:zero表示零的个数,为2;positive number表示正数的个数,为6,其中奇数odd为4个,偶数even为2个;negative number表示负数的个数,为5,其中奇数odd为2个,偶数even 为3个。
信息与通信工程学院微机原理软件实验报告班级:2011211123姓名:学号:日期:2013.11.28实验二分支、循环程序设计一、实验目的1.开始独立进行汇编语言程序设计;2.掌握基本分支,循环程序设计;3.掌握最简单的DOS 功能调用。
二、实验内容1.安排一个数据区,内存有若干个正数,负数和零。
每类数的个数都不超过9。
2.编写一个程序统计数据区中正数,负数和零的个数。
3.将统计结果在屏幕上显示。
4.(扩展题)统计出正奇数、正偶数,负奇数、负偶数以及零的个数。
三、预习思考1.十进制数0 ~ 9 所对应的ASCII 码是什么?如何将十进制数0 ~ 9 在屏幕上显示出来?答:0~9分别对应ASCII码的30H~39H。
将十进制数0~9显示在屏幕上,要用二进制数0~9分别加上30H。
2.如何检验一个数为正,为负或为零?你能举出多少种不同的方法?答:和0相比是否相等,然后用该数和相与,取出符号位判断,可区分正负。
还可以直接用CMP命令和0比较,然后用JZ等命令进行判断。
四、实验过程1、流程图是2、源代码DATA SEGMENTARRAY DB 8,0,0,5,8,-1,-2,-3, 0,1,4,3LENG EQU $-ARRAY ; 数组长度POSI DB ? ; 正数个数NEGT DB ? ; 负数个数ZERO DB ? ; 零的个数POSIEVEN DB ? ;正偶数的个数POSIODD DB ? ; 正奇数的个数NEGTEVEN DB ? ; 负偶数的个数NEGTODD DB ? ; 负奇数的个数POSICHAR DB 'Pos: $'NEGTCHAR DB 'Neg: $'ZEROCHAR DB 'Zero: $'EVENCHAR DB ' ou: $'ODDCHAR DB ' ji: $'CR DB 0DH,0AH,'$' ; 回车换行DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART: MOV AX,DATAMOV DS,AXMOV SI,OFFSET ARRAY-1MOV CL,LENG ;数组长度MOV AL,0LOP: CMP CL,0 ; 循环控制条件JE CALCINC SIDEC CLMOV BL,[SI] ;基址加变址寻址CMP BL,AL ; 和零比较JG ISPOSI ; 是正数JE ISZERO ; 是零JL ISNEGT ; 是负数ISPOSI: INC POSI; 正数个数加一AND BX,1ADD POSIEVEN,BL ; 和1与之后的结果加到正偶数中JMP LOPISZERO: INC ZEROJMP LOPISNEGT: INC NEGT ; 负数个数加一AND BX,1ADD NEGTEVEN,BL ; 和1与之后结果加到负偶数中JMP LOPCALC: MOV AH,POSIMOV AL,POSIEVENSUB AH,AL ; 计算正奇数个数MOV POSIODD,AHMOV AH,NEGTMOV AL,NEGTEVENSUB AH,AL ; 计算负奇数个数MOV NEGTODD,AHPRINT: ;打印MOV AH,09HMOV DX,OFFSET POSICHARINT 21HMOV AH,02HMOV DL,POSIADD DL,30HINT 21HMOV AH,09HMOV DX,OFFSET EVENCHARINT 21HMOV AH,02HMOV DL,POSIEVENADD DL,30HINT 21HMOV AH,09HMOV DX,OFFSET ODDCHARINT 21HMOV AH,02HMOV DL,POSIODDADD DL,30HINT 21HMOV DX,OFFSET CRMOV AH,09HINT 21HMOV AH,09HMOV DX,OFFSET NEGTCHARINT 21HMOV AH,02HMOV DL,NEGTADD DL,30HINT 21HMOV AH,09HMOV DX,OFFSET EVENCHARINT 21HMOV AH,02HMOV DL,NEGTEVENADD DL,30HINT 21HMOV AH,09HMOV DX,OFFSET ODDCHARINT 21HMOV AH,02HMOV DL,NEGTODDADD DL,30HINT 21HMOV DX,OFFSET CRMOV AH,09HINT 21HMOV AH,09HMOV DX,OFFSET ZEROCHARINT 21HMOV AH,02HMOV DL,ZEROADD DL,30HINT 21HEXT: MOV AX,4C00HINT 21HCODE ENDSEND START五、实验分析实验结果如下:六.预习题1.十进制数0 -- 9 所对应的ASCII 码是什么? 如何将十进制数0 -- 9 在屏幕上显示出来?答:0-9的ascii码为,30h,31h,32h,34h,35h,36h,37h,38h,39h,将要显示的数加上30h,得到该数的ascii码,再利用DOS功能调用显示单个字符2.如何检验一个数为正,为负或为零? 你能举出多少种不同的方法?答:利用cmp指令,利用TEST指令,将该数与0相减,观察标志位。
微机原理与接口技术中断实验与编程报告姓名学院信息与通信工程学院专业班级学号班内序号目录一、实验目的 (2)二、实验任务及内容 (2)1设计思路 (2)2流程图 (3)3源代码 (4)4子程序清单 (9)三、实验结果 (10)四、实验总结 (12)一、实验目的编一程序,在显示器上显示时、分、秒。
借用计数器8253的Timer0作为中断源,通过8259A向CPU发中断,每10ms产生一次中断。
在中断服务程序中管理刷新时、分、秒。
要求:输入文件名,(如CLK)后,清屏后显示:Current time is xx:xx:xx(时分秒键盘输入)打回车,时、分、秒开始计时。
时钟不停的刷新。
当键入ctrl+c时,停止计时,返回系统,且系统正常运行不死机。
二、实验任务及内容1设计思路1)定义数据段和堆栈段。
数据段存放中断次数count100,输入的时间信息(8位字符),用于提示的字符串信息。
堆栈段存放256个空字符。
2)宏名check的定义。
判断输入的字符是否超出允许输入的范围,若超出范围,报错后返回程序开始处。
3)主程序。
初始化寄存器。
清屏。
(执行过程见注释部分)显示字符串str1。
用于说明输入格式(xx:xx:xx)和输入后开始计时的方式(按回车键开始)将输入的8个字符存入数据段。
使用DOS功能调用01H,通过DI,把存放在AL 中的键入字符存入以tenhour为开始的数据段,并使用宏指令check判断输入字符是否超过范围。
键入回车,开始计时。
使用DOS 功能调用01H ,把键入的键与回车键对应码0DH进行比较。
若键入其他键,报错,返回程序开始。
将原来08H 中断号设置的入口地址换成本程序中timer 的起始地址,保证在发生08H 中断时,程序自动进入timer 过程。
为时钟计时器置初值。
43H 端口是指8253三通道定时器中的命令寄存器,所使用的命令字36H 表示选用0通道定时器,以3号方式(产生方波)计数等。
北邮微原软件实验报告微原软件实验报告班级:2009211119 班学号:09210550班内序号:07姓名:胡易实验二分支,循环程序设计一.实验目的:1.开始独立进行汇编语言程序设计;2.掌握基本分支,循环程序设计;3.掌握最简单的DOS 功能调用.二.实验内容:1.安排一个数据区,内存有若干个正数,负数和零.每类数的个数都不超过9.2.编写一个程序统计数据区中正数,负数和零的个数.3.将统计结果在屏幕上显示.三.开BUFF偏移地址[BX]是否大于等于0 ah=ah +1[BX]是否DL=DL+1 (大否dh=dh+1 否BX值加判断完所否是显示结四.源程序data segmentbuff dw 22,11,33,0,55,-11,-32,-45,-56,123,-121count equ $-buffplus db ? ;大于0的个数zero db ? ;等于0的个数minus db ? ;小于0的个数string1 db 'zhengshu:','$'string2 db 'fushu:','$'string3 db '0:','$'data endsstack segment stack'stack'db 100 dup(?)stack endscode segmentassume cs:code,ds:data,ss:stackstart: mov ax,datamov ds,axmov cx,countshr cx,1mov dx,0mov ah,0mov bx,offset buffagain: cmp word ptr [bx],0jge plu ;判断是否大于等于0,是就跳转inc ah ;小于0的个数加1jmp nextplu: jz zer ;判断是否等于0.是就跳转inc dl ;大于0的个数加1jmp nextzer: inc dh ;等于0的个数加1next: inc bxinc bx ;修改指针地址loop againmov plus,dl ;将大于0,小于0,等入0个数存入mov zero,dhmov minus,ahcall show1 ;显示最终结果call show2call show3mov ax,4c00hint 21hshow1 proc near ;显示大于0的数push dxmov ah,09hmov dx,seg string1mov ds,dxmov dx,offset string1int 21hmov al,plusadd al,'0'-0hmov ah,02hmov dl,alint 21hmov dl,0ahint 21hpop dxretshow1 endpshow2 proc near ;显示小于0的数push dxmov ah,09hmov dx,seg string2mov ds,dxmov dx,offset string2int 21hmov al,minusadd al,'0'-0hmov ah,02hmov dl,alint 21hmov dl,0ahint 21hpop dxretshow2 endpshow3 proc near ;显示等于0的数push dxmov ah,09hmov dx,seg string3mov ds,dxmov dx,offset string3int 21hmov al,zeroadd al,'0'-0hmov ah,02hmov dl,alint 21hmov dl,0ahint 21hpop dxretshow3 endpcode endsend start五.程序运行结果六.预习题1.十进制数0 -- 9 所对应的ASCII 码是什么? 如何将十进制数0 -- 9 在屏幕上显示出来?0-9的ascii码为,30h,31h,32h,34h,35h,36h,37h,38h,39h,将要显示的数加上30h,得到该数的ascii码,再利用DOS功能调用显示单个字符2.如何检验一个数为正,为负或为零? 你能举出多少种不同的方法?利用cmp指令,利用TEST指令,将该数与0相减,观察标志位。
北京邮电大学实验报告题目:微机原理软件实验三班级: 2010211127专业:信息工程姓名:付莹学号:10210759实验五:中断实验1. 实验类设计型实验:编程实现时钟的显示。
2. 实验目的掌握计数器/定时器8253的工作原理和编程方法;掌握中断控制器8259的工作原理;掌握中断处理程序的编写。
3. 实验条件硬件条件:PC机一台。
软件条件:DOS操作系统;任意一种编辑程序,如EDIT;宏汇编程序MASM;连接程序LINK;调试程序DEBUG。
可借用该程序中的中断服务程序以及8253的初始化程序段(口地址为40H、41H、42H、43H,控制字为36H=00110110B,时间常数TC=11932:1.1932MHz/11932=100Hz,输出方波频率为100Hz,其周期为1000/100=10ms)。
4. 实验内容及步骤编一程序,在显示器上显示时、分、秒。
借用计数器8253的Timer0作为中断源,通过8259A向CPU发中断,每10ms产生一次中断。
在中断服务程序中管理刷新时、分、秒Current time is: xx:xx:xx (时分秒键盘输入)回车后时、分、秒开始计时,时钟不停的刷新。
当键入CTRL+C时,停止计时,返回系统,且系统正常运行不死机。
5. 实验报告(1)画出程序流程图。
开始等待回车键按下(08H 中断调用)取原8H 中断的中断矢量并压栈保护建立数据段的可寻址性 装载现在的中断服务程序8253初始化产生10ms 方波,10ms 中断一次重写IMR ,只开放时钟和键盘中断开中断监测键盘(06H 中断调用)是Ctrl+C ? 关中断 恢复IMR重置8253,,55ms 中断一次恢复原中断开中断返回DOS ,结束Yes有键按下?显示时间值(09H 中断调用)取消秒Yes 计数达到100次(1秒)?NoYesNoNo实现等待计时功能实现循环,秒值变化则返回继续执行程序显示“Current time is :” 读入键盘输入(2)提交调试好的汇编语言源程序(.asm)。
北邮微机原理实验报告一、实验目的本实验旨在通过对微机原理的实际操作,加深对计算机内部结构和工作原理的理解,并通过实验验证理论知识的正确性。
二、实验设备和材料•计算机硬件设备:PC机一台、示波器一台、数字信号发生器一台。
•软件工具:TASM、MASM汇编语言编译器。
三、实验内容本实验分为以下几个步骤:1. 准备工作•将PC机与示波器、数字信号发生器连接。
•打开PC机,进入实验环境。
2. 实验一:简单指令的执行•编写一个简单的汇编程序,实现两个数相加并将结果存储到指定寄存器中。
•使用TASM或MASM编译器对汇编程序进行编译,生成可执行文件。
•运行可执行文件,在示波器上观察到相加过程的波形。
3. 实验二:数据传输操作•编写一个汇编程序,实现数据在不同寄存器和内存之间的传输。
•编译并运行程序,通过观察PC机上的输出结果,验证数据传输的正确性。
4. 实验三:逻辑运算和移位操作•编写程序,实现逻辑运算和移位操作,并观察运算结果。
•通过数字信号发生器产生相应的输入信号,验证程序的正确性。
5. 实验四:中断处理•编写一个汇编程序,实现对中断请求的响应和处理。
•通过示波器观察中断请求和处理的波形,验证程序的正确性。
6. 实验五:串行通信操作•编写程序,实现串行通信的发送和接收操作。
•通过示波器观察串行通信的波形,验证程序的正确性。
四、实验结果和分析•对每个实验步骤进行记录,并详细分析实验结果。
•比较实验结果与理论预期是否一致,并给出原因分析。
五、实验心得通过本次实验,我深刻理解了微机原理的实际应用和操作过程。
通过实际操作,我对计算机内部结构和工作原理有了更深入的了解,并通过实验验证了理论知识的正确性。
同时,我也意识到在实际操作中的一些细节和注意事项,这对我今后的学习和工作都有很大的帮助。
六、实验总结通过本次实验,我不仅掌握了微机原理的实际应用技能,还深化了对计算机内部结构和工作原理的理解。
实验过程中,我遇到了一些问题,但通过思考和实践,逐步解决了这些问题,并取得了满意的实验结果。
本文部分内容来自网络整理,本司不为其真实性负责,如有异议或侵权请及时联系,本司将立即删除!== 本文为word格式,下载后可方便编辑和修改! ==北邮微机原理软件实验报告微机原理软件实验报告实验二分支,循环程序设计一、预习题:1.十进制数 0 -- 9 所对应的 ASCII 码是什么? 如何将十进制数 0 -- 9 在屏幕上显示出来?答:要屏显0-9的数码,可以调用02h中断,然后将要显示的数码的ASCII码存进DL里,然后执行INT 21H就可以打印字符。
当然,若不只一个数,调用09h中断(显示字符串)更好,但要将DS:DXZ指向要显示的数字在内存中的首地址,并要求以$结束。
2.如何检验一个数为正,为负或为零? 你能举出多少种不同的方法?答:CMP X,0 检验标志位CFCF=1,X为负数CF=0接着检验ZF:ZF=1,X为零,ZF=0,X为正数二、实验目的:1.开始独立进行汇编语言程序设计;2.掌握基本分支,循环程序设计;3.掌握最简单的 DOS 功能调用.三、实验内容:1.安排一个数据区,内存有若干个正数,负数和零.每类数的个数都不超过 9.2.编写一个程序统计数据区中正数,负数和零的个数.四、实验源代码assume cs:code,ds:datadata segmentbuff db 1,2,3,4,5,-1,-2,-3,0,0 ;安排的数据区string db '>0:'plus db 0db 0ah,0dhstring1 db '=0:'zero db 0db 0ah,0dhstring2 db '<0:'minus db 0db '$'data endscode segmentstart:movax,datamovds,axmov cx,10mov dx,0 mov ah,0 ;初始化,并将CX赋为10,因为共有10个数 ;用变量plus来存储正数的个数 ;用变量zero来存储零的个数 ;用变量minus来存储负数的个数 ;将计数器dx,ah初始化为0lea bx,buffcompare:cmp byte ptr [bx],0jgeplu inc ah jmp next ;取出一个数与0进行比较 ;大于等于0,跳至plu 执行 ;小于0,用ah暂存小于0的个数,ah+1 ;比完后进行下一个数的比较plu: je zer;等于0,跳至zer执行 inc dl jmp next zer: inc dh ;大于0,用dl暂存大于0的个数,dl+1 ;比完后进行下一个数的比较 ;等于0,用dh暂存等于0的个数,dh+1 ;将dl,dh,ah分别赋值给变量plus,zero,minus,其ASCII分别加next:incbx loop compare48add dl,48 movplus,dl add dh,48 movzero,dh add ah,48 movminus,ah mov ah,09h lea dx,string int 21h ;调用09h中断,将最终结果输出mov ax,4c00hint 21hcode ends否 end start实验截图六、实验总结及心得体会:这个实验有两个要点。
微机原理软件实验报告学院:信息与通信工程学院班级:2012211123班内序号:学生姓名:学号:实验二分支,循环程序设计一、实验目的1.开始独立进行汇编语言程序设计;2.掌握基本分支,循环程序设计;3.掌握最简单的DOS 功能调用.二、实验任务及内容1.安排一个数据区,内存有若干个正数,负数和零。
每类数的个数都不超过9。
2.编写一个程序统计数据区中正数,负数和零的个数。
3.将统计结果在屏幕上显示。
4.(扩展题)统计出正奇数、正偶数,负奇数、负偶数以及零的个数。
三、画出程序流程图Y四、给出源程序(要求加注释)data segmentbuff dw 1, 2, 0, 0 ,-1 ;数据段,初始化数据count equ $-buffplus db ? ;定义三种数的存储位置zero db ?minus db ?string1 db 'plus number:','$'string2 db 'zero number:','$'string3 db 'minus number:','$'data endsstack segment stack 'stack'db 100 dup(?)stack endscode segmentassume cs:code,ds:data,es:data,ss:stackbegin:mov ax,datamov ds,axmov cx,countshr cx,1mov dx,0mov ah,0lea bx,buffagain: cmp word ptr[bx],0 ;首先和0比较jge pluinc ah ;小于零MINUS+1jmp nextplu: jz zer ;判断是否等于零,等于零ZERO+1 inc dl ;不等于零PLUS+1jmp nextzer: inc dhnext: inc bx ;下一个数inc bxloop againadd dl,48mov plus,dladd dh,48mov zero,dhadd ah,48mov minus,ahshow:sub dx,dx ;显示模块mov dx,offset string1mov ax,0900h ;送显示指令int 21hmov dl,[plus]mov ax,0200hint 21hmov dl,0dhint 21hmov dl,0ahint 21hmov dx,offset string2mov ax,0900hint 21hmov dl,[zero]mov ax,0200hint 21hmov dl,0dhint 21hmov dl,0ahint 21hmov dx,offset string3mov ax,0900hint 21hmov ax,0200hmov dl,[minus]int 21hmov ax,4c00h ;结束程序int 21hcode endsend begin五、给出程序运行结果(运行结果抓屏保存)data segment 中存入1,2, 0, 0,-1显示有2个0、2个大于0的数、1个小于0的数,结果正确六、预习题1.十进制数0 -- 9 所对应的ASCII 码是什么? 如何将十进制数0 -9 在屏幕上显示出来? 答:对应的ASCII码是30H~39H,把0-9加上30H即可得到对应的ASCII,送给DL,再执行INT 21H即可显示。
实验一
1.实验要求:编一程序,将地址偏移量为100H单元开始的256个单元分别写
入00H,01H,……,FFH数据;
统计写入的数据块的0元素、正元素、负元素的个数,并分别将统计结果送入上述数据块后的三个单元中;
用DOS功能调用显示上面数据快各单元(包括统计结果)内容,要求每行显示16个数据,两个数据之间用空格隔开。
程序设计思路:分配256个单元存放数据00H,01H,……,FFH,3个单元存放统计结果。
约定:DH存放0的个数,BH存放负数的个数,BL存放正数的个数,然后进行将256个数据一一与0进行比较,得到 DH、BH、BL。
将DH、BH、BL 存入SI的最后三个单元。
最后在以高、低4位,依次将每个单元的数据输出。
2. 程序流程:
4.子程序:
DISP PROC NEAR ;Show number MOV DL,AL MOV AH,2 INT 21H RET DISP ENDP
开始
初始化;
SI 前256个单元存放00 H……FFH;
CX=256;DH=0;BX=0;
CMP AL ,0;
MOV AL ,[SI] CX=0?
将DH ,BX 存入SI ;INC SI ;CX=259;
YES
INC DH ;
INC BH
INC BL
显示高4位
显示低4位; 添加空格; INC SI ;
BH=0??
BH=16;
CX=0?
SF=ELS
ZF=1
N O
N
O YE S
N O
终止
YE
实验二
1.实验要求:编一程序,把键入的十六进制数转换成十进制,要求:
(1)在屏幕上显示转换的十进制数,键入的最大值为FFFFH;
(2)若键入非16进制的数,则提示错误;
(3)程序中至少用一个子程序和宏命令。
2.程序设计思路:首先判断键入的字符是否为合法的十六进制字符,若是十六
进制,将其转化成二进制数值,放入BX中,然后接收下一个字符,并将上一个字符左移4位,再讲此时的BX与接收到的BX相加,直到键入回车,停止接收。
然后通过除以10000,依次将余数除以1000、100、10、1,将二进制转化为十进制,再显示出来。
若键入的非法字符,则显示错误。
3.程序流程
3. 子程序:
BINDEC PROC NEAR ; Transform Binary into Hex
MOV CX,10000 ;Because the range of input is 0~65535 , so
;let's use 10000 for highest bit
CALL DECDIV MOV CX,1000 CALL DECDIV MOV CX,100 CALL DECDIV MOV CX,10 CALL DECDIV MOV CX,1 CALL DECDIV RET BINDEC ENDP
DECDIV PROC NEAR ;This is a division ,remainder is stored
开始
等待键入字符,AL 存放键入的字符
判断字符类型?
BX 存放该字符;BX 左移4位
CMP AL ,0DH
显示错误信
息
ELS
0~9、A~F 、 A~f
ZF=
将二进制转化为十进
制
;in dx ,quotient is stored in ax
MOV AX,BX
MOV DX,0
DIV CX
MOV BX,DX ;bx stores every new dx for next
;time's division
ADD AL,30H ;add al 30H ,in order to get its ascii
MOV DL,AL ;Show the result in Dec
MOV AH,2
INT 21H
RET
DECDIV ENDP
实验三
1.实验要求:编一程序,在显示器上显示256个ASCII代码,要求显示格式为
每行显示16个字符,两个ASCII字符间空一个。
2.程序设计思路:首先向内存中写入00H,01H……FFH共256个字节的数据块,
然后使用循环语句将存储的数值一ASCII的形式打印出来,同时另置一个计数器,用于控制每行的字符数为16。
(实验三的结果图)
3. 程序流程:
4. 子程序:
DISP PROC NEAR ;Show the word
MOV DL,AL MOV AH,02H INT 21H RET
开始
初始化
DATA 初始化地址:DX 内循环次数:BH=16 外循环次数CX=256
BH=0?
显示SI 当前存储的ASCII ; SI+1;BX-1;CX-1;
NO
YES
CX=0?
NO 终止
YES
BH=16; 换行;
DISP ENDP。