北邮微原软件实验报告

合集下载

北邮微原软件时钟报告

北邮微原软件时钟报告

微机原理软件实验报告班级: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年北邮微机原理实验报告

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. 维护:根据用户反馈和需求变化,对软件进行维护和更新。

在实验过程中,我们遇到了一些问题和挑战。

例如,需求分析阶段需要与用户进行沟通和交流,确保理解用户需求的准确性;编码阶段需要仔细编写代码,避免出现错误和漏洞;测试阶段需要充分测试软件的各种功能,确保软件的质量和稳定性。

通过克服这些问题和挑战,我们逐渐掌握了软件开发的技巧和方法。

北邮通信原理软软件实验报告

北邮通信原理软软件实验报告

实验八:一、实验目的假设基带信号为m(t)=sin(2000*pi*t)+2cos(1000*pi*t),载波频率为20kHz,请仿真出AM,DSB-SC、SSB信号,观察已调信号的波形和频谱。

二、实验模型基带信号m(t)可以分成两个信号的叠加,分别记为m1(t),m2(t)。

借助公式s DSB-SC=m(t)cos(2*pi*fc*t),S AM=(1+m(t))cos(2*pi*fc*t),s SSB=m(t)cos(2*pi*fc*t)+H[m(t)]sin(2*pi*fc*t)分别仿真出m1(t)和m2(t)的信号波形,然后叠加便可以得到m(t)的波形和频谱三、仿真设计设计程序时先确定采样点、采样频率,然后分别表示出m1(t)和m2(t)的表达式,然后表示出后面仿真SSB信号所需要的两个信号的希尔伯特变换表达式。

其中表示希尔伯特变换时,采用的方法是先表示出频域的形式MH1和MH2,然后再傅里叶反变换得出对应的mh1和mh2。

对应代码如下:m1=sin(2*pi*fm1*t);M1=t2f(m1,fs);MH1=-j*sign(f).*M1;mh1=real(f2t(MH1,fs));m2(t)信号做相同的处理。

处理完信号后,就利用上述的三个公式,表示出AM、DSB-SC和SSB信号s1、s2和s3和其对应傅里叶变换得到其频谱S1 、S2、S3。

为了方便实验结果的观察与对比,将这三组图处理在一张图内,利用的函数是subplot。

四、实验结果五、分析讨论由实验结果可见,AM与DSB-SC相比,频谱多了一个离散的大载波直流分量,而且DSB-SC信号波形会有相位翻转的现象出现;而DSB-SC和SSB相比,SSB信号的频谱是DSB-SC的一个边带,本实验中采用的上边带滤波。

可见实验结果与理论结果是相一致的。

六、思考题1.如何仿真VSB系统?答:将残留边带滤波器用M文件实现,然后当做函数使用,在程序中调用。

北邮微原软件实验报告

北邮微原软件实验报告

北邮微原软件实验报告微原软件实验报告班级: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相减,观察标志位。

北邮 微机原理实验报告

北邮 微机原理实验报告

北邮微机原理实验报告一、实验目的本实验旨在通过对微机原理的实际操作,加深对计算机内部结构和工作原理的理解,并通过实验验证理论知识的正确性。

二、实验设备和材料•计算机硬件设备:PC机一台、示波器一台、数字信号发生器一台。

•软件工具:TASM、MASM汇编语言编译器。

三、实验内容本实验分为以下几个步骤:1. 准备工作•将PC机与示波器、数字信号发生器连接。

•打开PC机,进入实验环境。

2. 实验一:简单指令的执行•编写一个简单的汇编程序,实现两个数相加并将结果存储到指定寄存器中。

•使用TASM或MASM编译器对汇编程序进行编译,生成可执行文件。

•运行可执行文件,在示波器上观察到相加过程的波形。

3. 实验二:数据传输操作•编写一个汇编程序,实现数据在不同寄存器和内存之间的传输。

•编译并运行程序,通过观察PC机上的输出结果,验证数据传输的正确性。

4. 实验三:逻辑运算和移位操作•编写程序,实现逻辑运算和移位操作,并观察运算结果。

•通过数字信号发生器产生相应的输入信号,验证程序的正确性。

5. 实验四:中断处理•编写一个汇编程序,实现对中断请求的响应和处理。

•通过示波器观察中断请求和处理的波形,验证程序的正确性。

6. 实验五:串行通信操作•编写程序,实现串行通信的发送和接收操作。

•通过示波器观察串行通信的波形,验证程序的正确性。

四、实验结果和分析•对每个实验步骤进行记录,并详细分析实验结果。

•比较实验结果与理论预期是否一致,并给出原因分析。

五、实验心得通过本次实验,我深刻理解了微机原理的实际应用和操作过程。

通过实际操作,我对计算机内部结构和工作原理有了更深入的了解,并通过实验验证了理论知识的正确性。

同时,我也意识到在实际操作中的一些细节和注意事项,这对我今后的学习和工作都有很大的帮助。

六、实验总结通过本次实验,我不仅掌握了微机原理的实际应用技能,还深化了对计算机内部结构和工作原理的理解。

实验过程中,我遇到了一些问题,但通过思考和实践,逐步解决了这些问题,并取得了满意的实验结果。

【最新推荐】北邮微机原理软件实验报告-范文word版 (14页)

【最新推荐】北邮微机原理软件实验报告-范文word版 (14页)

本文部分内容来自网络整理,本司不为其真实性负责,如有异议或侵权请及时联系,本司将立即删除!== 本文为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实验截图六、实验总结及心得体会:这个实验有两个要点。

北邮微原硬件实验

北邮微原硬件实验

信息与通信工程学院微原硬件实验报告姓名:班级:学号:班内序号:【一.基本的I/O实验】实验一 I/O地址译码一、实验目的掌握I/O地址译码电路的工作原理。

二、实验原理和内容1、实验电路如图1-1所示,其中74LS74为D触发器,可直接使用实验台上数字电路实验区的D触发器,74LS138为地址译码器。

译码输出端Y0~Y7在实验台上“I/O地址“输出端引出,每个输出端包含8个地址,Y0:280H~287H,Y1:288H~28FH,……当CPU执行I/O指令且地址在280H~2BFH范围内,译码器选中,必有一根译码线输出负脉冲。

例如:执行下面两条指令MOV DX,2A0HOUT DX,AL(或IN AL,DX)Y4输出一个负脉冲,执行下面两条指令MOV DX,2A8HOUT DX,AL(或IN AL,DX)Y5输出一个负脉冲。

图1-1利用这个负脉冲控制L7闪烁发光(亮、灭、亮、灭、……),时间间隔通过软件延时实现。

2、接线: Y4/IO地址接 CLK/D触发器Y5/IO地址接 CD/D触发器D/D触发器接 SD/D角发器接 +5VQ/D触发器接 L7(LED灯)或逻辑笔三、硬件接线图及软件程序流程图1.硬件接线图2.软件程序流程图四、源程序DATA SEGMENTDATA ENDSSTACK SEGMENT STACK 'STACK'DB 100H DUP(?)STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACK ;基本框架;延时子程序DELAY1 PROC NEARMOV BX,500HPUSH CXLOOP2: MOV CX,0FFFHWAIT1: LOOP WAIT1DEC BXJNZ LOOP2POP CXRETDELAY1 ENDPSTART: MOV CX,0FFFFH ;L7闪烁控制LOOP1: MOV DX,2A0H ;灯亮OUT DX,ALCALL DELAY1MOV DX,2A8H ;灯灭OUT DX,ALCALL DELAY1LOOP LOOP1 ;循环闪烁CODE ENDSEND START五、实验结果灯L7闪烁实验二简单并行接口一、实验目的掌握简单并行接口的工作原理及使用方法。

北邮 微机原理实验报告

北邮 微机原理实验报告

北邮微机原理实验报告北邮微机原理实验报告引言:微机原理是计算机科学与技术专业的一门重要课程,通过学习和实践,我们可以深入了解计算机的组成结构和工作原理。

本次实验旨在通过对北邮微机原理实验的探索,加深对计算机硬件和软件的理解,并提升我们的实践能力。

一、实验目的本次实验的目的是熟悉计算机的硬件组成和工作原理,并通过实践操作加深对微机原理的理解。

具体包括以下几个方面:1. 熟悉计算机的硬件组成,包括中央处理器(CPU)、内存、硬盘等;2. 掌握计算机的启动过程和操作系统的加载;3. 理解计算机的指令集和指令执行过程;4. 学习计算机的输入输出设备和外部接口。

二、实验过程1. 实验一:计算机硬件的组装与连接在本实验中,我们需要将计算机的各个硬件组件进行正确的连接和组装。

首先,我们需要将主板与CPU、内存、显卡等硬件设备进行连接。

其次,我们需要将硬盘、光驱等存储设备与主板进行连接。

最后,我们需要将键盘、鼠标、显示器等外部设备与计算机进行连接。

通过这一步骤,我们可以了解计算机硬件的组成结构,并掌握正确的连接方式。

2. 实验二:计算机的启动过程和操作系统的加载在本实验中,我们需要了解计算机的启动过程和操作系统的加载过程。

首先,我们需要按下电源按钮,启动计算机。

然后,计算机会进行自检和硬件初始化,并加载操作系统。

在这个过程中,我们可以观察到计算机的启动画面和加载过程。

通过这一步骤,我们可以深入了解计算机的启动过程和操作系统的加载机制。

3. 实验三:计算机的指令集和指令执行过程在本实验中,我们需要学习计算机的指令集和指令执行过程。

首先,我们需要了解不同类型的指令,包括算术指令、逻辑指令、数据传输指令等。

然后,我们需要通过编写简单的汇编语言程序,来实现对数据的处理和操作。

在这个过程中,我们可以观察到指令的执行过程和结果。

通过这一步骤,我们可以深入理解计算机的指令集和指令执行过程。

4. 实验四:计算机的输入输出设备和外部接口在本实验中,我们需要学习计算机的输入输出设备和外部接口。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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七.程序运行结果八.实验心得与体会这次实验和实验三比较类似,但又比实验三难了不少,主要是因为增加了排序的部分,在对成绩排序的同时还要保存相应的学号,增加了代码的复杂度。

相关文档
最新文档