北邮微原软件实验报告
北邮微原软件时钟报告

微机原理软件实验报告班级:201321112#专业:信息工程姓名:学号:2013210###你们就猜吧!该代码修复了不按回车就跑动和时间跳变问题,最重要的是流程图也改了。
业界良心啊!!一、实验内容编一程序,在显示器上显示时、分、秒。
借用计数器8253的Timer0作为中断源,通过8259A向CPU发中断,每10ms产生一次中断。
在中断服务程序中管理刷新时、分、秒。
要求:1、输入文件名(如:CLK)后清屏后显示:2、Current time is: xx:xx:xx(时分秒键盘输入)3、打回车,时、分、秒开始计时。
时钟不停的刷新。
4、当键入CTRL+C时,停止计时,返回系统,且系统正常运行不死机。
8253的初始化程序段可借用。
口地址为40H、41H、42H、43H,控制字为36H=00110110B,时间常数TC=11932:1.1932MHz/11932=100Hz,输出方波频率为100Hz,其周期为1000/100=10ms。
二、设计思路程序流程图是中断子程序流程图子程序开始记下进入中断的次数判断次数是否为100是计数清零,修改内存中存储的时间查看是否有进位进位调整结束否1、计数器芯片8253简介①初始化使用8253前,要进行初始化编程。
初始化编程的步骤是:1.向控制寄存器端口写入控制字对使用的计数器规定其使用方式等。
2.向使用的计数器端口写入计数初值。
②8253控制字D7D6=00:使用0号计数器,D7D6=01:使用1号计数器D7D6=10:使用2号计数器,D7D6=11:无效D5D4=00:锁存当前计数值D5D4=01:只写低8位(高8位为0),读出时只读低8位D5D4=10:只写高8位(低8位为0),读出时只读高8位D5D4=11:先读/写低8位,后读/写高8位计数值D3D2D1=000:选择方式0,D3D2D1=001:选择方式1D3D2D1=X10:选择方式2,D3D2D1=X11:选择方式3D3D2D1=100:选择方式4,D3D2D1=101:选择方式5D0=0:计数初值为二进制,D0=1:计数初值为BCD码数三、运行效果图开始画面输入时间开始跑动T秒表功能正常退出四、程序源码data segmentcount100 db 100 ;100个10ms=1s,此处count100起计数作用msg1 db 'Current time is:$'msg2 db 'Sorry,your date entered incorrectly ,please try again!$'msg3 db'Now, the time is:',0ah,'(Press Ctrl+C to EXIT.)',0ah,'(Press T to use as a Stopwatch.)$' msg4 db 0ah,'Program EXIT normally.$'tenhour db '0' ;小时十位数hour d b '0',':' ;小时个位数tenmin db '0' ;分钟十位数minute db '0',':' ;分钟个位数tensec db '0' ;秒十位数second db '0' ;秒个位数data endsstack segment stack 'stack'db 256 dup(0)stack endscode s egmentassume cs:code,ds:data,es:datastart: movax,seg datamoves,axmovds,axmovdx,offset msg1 ;打印提示信息1mov ah,09hint 21hsettime:movsi,offsettenhour ;设定时间mov ah,01h ;键盘输入int 21hcmp al,0dhjz forever1cmp al,'0'jc error2 ;如果输入不合法,报错cmp al,'3'jnc error2 ;如果输入不合法,报错mov [si],alincsicmp al,'2'jzershimov ah,01h ;如果小时高位为1,低位可以设置0~9 int 21hcmp al,0dhjz forever1cmp al,'0'jc error2cmp al,'9'+1jnc error2mov [si],alincsijmp fenershi: mov ah,01h ;如果小时高位为2,低位可以设置0~4 int 21hcmp al,0dhjz forever1cmp al,'0'jc error2cmp al,'4'jnc error2mov [si],alincsijmp fenfen: mov ah,01hint 21hcmp al,0dhjz forever1cmp al,':'jnz error1mov [si],alincsimov ah,01h ;分的高位可设置0~5int 21hcmp al,0dhjz forever1cmp al,'0'jc error1cmp al,'6'jnc error1mov [si],alincsimov ah,01h ;分的低位0~9int 21hcmp al,0dhjz forever1cmp al,'0'jc error1cmp al,'9'+1jnc error1mov [si],alincsijmpmiaosettime2:jmp settime ;跳转接力,段内转移的距离限制error2: jmp error1forever1:jmp next2miao: mov ah,01h ; “:”的检测int 21hcmp al,0dhjz forever1cmp al,':'jnz error1mov [si],alincsimov ah,01h ;秒的高位可设置0~5int 21hcmp al,0dhjz forever1cmp al,'0'jc error1cmp al,'6'jnc error1mov [si],alincsimov ah,01h ;秒的低位可设置0~9int 21hcmp al,0dhjz forever1cmp al,'0'jc error1cmp al,'9'+1jnc error1mov [si],almov ah,01hint 21hcmp al,0dhjz next2error1: mov dl,0ah ;用来报错:设置时间不合法mov ah,02hint 21hmovdx,offset msg2 ;打印提示信息2mov ah,09hint 21hmov dl,0ahint 21hjmpsettimesettime3: jmp settime2 ;同上next2: MOV AX,0003H ;做时钟显示初始化INT 10H ;清屏显示mov dl,0ahmov ah,02hint 21hmovdx,offset msg3 ;打印提示信息3mov ah,09hint 21hmov dl,0ahmov ah,02hint 21hcli ;使中断标志IF=0mov al,8 ;保存源中断向量mov ah,35hint 21hpush espush bxmov ax,0moves,ax ; es置零,准备中断向量的写入mov di,20hmovax,offset Timer0 ;中断子程序timer的偏移量stosw ;字符串填充,将AX的内容存入di所指向的单元默认段基址总是ES movax,csstosw ;timer基址填充;------------------8253设置-------------------------mov al,36hout 43h,al ;设置8253控制字为36Hmov bx,11932 ;分频系数为11932,分频结果1.1932MHz/11932=100Hz,10ms变化一次moval,bl ;分两次设置分频系数out 40h,almoval,bhout 40h,al;------------------8253设置-------------------------mov al,0fch ;主PIC端口设置为0fchsti ;开中断,允许外部中断forever:movbx,offsettenhour ;这个程序段循环执行mov cx,8dispclk:mov dl,[bx] ;用来显示当前时间call dispcharincbxloop dispclk ;调用显示子程序,显示初始状态时间mov dl,0dh ;输出一个换行call dispcharxoral,al ;读键盘缓冲区mov ah,0bhint 21hcmp al,0FFHjnz next3mov ah,08h ;取其字符int 21hcmp al,03h ;Ctrl+C退出jz stopcmp al,54hjnz next3 ;无输入情况下,循环修改时间mov dl,0ah ;“T”则使用秒表功能mov ah,02hint 21hjmp forevernext3: moval,secondnext: cmpal,second ;判断second是否发生变化je next ;如果没有,循环比较jmp forever ;如果有变化,刷新输出stop: movdx,offset msg4 ;打印提示信息4mov ah,09hint 21hmov dl,0ahmov ah,02hint 21hpop dx ;恢复中断向量pop dsmov al,8mov ah,25hmov ah,4chint 21hTimer0 proc far ;中断程序timerpush axdec count100 ;计数100次jnztimerx ;如果计数小于100,跳出中断mov count100,100 ;否则重置count100<=100;1s已经到达inc second ;加一秒cmp second,'9' ;判断大小,用于进位,以下原理相同jletimerxmov second,'0'inctenseccmp tensec,'6'jltimerxmov tensec,'0'inc minutecmp minute,'9'jletimerxmov minute,'0'inctenmincmp tenmin,'6'jltimerxmov tenmin,'0'inc hourcmp hour,'9'ja adjhourcmp hour,'4'jnztimerxcmp tenhour,'2'jnztimerxmov hour,'0'mov tenhour,'0'jmp short timerx ;段内短转移adjhour:inctenhourmov hour,'0'timerx: mov al,20hout 20h,al ;主PIC口地址pop ax ;出栈恢复iret ;中断返回Timer0 endpdispcharproc near ;显示子函数push bxmov bx,0mov ah,02hint 21h ;DOS功能调用,输出DL内容pop bxretdispcharendpcode e ndsend star五、子程序清单子程序名:dispchar功能:显示dl中的字符所用寄存器:dl,bx,ah入口参数:dl存放的内容出口参数:无中断服务程序名:Timer0功能:刷新时间所用寄存器:ax入口参数:预订中断出口参数:时间参数。
北京邮电大学微机原理软件实验报告

北京邮电大学微机原理软件实验报告信息与通信工程学院微机原理软件实验报告班级:姓名:学号:班内序号:时间:微机原理软件实验·报告实验一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 命令作单步跟踪调试。
比较每条指令执行后的结果和原来的理解是否一致,得出程序运行的结果:它们是写在什么单元,具体内容是什么;并判断结果是否正确。
推荐-北邮—微原软件实验报告 精品

微机原理软件实验报告学院:信息与通信工程学院班级:班内序号:姓名:学号:实验二分支,循环程序设计一.实验目的: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个。
北京邮电大学微机原理软件

微机原理软件实验报告班级:姓名:学号:班内序号:指导老师:实验二分支、循环程序设计一、实验目的1.开始独立进行汇编语言程序设计;2.掌握基本分支,循环程序设计;3.掌握最简单的 DOS 功能调用.二、实验内容1.安排一个数据区,内存有若干个正数,负数和零.每类数的个数都不超过 9.2.编写一个程序统计数据区中正数,负数和零的个数.3.将统计结果在屏幕上显示.4.(选作)统计出正奇数,正偶数,负奇数,负偶数以及零的个数.三、实验设计四、源代码DATA SEGMENTARRAY DB -1,-2,-3,-4,-5,-6,0,1,2,3,5,4,5,6,0COUNT EQU $-ARRAYPOSI DB 0 ;正数NEGA DB 0 ;负数ZERO DB 0 ;零ODDPOS DB 0 ;正奇数EVENPOS DB 0 ;正偶数ODDNEG DB 0 ;负奇数EVENNEG DB 0 ;负偶数STRING1 DB '正数个数:','$' ;把最后的统计结果显示在屏幕上STRING2 DB '负数个数:','$' ;下同STRING3 DB '零的个数:','$'STRING4 DB '正奇数个数:','$'STRING5 DB '正偶数个数:','$'STRING6 DB '负奇数个数:','$'STRING7 DB '负偶数个数:','$'DATA ENDSSTACK SEGMENT STACK 'STACK'DB 100 DUP(?)STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSTART: MOV AX,DATAMOV DS,AXMOV CX,COUNTLEA BX,ARRAY ;把数据段的偏移地址给BXLOOP1: CMP BYTE PTR [BX],0JGE POSINC NEGA ;统计负数TEST BYTE PTR [BX],01H ;利用奇数的二进制表示式最后一位必为1的特JZ ENEG ;点来判断奇偶INC ODDNEG ;统计负奇数JMP NEXTENEG: INC EVENNEG ;统计负偶数JMP NEXTPOS: JZ ZERINC POSI ;统计正数TEST BYTE PTR [BX],01HJZ EPOSINC ODDPOS ;统计正奇数JMP NEXTEPOS: INC EVENPOS ;统计正偶数JMP NEXTZER: INC ZERO ;统计零NEXT: INC BXLOOP LOOP1MOV AH,09H ;显示正数MOV DX,SEG STRING1MOV DS,DXLEA DX,STRING1INT 21HMOV AH,02HMOV DL,POSIADD DL,30HINT 21HMOV DL,0AH ;显示空格INT 21H ;显示回车MOV DL,0DHINT 21HMOV AH,09H ;显示负数MOV DX,SEG STRING2MOV DS,DXLEA DX,STRING2INT 21HMOV AH,02HMOV DL,NEGAADD DL,30HINT 21HMOV DL,0AHINT 21HMOV DL,0DHINT 21HMOV AH,09H ;显示零MOV DX,SEG STRING3MOV DS,DXLEA DX,STRING3INT 21HMOV AH,02HMOV DL,ZEROADD DL,30HINT 21HMOV DL,0AHINT 21HMOV DL,0DHINT 21HMOV DL,0AHINT 21HMOV DL,0DHINT 21HMOV AH,09H ;显示正奇数MOV DX,SEG STRING4MOV DS,DXLEA DX,STRING4INT 21HMOV AH,02HMOV DL,ODDPOSADD DL,30HINT 21HMOV DL,0AHINT 21HMOV DL,0DHINT 21HMOV AH,09H ;显示正偶数MOV DX,SEG STRING5MOV DS,DXLEA DX,STRING5INT 21HMOV AH,02HMOV DL,EVENPOSADD DL,30HINT 21HMOV DL,0AHINT 21HMOV DL,0DHINT 21HMOV AH,09H ;显示负奇数MOV DX,SEG STRING6MOV DS,DXLEA DX,STRING6INT 21HMOV AH,02HMOV DL,ODDNEGADD DL,30HINT 21HMOV DL,0AHINT 21HMOV DL,0DHINT 21HMOV AH,09H ;显示负偶数MOV DX,SEG STRING7MOV DS,DXLEA DX,STRING7INT 21HMOV AH,02HMOV DL,EVENNEGADD DL,30HINT 21HMOV DL,0AHINT 21HMOV DL,0DHINT 21HMOV AX,4C00HINT 21HCODE ENDSEND START五、程序运行结果六、预习题1.十进制数 0 -- 9 所对应的 ASCII 码是什么? 如何将十进制数 0 -- 9 在屏幕上显示出来?答:十进制数0—9对应的ASCII码是30H—31H。
北邮微机原理软件实验报告

实验一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;YESINC DH ;INC BHINC BL显示高4位显示低4位; 添加空格; INC SI ;BH=0??BH=16;CX=0?SF=ELSZF=1N ONO YE SN O终止YE实验二1.实验要求:编一程序,把键入的十六进制数转换成十进制,要求:(1)在屏幕上显示转换的十进制数,键入的最大值为FFFFH;(2)若键入非16进制的数,则提示错误;(3)程序中至少用一个子程序和宏命令。
2.程序设计思路:首先判断键入的字符是否为合法的十六进制字符,若是十六进制,将其转化成二进制数值,放入BX中,然后接收下一个字符,并将上一个字符左移4位,再讲此时的BX与接收到的BX相加,直到键入回车,停止接收。
然后通过除以10000,依次将余数除以1000、100、10、1,将二进制转化为十进制,再显示出来。
2021年北邮微机原理实验报告

微机原理软件试验汇报学院: 信息与通信工程学院班级: 211123班内序号:学生姓名:学号:试验二分支,循环程序设计一、试验目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即可显示。
北邮微机原理 第二次软件实验报告

微机原理与接口技术中断实验与编程报告姓名学院信息与通信工程学院专业班级学号班内序号目录一、实验目的 (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号方式(产生方波)计数等。
北邮软件实验报告

北邮软件实验报告北邮软件实验报告一、引言软件实验是计算机科学与技术专业的重要课程之一,旨在培养学生的软件开发能力和解决问题的能力。
本次实验是北邮软件实验的一部分,通过实践操作和理论学习,掌握软件开发的基本原理和技巧。
本报告将对实验过程进行整理和总结,以便更好地理解和应用所学知识。
二、实验背景本次实验的主题是软件开发,通过一个具体的项目,学生需要完成一个小型软件的设计、开发和测试。
这个项目涉及到数据库管理、用户界面设计和算法实现等多个方面的知识和技能。
通过实践操作,学生可以更好地理解软件开发的流程和方法,提高自己的编程能力和问题解决能力。
三、实验目标本次实验的目标是培养学生的软件开发能力和解决问题的能力。
通过实践操作,学生需要掌握以下技能:1. 熟悉软件开发的基本流程,包括需求分析、设计、编码、测试和维护等阶段;2. 掌握数据库管理的基本原理和技巧,能够设计和操作数据库;3. 理解用户界面设计的基本原则和方法,能够设计和实现用户友好的界面;4. 学会使用编程语言和工具进行软件开发,能够编写高质量的代码;5. 培养团队合作和沟通能力,能够与他人协作完成一个项目。
四、实验过程本次实验的实践操作包括以下几个步骤:1. 需求分析:根据实验要求和项目需求,分析用户需求,明确软件功能和性能要求;2. 设计:根据需求分析结果,设计软件的系统架构、数据库结构和用户界面;3. 编码:使用编程语言和工具,根据设计文档编写代码,实现软件功能;4. 测试:对编写的代码进行测试,确保软件功能正常运行,修复bug;5. 维护:根据用户反馈和需求变化,对软件进行维护和更新。
在实验过程中,我们遇到了一些问题和挑战。
例如,需求分析阶段需要与用户进行沟通和交流,确保理解用户需求的准确性;编码阶段需要仔细编写代码,避免出现错误和漏洞;测试阶段需要充分测试软件的各种功能,确保软件的质量和稳定性。
通过克服这些问题和挑战,我们逐渐掌握了软件开发的技巧和方法。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2013年微机原理软件实验报告学院:信息与通信工程学院班级:2011211104姓名:实验二分支,循环程序设计一.实验目的:1.开始独立进行汇编语言程序设计;2.掌握基本分支,循环程序设计;3.掌握最简单的DOS 功能调用二.实验内容:1.安排一个数据区,内存有若干个正数,负数和零.每类数的个数都不超过9.2.编写一个程序统计数据区中正数,负数和零的个数.3.将统计结果在屏幕上显示.三.预习题1.十进制数0 -- 9 所对应的ASCII 码是什么? 如何将十进制数0 -- 9 在屏幕上显示出来?0-9的ACSII码为,30h,31h,32h,34h,35h,36h,37h,38h,39h, 将要显示的数加上30h,得到该数的ACSII码,再利用DOS功能调用显示单个字符2.如何检验一个数为正,为负或为零? 你能举出多少种不同的方法?利用cmp指令,利用TEST指令,将该数与0相与,将该数与0相减,观察标志位。
四.程序流程图五.源程序DATA SEGMENT ;数据段NUM DB 1,2,-2,3,-3,5,2,4,-6,-11,100,0,0,34,-55,-33,0 ;待处理数据COUNT EQU $-NUM ;数据个数MINUS DB 0 ;小于零的个数ZERO DB 0 ;等于零的个数PLUS DB 0 ;大于零的个数RESULT DB'NEGNUM=',?,0AH,0DH,'ZERONUM=',?,0AH,0DH,'POSNUM=',?,0AH,0DH,'$' ;结果显示字符串DATA ENDSSTACK SEGMENT STACK 'STACK' ;堆栈段DW 50 DUP(?)STACK ENDSCODE SEGMENT ;代码段ASSUME CS:CODE,DS:DATA,SS:STACKSTART: MOV AX,DATAMOV DS,AXMOV CX,COUNTMOV SI,OFFSET NUMAGAIN: MOV AL,[SI] ;循环比较CMP AL,0JGE NEXT1INC MINUSJMP DONENEXT1: JZ NEXT2INC PLUSJMP DONENEXT2: INC ZERODONE: INC SILOOP AGAIN ;返回结果MOV DI,OFFSET RESULTMOV AL,MINUSADD AL,30HMOV BYTE PTR[DI+7],ALMOV AL,ZEROADD AL,30HMOV BYTE PTR[DI+18],ALMOV AL,PLUSADD AL,30HMOV BYTE PTR[DI+28],ALMOV AH,09HMOV DX,DIINT 21HMOV AX,4C00HINT 21HCODE ENDSEND START五.程序运行结果正确输出了正数,负数,零的个数七.实验心得与体会这次实验练习了用跳转语句实现分支结构,使我更加熟悉了跳转语句在分支结构中的应用,练习了用DOS功能调用输出字符串。
将课堂的理论应用于实践,体会到了汇编语言编程的特点和魅力。
实验三代码转换程序设计一.实验目的:1.掌握几种最基本的代码转换方法;2.运用子程序进行程序设计.二.实验内容:1.从键盘上输入若干两位十进制数,寻找其中的最小值,然后在屏幕上显示出来.2.两个十进制数之间的分隔符,输入结束标志自定,但要在报告中说明.3.对输入要有检错措施,以防止非法字符输入,并有适当的提示.4.将整个程序分解为若干模块,分别用子程序实现.在报告中要给出模块层次图.三.预习题1如何将输入的两个字符(0 -- 9)变为十进制或二进制数?将输入的字符减去30H,可得到对应十进制数,将第一个数乘10,加上第二个数,即为最后结果2如何将选出的最小值(二进制或十进制)变为ASCII 码再进行显示?说明:输入的字符以空格间隔,以回车结束,且仅允许输入两位十进制数,输入其他字符,或者输入多位,都会报错将输入的字符串先转化成数串,选出其中的最小值,转化为对应十位和个位,分别加上30H,输出显示3你觉得采用二进制运算还是十进制运算更适合于这个实验?十进制四.程序流程图五.模块层次图六.源程序DATA SEGMENT;数据段BUFFER DB 100 ;存放带输入的数据DB 0DB 100 DUP(0)NUM DB 100 DUP(0) ;存放将输入的数据转化为对应的数MIN DB 100 ;存放最小数RESULT DB 0AH,0DH,'MINNUM=',?,?,0AH,0DH,'$';显示结果ERRMSG DB 0AH,0DH,'INPUT ERROR',0AH,0DH,'$';显示错误信息DATA ENDSSTACK SEGMENT STACK 'STACK';堆栈段DW 50 DUP(?)STACK ENDSCODE SEGMENT ;代码段ASSUME CS:CODE,DS:DATA,SS:STACK;将两位十进制字符转化为对应数的子程序;入口参数:AX,AH存放十位的ACSII码,AL存放个位的ACSII ;出口参数:AL,存放转化后的数值TRANSFER PROC NEARPUSHFPUSH CXSUB AH,30HSUB AL,30HSHL AH,1MOV CH,AHSHL AH,CLADD AH,CHADD AL,AHMOV AH,0POP CXPOPFRETTRANSFER ENDP;找最小数的子程序;入口参数:DI,指向带比较数的最后一个数的下一位;出口参数:MIN,得到最小数FINDMIN PROC NEARPUSHFPUSH AXLOOP1: DEC DIMOV AL,NUM[DI]CMP AL,MINJAE NEXTMOV MIN,ALNEXT: CMP DI,0JZ DONEJMP LOOP1DONE: POP AXPOPFRETFINDMIN ENDP;显示最小数的子程序SHOWMIN PROC NEARPUSHFPUSH AXPUSH BXMOV AL,MINMOV AH,0MOV BL,10DIV BLADD AH,30HMOV RESULT[10],AHADD AL,30HMOV RESULT[9],ALMOV AH,09HMOV DX,OFFSET RESULTPOP BXPOP AXPOPFRETSHOWMIN ENDPSTART: MOV AX,DATA ;程序开始MOV DS,AXMOV DX,OFFSET BUFFERMOV AH,0AHINT 21HMOV AX,0MOV BX,0MOV DI,0MOV SI,1MOV CL,BYTE PTR BUFFER[SI]MOV CH,0INC CXINC SIAGAIN: CMP BYTE PTR BUFFER[SI],20H ;处理输入的字符串JZ NEXT1CMP BYTE PTR BUFFER[SI],0DHJZ NEXT1CMP BYTE PTR BUFFER[SI],30HJB ERRSHOWCMP BYTE PTR BUFFER[SI],39HJA ERRSHOWINC BLCMP BL,2JZ SECMOV AH,BYTE PTR BUFFER[SI]JMP NEXT2SEC: MOV AL,BYTE PTR BUFFER[SI]JMP NEXT2NEXT1: CMP BL,0JZ NEXT2CMP BL,2JNZ ERRSHOWMOV BL,0CALL TRANSFER ;将字符转化为数,并存入NUMMOV NUM[DI],ALINC DINEXT2: INC SILOOP AGAINCALL FINDMINCALL SHOWMINJMP EXITERRSHOW:MOV DX,OFFSET ERRMSGMOV AH,09HINT 21HEXIT: MOV AX,4C00HINT 21HCODE ENDSEND START七.程序运行结果八.实验心得与体会这次实验相较实验二增加了很大的难度,在ASCII码和数值之间的转化部分,花了我不少的时间来编写,也花了不少时间调试,最后能成功,觉得很有成就感,也觉得自己编程更加熟练了,也了解了几个汇编错误码的含义。
练习了子程序的使用,0AH号DOS功能调用等。
体会到了汇编语言粒度很难小的特点,所以实现起来比较麻烦,但也不失乐趣。
实验四子程序设计一.实验目的:1.进一步掌握子程序设计方法;2.进一步掌握基本的DOS 功能调用.二.实验内容:1.从键盘上输入某班学生的某科目成绩.输入按学生的学号由小到大的顺序输入.2.统计检查每个学生的名次.3.将统计结果在屏幕上显示.4.为便于观察,输入学生数目不宜太多,以不超过一屏为宜.输出应便于阅读.尽可能考虑美观.5.输入要有检错手段.三.预习题1.如何确定一个学生在这门科目中的名次?对学生的成绩进行排序,并记录对应的学号,最后得到由低到高的成绩序列及对应的学号,即得到学生的排名2.你觉得输入结束后,采用什么方法进行比较以得到学生的名次最为简单?我认为应该采用选择排序,每次选出最高的分数,并记录学号,输出学号和分数。
而后,将该同学的分数置0,再重复以上操作,直到输出所有学生的学号和成绩五.模块层次:六.源程序DATA SEGMENT ;数据段BUFFER DB 200 ;存放输入的成绩DB 0DB 200 DUP(0)NUM DB 200 DUP(0) ;存放输入字符转化后的成绩数值MAX DB 0 ;存放排序每次最高的成绩MAXNUM DW -1 ;存放每次最高成绩的学生的学号RESULT DB 0AH,0DH,' R N G',0AH,0DH, ;显示结果DB 200 DUP(10 DUP(0),0AH,0DH)ERRMSG DB 0AH,0DH,'INPUT ERROR',0AH,0DH,'$';错误信息DATA ENDSSTACK SEGMENT STACK 'STACK' ;堆栈段DW 50 DUP(?)STACK ENDSCODE SEGMENT ;代码段ASSUME CS:CODE,DS:DATA,SS:STACK;将字符转化为对应数值的子程序;入口参数:BH,AX,分别存放百,十,个位;出口参数:AL,转化后的分数值TRANSFER PROC NEARPUSHFPUSH CXSUB BH,30HCMP BH,0JNZ GOODSUB AH,30HSUB AL,30HSHL AH,1MOV CH,AHMOV CL,2SHL AH,CLADD AH,CHADD AL,AHJMP EXIT1GOOD: MOV AL,100EXIT1: MOV AH,0POP CXPOPFRETTRANSFER ENDP;选择排序子程序;入口参数:DI,指向带排序数组的最后一个数的下一位;出口参数:显示成绩单SORT PROC NEARPUSHFPUSH AXPUSH BXPUSH CXPUSH DXMOV DX,0MOV SI,13MOV CX,DIMOV BX,DILOOP2: MOV DI,BXLOOP1: DEC DIMOV AL,BYTE PTR NUM[DI]CMP AL,MAXJBE NEXTMOV MAX,ALMOV MAXNUM,DIINC MAXNUMNEXT: CMP DI,0JZ DONEJMP LOOP1DONE: MOV DI,MAXNUMMOV BYTE PTR NUM[DI-1],0INC DXCALL SHOWNUMMOV MAX,0MOV MAXNUM,-1LOOP LOOP2EXIT2: POP DXPOP CXPOP BXPOP AXPOPFRETSORT ENDP;将数值转化为对应的ASCII码,存入RESULT待显示TRANSNUM PROC NEARPUSHFPUSH BXMOV BL,10DIV BLADD AL,30HMOV BYTE PTR RESULT[SI],' 'INC SIMOV RESULT[SI],ALINC SIADD AH,30HMOV RESULT[SI],AHINC SIPOP BXPOPFRETTRANSNUM ENDP;显示排名,学号,成绩;入口参数:DX,DI,MAX,分别表示排名、成绩和学号;出口参数:RESULT,显示结果SHOWNUM PROC NEARPUSHFPUSH AXMOV AX,DXCALL TRANSNUMMOV AX,DICALL TRANSNUMCMP MAX,100JZ GREATMOV BYTE PTR RESULT[SI],' 'INC SIMOV AL,MAXMOV AH,0CALL TRANSNUMJMP EXIT3GREAT: MOV BYTE PTR RESULT[SI],31HINC SIMOV BYTE PTR RESULT[SI],30HINC SIMOV BYTE PTR RESULT[SI],30HINC SIEXIT3: ADD SI,2POP AXPOPFRETSHOWNUM ENDP;将结果RESULT显示出来SHOWRESULT PROC NEARPUSHFPUSH AXPUSH DXMOV BYTE PTR RESULT[SI],0AHINC SIMOV BYTE PTR RESULT[SI],0DHINC SIMOV BYTE PTR RESULT[SI],'$'MOV DX,OFFSET RESULTMOV AH,09HINT 21HPOP DXPOP AXPOPFRETSHOWRESULT ENDPSTART: MOV AX,DATAMOV DS,AXMOV DX,OFFSET BUFFERMOV AH,0AHINT 21HMOV AX,3030HMOV BX,3000HMOV DI,0MOV SI,1MOV CL,BYTE PTR BUFFER[SI]MOV CH,0INC CXINC SIAGAIN: CMP BYTE PTR BUFFER[SI],20HJZ NEXT1CMP BYTE PTR BUFFER[SI],0DHJZ NEXT1CMP BYTE PTR BUFFER[SI],30HJB ERRSHOWCMP BYTE PTR BUFFER[SI],39HJA ERRSHOWINC BLCMP BL,3JZ THIRDCMP BL,2JZ SECMOV AL,BYTE PTR BUFFER[SI]JMP NEXT2THIRD: MOV BH,AHMOV AH,ALMOV AL,BYTE PTR BUFFER[SI]JMP NEXT2SEC: MOV AH,ALMOV AL,BYTE PTR BUFFER[SI]JMP NEXT2NEXT1: CMP BL,0JZ NEXT2CMP BL,3JA ERRSHOWCALL TRANSFERMOV NUM[DI],ALMOV BX,3000HMOV AX,3030HINC DINEXT2: INC SILOOP AGAINCALL SORTCALL SHOWRESULTJMP EXITERRSHOW:MOV DX,OFFSET ERRMSGMOV AH,09HINT 21HEXIT: MOV AX,4C00HINT 21HCODE ENDSEND START七.程序运行结果八.实验心得与体会这次实验和实验三比较类似,但又比实验三难了不少,主要是因为增加了排序的部分,在对成绩排序的同时还要保存相应的学号,增加了代码的复杂度。