当前位置:文档之家› 计算机组成原理实验题

计算机组成原理实验题

一.这是一个判断某一年是否为润年的程序,运行可执行程序Ifleap.exe后,输入具体的年份,可输出是本年是否为闰年的提示信息。

DATA SEGMENT ;定义数据段INFON DB 0DH,0AH,'PLEASE INPUT A YEAR: $' ;声明空间存储输入提示信息,其中0d回车,0a换行Y DB 0DH,0AH,'THIS IS A LEAP YEAR! $' ;声明空间存储是闰年提示信息,同上另起一行输出N DB 0DH,0AH,'THIS IS NOT A LEAP YEAR! $' ;声明空间存储不是闰年提示信息,同上另起一行输出W DW 0 ;声明空间存储输入年份解析后生成的年份数字BUF DB 8DB ?DB 8 DUP(?) ;声明空间作为缓冲区,总共10个字节,第一个表示准备接受的字DATA ENDSSTACK SEGMENT STACKDB 200 DUP(0)STACK ENDS ;定义一个栈,200字节CODE SEGMENTASSUME DS:DATA,SS:STACK,CS:CODESTART:MOV AX,DATAMOV DS,AX ;指定堆栈LEA DX,INFON ;在屏幕上显示提示信息MOV AH,9INT 21H ;将infon开始的字符串输出到屏幕LEA DX,BUF ;从键盘输入年份字符串MOV AH,10INT 21HMOV CL, [BUF+1] ;获取实际输入长度LEA DI,BUF+2 ;获取字符串首地址CALL DATACATE ;调用子程序,将输入字符串传化为年份数字CALL IFYEARS ;调用子程序,判断是否闰年JC A1 ;如果进位标记C为1则跳转到a1LEA DX,N ;否则输出不是闰年信息MOV AH,9INT 21HJMP EXITA1: LEA DX,Y ;输出是闰年信息MOV AH,9INT 21HEXIT: MOV AH,4CH ;程序结束INT 21HDATACATE PROC NEAR;;指明该子程序在主程序段内PUSH CX; ;备份DEC CXLEA SI,BUF+2 ;将buf中第一个字符(即buf的第三个字节数据)的地址赋给si TT1: INC SI ;循环,使得si指向最后一个字符(即buf中回车符前面的一个) LOOP TT1;LEA SI,CX[DI]POP CX ;回复cxMOV DH,30H ;辅助数据,用来将数字字符对应的ASCII码转换为其代表的数字本身MOV BL,10 ;辅助数据,用来在每进一位时使得ax乘以10MOV AX,1 ;ax用来装对应位的权值L1: PUSH AX ;备份axSUB BYTE PTR [SI],DH ;将单个字符转换为对应的数字MUL BYTE PTR [SI] ;将单个字符转换为对应的数字ADD W,AX ;加到结果上(易知当所有位都加完时,即是我们想要的年份数字)POP AX ;恢复axMUL BL ;权值乘以10DEC SI ;si指向更高一位数字LOOP L1RET ;子程序返回DATACATE ENDPIFYEARS PROC NEAR 指明该子程序段在主程序段内,该子程序用于检测是否是闰年,接收年份数据,改变C标记位表示不同结果1. push bx ;备份bx2. push cx ;备份cx,下面cx用于存储原始年份数据3.push dx ;备份dx,下面dx用于存储除法余数4. mov ax,[w] ;获取年份数据5. mov cx,ax ;将年份数据备份到cx,因为后面做除法时ax值将会改变6. mov dx,0 ;因为被除数要为32字节,高位在dx,本程序中为7. mov bx,100 ;这三行判断是否能被100整除8. div bx9. cmp dx,010. jnz lab1 ;若不能被100整除,跳转到lab111. mov ax,cx ;否则判断能否被400整除12. mov bx,40013. div bx14. cmp dx,015. jz lab2 ;若能表示是闰年,跳转到lab216. clc ;否则不是闰年,将C标记位清零,并跳转到lab317. jmp lab318. lab1: mov ax,cx ;不能被100整除时跳转到此处,进一步判断能否被4整除19. mov dx,020. mov bx,421. div bx22. cmp dx,023. jz lab2 ;若不能被100整除但能能被4整除是闰年,跳转到lab224. clc ;若不能被100整除也不能被4整除不是闰年,将c标志位置0,并跳转到lab325. jmp lab326. lab2: stc ;若是闰年跳转到此处将c标志位置127. lab3: pop dx ;相应寄存器恢复28. pop cx29. pop bx30. ret ;子程序返回31. ifyears endp32.code ends33. end start34.MOV AX,WMOV CX,AXMOV DX,0MOV BX,4DIV BXCMP DX,0JNZ LAB1MOV AX,CXMOV BX,100DIV BXCMP DX,0JNZ LAB2MOV AX,CXMOV BX,400DIV BXCMP DX,0JZ LAB2LAB1: CLCJMP LAB3LAB2: STCLAB3: POP DXPOP CXPOP BXRETIFYEARS ENDPCODE ENDSEND START二.这是一个显示系统日期和时间的程序,运行时,在出现的提示信息中输入大写字母“D”,可显示系统当前日期;输入大写字母“T”,可显示系统当前时间;输入大写字母“Q”,可结束程序。

STACK SEGMENT STACKDW 200 DUP (?)STACK ENDSDATA SEGMENTSPACE DB 1000 DUP (' ')PATTERN DB 6 DUP (' '),0C9H,26 DUP (0CDH),0BBH,6 DUP (' ')DB 6 DUP (' '),0BAH,26 DUP (20H),0BAH,6 DUP (' ')DB 6 DUP (' '),0C8H,26 DUP (0CDH),0BCH,6 DUP (' ') DBUFFER DB 8 DUP (':'),12 DUP (' ')DBUFFER1 DB 20 DUP (' ')STR DB 0DH,0AH, 'PLEASE INPUT DATE(D) OR TIME(T) OR QUIT(Q): $'DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACKSTART: MOV AX,0001H ;设置显示方式为40*25彩色文本方式INT 10HMOV AX,DATAMOV DS,AXMOV ES,AXMOV BP,OFFSET SPACEMOV DX,0B00HMOV CX,1000MOV BX,0040HMOV AX,1300HINT 10HMOV BP,OFFSET PATTERN ;显示矩形条MOV DX,0B00HMOV CX,120MOV BX,004EHMOV AX,1301HINT 10HLEA DX,STR ;显示提示信息MOV AH,9INT 21HMOV AH,1 ;从键盘输入单个字符INT 21HCMP AL,44H ;AL='D'?JNE ACALL DATE ;显示系统日期A: CMP AL,54H ;AL='T'?JNE BCALL TIME ;显示系统时间B: CMP AL,51H ;AL='Q'?JNE STARTMOV AH,4CH ;返回dos状态INT 21HDATE PROC NEAR ;显示日期子程序DISPLAY:MOV AH,2AH ;取日期INT 21HMOV SI,0MOV AX,CXMOV BX,100DIV BLMOV BL,AHCALL BCDASC1 ;日期数值转换成相应的ASCII码字符MOV AL,BLCALL BCDASC1INC SIMOV AL,DHCALL BCDASC1INC SIMOV AL,DLCALL BCDASC1MOV BP,OFFSET DBUFFER1MOV DX,0C0DHMOV CX,20MOV BX,004EHMOV AX,1301HINT 10HMOV AH,02H ;设置光标位置MOV DX,0300HMOV BH,0INT 10HMOV BX,0018HREPEA: MOV CX,0FFFFH ;延时REPEAT1:LOOP REPEAT1DEC BXJNZ REPEAMOV AH,01H ;读键盘缓冲区字符到AL寄存器INT 16HJE DISPLAYJMP STARTMOV AX,4C00HINT 21HRETDATE ENDPTIME PROC NEAR ;显示时间子程序DISPLAY1:MOV SI,0MOV BX,100DIV BLMOV AH,2CH ;取时间INT 21HMOV AL,CHCALL BCDASC ;将时间数值转换成ASCII码字符INC SIMOV AL,CLCALL BCDASCINC SIMOV AL,DHCALL BCDASCMOV BP,OFFSET DBUFFERMOV DX,0C0DHMOV CX,20MOV BX,004EHMOV AX,1301HINT 10HMOV AH,02HMOV DX,0300HMOV BH,0INT 10HMOV BX,0018HRE: MOV CX,0FFFFHREA: LOOP READEC BXJNZ REMOV AH,01HINT 16HJE DISPLAY1JMP STARTMOV AX,4C00HINT 21HRETTIME ENDPBCDASC PROC NEAR ;时间数值转换成ASCII码字符子程序PUSH BXCBWMOV BL,10DIV BLADD AL,'0'MOV DBUFFER[SI],ALINC SIADD AH,'0'MOV DBUFFER[SI],AHINC SIPOP BXRETBCDASC ENDPBCDASC1 PROC NEAR ;日期数值转换成ASCII码字符子程序PUSH BXCBWMOV BL,10DIV BLADD AL,'0'MOV DBUFFER1[SI],ALINC SIADD AH,'0'MOV DBUFFER1[SI],AHINC SIPOP BXRETBCDASC1 ENDPCODE ENDSEND START三.这是一个显示系统时间的程序,运行时,在屏幕的右上角将以“时:分:秒”的形式显示本机系统的时间。

相关主题