北邮微机原理软件实验报告.docx

上传人:scccc 文档编号:13835800 上传时间:2022-01-24 格式:DOCX 页数:29 大小:223.38KB
返回 下载 相关 举报
北邮微机原理软件实验报告.docx_第1页
第1页 / 共29页
北邮微机原理软件实验报告.docx_第2页
第2页 / 共29页
北邮微机原理软件实验报告.docx_第3页
第3页 / 共29页
北邮微机原理软件实验报告.docx_第4页
第4页 / 共29页
北邮微机原理软件实验报告.docx_第5页
第5页 / 共29页
点击查看更多>>
资源描述

《北邮微机原理软件实验报告.docx》由会员分享,可在线阅读,更多相关《北邮微机原理软件实验报告.docx(29页珍藏版)》请在三一文库上搜索。

1、微机原理软件实验报告实验二分支、循环程序设计一.实验目的1 .开始独立进行汇编语言程序设计。2 .掌握基本分支,循环程序设计。3 .掌握最简单的DOS功能调用。二.实验容1 .安排一个数据区,存有若干个正数,负数和零。每类数的个数都不超过 92 .编写一个程序统计数据区中正数,负数和零的个数。3 .将统计结果在屏幕上显示。三.流程图显示数据四.源代码DATA SEGMENTDW 0DW 0DW 0数据中(0的个数数据中大于0的个数数据中小f 0电数一 结束NUM DW 9,8,0,-7,6,-5,-4,3,2,-1,0,-8,49,0,0,1设定的一组数据,其中4个0,7个正数,6个负数,符合

2、题目要求N DW ($-NUM)/2该组数据的个数TYPE0 DBTYPE1 DBTYPE2 DBLOCATE DW0DH, 0AH, Number of zeros : $0DH, 0AH, Number of greater than 0 : $0DH, 0AH, Number of less than 0 : $TYPE0, TYPE1, TYPE2DATA ENDSSTACK SEGMENT STACKDW 128 DUPSTACK ENDSCODE SEGMENTASSUME DS:DATA, START: MOV AX, DATASS:STACK, CS:CODEMOVMOVMOV

3、DS, AXAX, STACKSS, AXMOVBX, OFFSET NUMMOVCX, N初始化DS SS指向STA将NUMfr第一个数字白地址送入 BX将N中数字个数送入CX判断结果为是0,跳转到IFZ处继续执行LOOP1: MOV AX, BXCMP AX, 0JZ IFZ取出NUM中的第一个数字 与零相比SAL AX, 1JC IFLINC WORD PTR AJMP CONTINUE判断结果是小于 0,跳转到IFL;否则,A自加,然后继续执行程序IFL:INC WORD PTR B;B计数加1JMP CONTINUEIFZ:INC Z;Z计数加1CONTINUE:ADD BX, 2L

4、OOP LOOP1MOV CX, 3XOR BX, BXDISP:MOV DX, LOCATEBXMOV AH, 09HINT 21H;DOS 09指针+2,继续送入下一数字循环CX次判断共显示3个字符串号功能调用,显示字符串MOV DX, ZBXADD DX, 0 MOV AH, 02H INT 21H转换为ASCII码;DOS 02号功能调用,显示字符ADD BX, 2LOOP DISP指针+2 (DWMOV AX, 4C00HINT 21H返回DOS系统CODE ENDSEND START五.运行结果六.预习题1 .十进制数0 - 9 所对应的ASCII码是什么?如何将十进制数0 - 9

5、 在屏 幕上显示出来?答:09 的 ASCII 码值依次为:30H,31H,32H,33H,34H,35H,36H,37H,38H,39H 。 用待显示数加30H即可得到对应ASCII码,将待显示数的ASCII码值赋给DX,使 用“INT 21H 02号DO财能调用显示字符。2 .如何检验一个数为正,为负或为零?你能举出多少种不同的方法?答:方法1:用test指令检查该数最高位。若为0,则为正数。否则,检测其余位判断为负数或00方法2:用cmp指令将该数与0相比,判断标志寄存器。SFOF=0为正数或0。 否则为负数。实验三代码转换程序设计一.实验目的1 .掌握几种最基本的代码转换方法。2 .运

6、用子程序进行程序设计。二.实验容1 .从键盘上输入若干两位十进制数,寻找其中的最小值,然后在屏幕上显示出来2 .两个十进制数之间的分隔符,输入结束标志自定,但要在报告中说明。3 .对输入要有检错措施,以防止非法字符输入,并有适当的提示。4 .将整个程序分解为若干模块,分别用子程序实现.在报告中要给出模块层次图, 三.模块层次图及流程图START输入数据 排序,显示存储并显示 %,检错十进制转换排序显示开始输方%据;呼对二一向1B,BX,AL# 始化AL tMASCIIBXWiffe此数|N与b比较,.十BX=BX+1赋值比较结束输出最/JY致结束四.源代码DATA SEGMENTA DB 10

7、0 DUP (0)B DB 100,0,$STRING DB 0DH,0AH,ERROR INPUT ,0DH,0AH, $STRING1 DB 0DH,0AH,the min number is ,0DH,0AH, $ DATA ENDS STACK SEGMENT STACKDW 50 DUP(?) STACK ENDS CODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKINPUT PROC PUSH AX PUSH BX PUSH CX PUSH DXSTAR: MOV CX,0进制数子程序保护寄存器容保护寄存器容保护寄存器容保护寄存器容开始,表示输入

8、的数是否可以构成两位十输入比较是否合法MOV则向下运行BX,AL存储,判断是否一个字,不是继续输入,否INC BXINC CXAND CX,1JNZ AGAIN ;CX 数MOV CX,0MOV AH,01H INT 21HMOV BX,AL若为0,输入了两个数,可以构成一个两位十进制判断下一输入字符 输入INC BXCMP AL,20H ;判断是否空格:是,继续输入;否,判断是否为回车JZ AGAINCMP AL,0DHJNZ SHOWJMPOKEYSHOW: MOV AH,09H判断是否为回车都不是,就输入错误,重新输入是回车,就输入结束。否则结束子程序调用 不合法显示错误重新输入MOV

9、DX,OFFSET STRINGINT 21HJMP STAROKEY: MOV BX,ALPOP DXPOP CXPOP BXPOP AXRET INPUT ENDP输入结束CHANGE PROCPUSH AXPUSH BXPUSH DXMOV BX,OFFSET AONCE: MOV AL,BXSUB AL,30HINC BX读数转化为16进制数MOV BX,OFFSET AAGAIN: MOV AH,01HINT 21HCMP AL,30H JB SHOW CMP AL,39H JA SHOWMOV DL,10 MUL DL MOV DH,BX SUB DH,30H INC BX ADD

10、 AL,DH CMP AL,B JB YES转化为16进制数结果比较哪个最小CMP BYTE PTR BX,0DH ; JZ LAST判断是否是回车JMP ONCEYES: MOV B,AL最小数存于BCMP BYTE PTR BX,0DHJZ LAST INC BX JMP ONCELAST: NOPMOV AL,B ;将数的个位和十位分别存储 AH存个位AL存十位MOV AH,0MOV DL,10DIV DLADD AH,30H ;ADD AL,30HMOV B,AL ;MOV B+1,AHPOP DX;popPOP BXPOP AXRETCHANGE ENDPSTART PROC FAR

11、MOV AX,DATAMOV DS,AXCALL INPUT;MOV AH,09HMOV DX,OFFSET STRING1转换为ASCII码存到存中出原保存的寄存器数据主程序调用输入子程序;显示提示性语句INT 21H调用比较子程序CALL CHANGEMOV AH,09HMOV DX,OFFSET B;显示最小数INT 21HMOV AX,4C00HINT 21HSTART ENDPCODE ENDSEND START五.运行结果9 CAJAd&bjg c.exeSoiree listing fHUL.LSI:Cross-reference MIL.CRF1:A98M ftlA93SJ b

12、yte号 symbol space free0 Warning Frrnrs0 Severe FrroirsD;masH51 ink c.objMicrosoft (R (Jwerlay Linker g广宝ion 3.64JCopyright (C Mierosoft Corp 1983 1987. fill rights reserved.Run Fih EC.tXhJ :List rile ENUL.MAP1:LibrarieE -LIB:C:nasMSdhug c.nxo-g3A 67 37 股 11 B7the rin number is04Program ternioritrd n

13、ornri 1六.预习题1 .如何将输入的两个字符(0 - 9)变为十进制或二进制数?答:将数的ASCII码值减去30H,即可得到对应的十进制数。2 .如何将选出的最小值(二进制或十进制)变为ASCII码再进行显示?答:用DB定义一个字节型数据存放十进制数 (高四位表示十位,低四位表示个 位)。使用cmp指令,先比较高四位,若小于,则和已存的数交换;若等于,则 继续比较低四位,小于则交换。若等于,数不变。3 .你觉得采用二进制运算还是十进制运算更适合于这个实验?答:十进制更合适。实验四子程序设计一.实验目的1 .进一步掌握子程序设计方法。2 .进一步掌握基本的DOS功能调用。二.实验容1 .从

14、键盘上输入某班学生的某科目成绩.输入按学生的学号由小到大的顺序输入2 .统计检查每个学生的名次。3 .将统计结果在屏幕上显示。4 .为便于观察,输入学生数目不宜太多,以不超过一屏为宜.输出应便于阅读.尽 可能考虑美观。5 .输入要有检错手段。流程图四.源代码DATA SEGMENT BUFFER DB 100 DB ?DB 10 DUP (?) STR1 DB pleaseinput the score of the students:,0DH,0AH,$STR2 DB error,please input the score again:,0DH,0AH,$STR3 DB num rank

15、scor ,0DH,0AH,$;提示语句的字符串VAR1 DW?VAR2 DW?CK DB ?TAB DB 100 DUPDATA ENDSSTACK SEGMENT STACK stack DB 100 DUP (s)STACK ENDSCODE SEGMENT PARA codeASSUME CS:CODE,DS:DATA,SS:STACKSTART PROC FAR PUSH DSXOR AX,AX PUSH AX MOV AX,DATA MOV DS,AX LEA DX,STR1 MOV AH,09H ;INT 21H INPUT: LEA DX,BUFFERMOV AH,0AH ;

16、符串并存储INT 21H LEA DI,TAB XOR CX,CX MOV AH,30H MOV DH,31H LEA BX,BUFFER+2 CALL CHECK ; CMP CK,1 JZ INPUT CALL COM ; MOV DL,0DH MOV AH,02H ;INT 21H MOV DL,0AH MOV AH,02H INT 21H LEA DX,STR3 ;初始化DS调用DOS 09号功能显示字符串STR1调用DOS 0A号功能,从键盘输入字调用检错子程序调用排序子程序调用DOS 02号功能,显示DL字符调用DOS09号功能,显示字符串STR3MOV AH,09HINT 21H

17、CALL DISPY;调用送显程序RETSTART ENDPCHECK PROC;检验子程序NEXT1: MOV CK,0MOV DI,AHINC DIMOV DI,DHINC DICMP DH,39HJZ L1INC DHJMP L2L1: MOV DH,30H INC AH调用DOS 09号功能,显示字符串L2: MOV AL,BX CMP AL,30H JB ERROR CMP AL,39H JA ERROR MOV DI,AL INC DI INC BX MOV AL,BX CMP AL,30H JB ERROR CMP AL,39H JA ERROR MOV DI,AL INC DI

18、 INC BX INC CX MOV AL,BX CMP AL,0DH JZ FINISH1 INC BX JMP NEXT1 ERROR: LEA DX,STR2 ; STR2 MOV AH,9 INT 21HMOV CK,1FINISH1:RET调用排序子程序CHECK ENDP COM PROCCOMP1: PUSH CX MOV VAR1,CX SHL CX,1 SHL CX,1 SUB CX,4 MOV VAR2,CX POP CX DEC DI DEC DI JMP COTICOMP2: ADD DI,VAR2 COTI: MOV BL,0MOV CX,VAR1 DEC CX AG

19、AN: MOV AL,DICMP AL,DI-4 JA GOON1 JB GOON3 INC DI MOV AL,DI CMP AL,DI-4 PUSHF DEC DI POPF JA GOON1 JBE GOON3 GOON1: MOV BL,-1PUSH CX MOV CX,4 DEC DI DEC DI GOON2: MOV AL,DIXCHG AL,DI-4 MOV DI,AL INC DI LOOP GOON2 POP CX DEC DI DEC DI GOON3: DEC DIDEC DIDEC DI DEC DI LOOP AGAN CMP BL,0 JNZ COMP2 DEC

20、DI DEC DI MOV CX,VAR1 MOVBH,30HMOV BL,31H RET COM ENDP DISPY PROC DISPY1: MOV DL,BH MOV AH,02H ;INT 21H MOV DL,BL MOV AH,02H INT 21H MOV DL,; 格)MOV AH,02H INT 21H INT 21H INT 21H MOV DL,DI MOV AH,02H ;INT 21H INC DI MOV DL,DI MOV AH,02H INT 21H INC DI MOV DL, MOV AH,02H ;INT 21H INT 21H INT 21H MOV

21、DL,DI MOV AH,02H INT 21H INC DI MOV DL,DI MOV AH,02H ;送显子程序调用DOS02号功能,显示DL字符(学号)调用DOS 02号功能,显示DL字符(空调用DOS02号功能,调用DOS02号功能,调用DOS02号功能,显示DL字符(排名)显示DL字符(空格)显示DL字符(成绩)INT 21H INC DI MOV DL,0DH MOV AH,02H INT 21H MOV DL,0AH MOV AH,02H INT 21H CMPBL,39HJZ L3 INC BL JMP NEXT2 L3: MOV BL,30H INC BHNEXT2: LO

22、OP DISPY1;循环显示RETDISPY ENDPCODE ENDS END START 五.运行结果S 匚3JA TidnmsystuF32 kmiIexu = debug d.exirMicrosoft Windows ? 6.1,76011J 2m Mlicrosoft Corpordtion?C:Usersophidcd.C: UsersccL ,C: ?cd NfisnSD:ndSiJdE;biiy d.Qx。-(j,please input the score of the students; tirroritiuut the score dgwiii:/8 83 65 方 9

23、 9i 2h ?4 nthrankscor0105舛呢02S3的0178四077i防0365f16%59070626Pe0日g tfirnindtrri norri 1 y六.预习题1 .如何确定一个学生在这门科目中的名次 ?答:将学生成绩按照学号依次存放在一个数据区, 设BX为指针指向首地址,使 用数据结构中的排序算法进行比较(比如冒泡排序法)。2 .你觉得输入结束后,采用什么方法进行比较以得到学生的名次最为简单 ?答:使用排序算法,通过指针排序好成绩后,其对应的学号也相应排好。3 .准备好模块层次图.Num rank, scor分别表示学生的学号,排名和分数。实验五子程序设计1 . 实验目

24、的1 .初步掌握中断程序的设计方法。2 .初步掌握修改DOS系统中断,以适应实际使用的方法。2 .实验容1 .编写一个32位二进制数除以16位二进制数的除法程序.观察当除数为0, 或超过相应寄存器围时,程序执行的结果。2 .修改零号中断服务程序,使它具有以下功能:(1)判断除数是否为0,当除数为0时,显示相应的结果。(2)当除数不为0时,采用适当的方法完成商超过 16位的二进制数的除法运 算。3 .注意必须保护原有中断服务程序的入口地址,并在程序完毕前加以恢复。.流程图truemessage db 0AH,0DH,divisor equals 0.,0dh,0ah,$messagel DB 0

25、AH,0DH, input error,0DH,0AH,$message2 DB PLEASE INPUT THE DIVIDEND (32),0AH,0DH,$message3 DB 0AH,0DH,PLEASE INPUT THE DIVISOR (16),0AH,0DH,$message4 DB 0AH,0DH,THE QUOTIENT IS:,$message5 DB 0AH,0DH,THE REMAINDER IS:,$DATA ENDSSTACK SEGMENT STACK STACKSTACK ENDSCODE SEGMENT;代码段ASSUME CS:CODE, SS:STAC

26、K ,DS:DATAstart proc farpush ds;TF中断标志置1;保存原中断向量;写中断向量mov ax,0 push ax mov ax,data mov ds,ax stimov al,0mov ah,35hint 21hpush espush bx push dx mov ax,seg int00 mov ds,axmov dx,offset int00 mov al,0mov ah,25h int 21hpop dsmov ah,09hmov dx,seg message2;提示输入32位二进制0或1mov ds,dxmov dx,offset message2 int

27、 21hmov cx,10hmov ax,0000hpush ax a1: mov ah,01hint 21hcmp al,0jz a2cmp al,1 jnz error1 stcrcl dx,1loop a1jmp a3 a2: clcrcl dx,1loop a1a3:mov cx,10h a4: mov ah,01hint 21hcmp al,0jz a5cmp al,1 jnz error2 stcpop ax rcl ax,1 push ax loop a4 jmp a6 a5: pop axclcrcl ax,1push ax loop a4 a6: mov ah,09hmov

28、dx,seg message3 mov ds,dx;输入数字与0比较;输入数字与1比较;输入有误则跳错误显示程序;为1则将CF置1;dx左移,移进一个1;为0则将CF置0;dx左移,移进一个0;提示输入16位0或1除数mov dx,offset message3int 21hmov cx,10ha7: mov ah,01hint 21hcmp al,0jz a8cmp al,1jnz error2stcrcl bx,1loop a7jmp a9a8: clcrcl bx,1loop a7jmp a9errorl: mov ah,09h;输入错误提示mov dx,seg messagelmov

29、ds,dxmov dx,offset message1int 21hjmp a1error2: mov ah,09hmov dx,seg message1mov ds,dxmov dx,offset message1int 21hjmp a6a9: mov cx,0000hpop axdiv bxcmp bx,20hjz a14push dxpush axmov ah,09hmov dx,seg message4mov ds,dxmov dx,offset message4int 21hmov bx,08hcall xianshimov bx,08hpop cxcall xianshimov

30、ah,09hmov dx,seg message5 mov ds,dxmov dx,offset message5 int 21hmov bx,08hpop cx call xianshia14:pop dxpop cx push ds mov ds,cx mov al,0 mov ah,25h int 21h pop ds ret start endpxianshi proc neara11:test cx,10000000bjz a10mov ah,02hmov dl,1 int 21h sal cx,1 dec bx jnz a11 jmp a12 a10:mov ah,02hmov d

31、l,0int 21h sal cx,1 dec bx jnz a11 a12: retxianshi endp int00 proc far;恢复中断向量表;修改后的中断服务子程序;修改返回地址pop cx add cx,2 push cx cmp bx,0jne nextmov ah,09hmov dx,seg messagemov ds,dxmov dx,offset messageint 21hmov bx,20hjmp finishnext:push axmov dx,axmov dx,0div bx;除数为0,显示错误信息退出 做除法,被除数高被除数高被除数低16位AX暂存于堆栈16

32、位改为低16位16位为0mov cx,ax pop axdiv bx第一次除法保存高16位的商于CX恢复低16位被除数,高16位是上次的余数商是CX AX,余数是 DXfinish:iretint00 endpcode ends end start五.运行结果CA- ndDMcnnJ2Vcrnd?xe - debjg e.eeMicrosoft Windows ? 6.1,76011?7? (J 2m Mlicrosoft Corpordtion?C:Usersophidcd.C:MJsersrd,C: ?cd NfisnSD:ndsi?de?bu(j 日.吧x。PLEASE INPUT TH

33、匚 DIVIDEND (02)1111010HOE11016WllH01diei01WllPLEASE INPUT THE DIVISOR (16)1010001011010110THE QU0TIFM1 IS:BOH0flHOei1l0BllIHF REMINDER IS 00111801Protjran terninted normallv六.预习题1 .如何保护原有中断向量表中的中断服务程序的入口地址答:先读取中断向量表中0号中断的地址,压入堆栈,程序结束时弹出堆栈,写 回中断向量表即可。2 .如何将你的中断服务程序入口地址置入中断向量表 ?答:可以进行DOSft能调用,25H号用来把中断向量表写入 DS: DX 35H号读取 ES: BX中断向量表。其中,AL为中断类型。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1