1、微机原理上机实验答案实验01A将FFFFH送到AX,BX,CX,DX,SI,DI,BP寄存器程序如下:CODE SEGMENTASSUME CS:CODESTART PROC FARSTT:PUSH DS SUB AX,AX PUSH AX;= MOV AX,0FFFFH MOV BX,AX MOV CX,AX MOV DX,AX MOV SI,AX MOV DI,AX MOV BP,AX;= RETSTART ENDPCODE ENDSEND STT实验01B将FFH送到内存1000H,1001H,1002H,1003H,1004H单元中程序如下:DATA SEGMENTORG 1000HH
2、1 DB 5 DUP(?)DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART PROC FARSTT:PUSH DS SUB AX,AX PUSH AX;= MOV AL,0FFH MOV DI,1000H MOV CX,5 ;循环5次LP1:MOV DI,AL ;FF放入1000H-1004H中 INC DI DEC CX JNZ LP1;= RETSTART ENDPCODE ENDSEND STT实验02A编写 一个加法程序,在数据段偏移地址1000H处开始,存放有两个3字节长的数据(高位对应高地址,低位对应低地址),求这两数据(十六进制数)
3、的和,并将结 果放在两数据之后,利用DEBUG调试程序,并求解:CCBBAAH+223344H=?CCBBAA+554433H=?程序如下:DATA SEGMENTORG 1000HH1 DB 10 DUP(?)DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART PROC FARSTT:PUSH DS SUB AX,AXPUSH AXMov ax,dsegMov ds,ax;=MOV SI,1000H;不带最高位进位的全加器 MOV DI,1003H MOV BX,1006H MOV CX,3 CLCAA: MOV AL,SI ADC AL,DI
4、MOV BX,ALPUSHF;保护FR,这里其实没有必要,因为INC不会产生进位 INC SI INC DI INC BX POPF LOOP AA MOV DL,0 ;最高位进位 ADC DL,0 MOV DI,1009H MOV DI,DL;= RETSTART ENDPCODE ENDSEND STT实验02B用串传送指令把A程序的数据块(被加数、加数、和)偏移地址1000H开始的区域传递到同一数据段的偏移地址为1010H开始的区域,并利用DEBUG查看运行结果程序如下:DATA SEGMENTORG 1000HH1 DB 20 DUP(?)DATA ENDSCODE SEGMENTAS
5、SUME CS:CODE,DS:DATASTART PROC FARSTT:PUSH DS SUB AX,AX PUSH AX;= MOV AX,DS ;使ES段地址与DS相同 MOV ES,AXMOV SI,1000H;不带最高位进位的全加器 MOV DI,1003H MOV BX,1006H MOV CX,3 CLCAA: MOV AL,SI ADC AL,DI MOV BX,ALPUSHF;保护FR,这里其实没有必要,因为INC不会产生进位 INC SI INC DI INC BX POPF LOOP AA MOV DL,0 ;最高位进位 ADC DL,0 MOV DI,1009H MO
6、V DI,DL MOV SI,1000H ;串传送 MOV DI,1010H MOV CX,5 CLD REP MOVSW ;一次传送一个字;= RETSTART ENDPCODE ENDSEND STT实验02C,选作编写一个两位十进制数加法程序,当从键盘上输入:n1n2+n3n4则在CRT上显示n1n2+n3n4=n5n6程序如下:DATA SEGMENTH1 DB The addends all must be two figures, insufficient adds 0 in front.,13,10,$DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:
7、DATASTART PROC FARSTT:PUSH DS SUB AX,AX PUSH AX;= MOV AX,DATA MOV DS,AX LEA DX,H1 ;打印注释:加数和被加数都必须为两位数,不够的前面补0 MOV AH,09H INT 21H SUB CX,CX ;CX清零 SUB DX,DX ;DX清零 CLC ;清CF MOV AH,1 ;输入第1个数 INT 21H MOV CH,AL ;放入CH SUB CH,30H ;ASCII码调整 INT 21H ;输入第2个数 MOV CL,AL ;放入CL SUB CL,30H ;ASCII码调整 MOV AH,2 ;打印加号
8、MOV DL,2BH INT 21H MOV AH,1 ;输入第3个数 INT 21H MOV DH,AL ;放入DH SUB DH,30H ;ASCII码调整 INT 21H ;输入第4个数 MOV DL,AL ;放入DL SUB DL,30H ;ASCII码调整 ADD CL,DL ;ASCII码个位加法 CMP CL,10;比较个位数结果是否大于10 JNC AA ;大于等于10则跳至AA ADD CH,DH;个位不向十位进位的十位加法 JMP BBAA: ADD CH,DH ;个位向十位有进位的十位加法 ADD CH,1 SUB CL,10BB: MOV DL,3DH ;打印等号 MO
9、V AH,2 INT 21H CMP CH,10 ;比较十位数结果是否大于10 JNC CC MOV DL,0 ;打印十位不向百位进位的百位=0 INT 21H JMP CCCCC: MOV DL,31H ;打印十位向百位进位的百位=1 INT 21H SUB CH,10CCC:ADD CH,30H ;ASCII码调整 MOV DL,CH ;打印结果中的十位 INT 21H ADD CL,30H ;ASCII码调整 MOV DL,CL ;打印结果中的个位 INT 21H MOV AH,1 ;暂停 INT 21H;= RETSTART ENDPCODE ENDSEND STT实验03A在数据段偏
10、移地址0100H处开始,存放0-9的平方值(构成一个表格),任给一个自然数M在0110H单元中(0=M=9),查表求出M的平方值,并将结果放入0111H单元。程序如下:DATA SEGMENTORG 0100HH1 DB 00,01,04,09,16,25,36,49,64,81ORG 0110HH2 DB 7,?DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART PROC FARSTT:PUSH DS SUB AX,AX PUSH AX;= MOV AX,DATA MOV DS,AX MOV SI,OFFSET H2 MOV AL,SI MOV
11、BX,OFFSET H1 XLAT INC SI MOV SI,AL;= RETSTART ENDPCODE ENDSEND STT实验03B从内存1000H开始,建立19个自然递增然后又递减的数据串(0-9-0),用DEBUG查看运行结果。程序如下:DATA SEGMENTORG 1000HH1 DB 20 DUP(?)DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART PROC FARSTT:PUSH DS SUB AX,AX PUSH AX;= MOV SI,OFFSET H1 MOV DI,OFFSET H1 ADD DI,12H MOV
12、AL,0 MOV CX,10AA: MOV SI,AL MOV DI,AL INC SI DEC DI INC AL LOOP AA ;= RETSTART ENDPCODE ENDSEND STT实验03C,选作在数据段偏移地址1000H处,安排部分七段LED显示码表,要求从键盘上任给一个0F中的数,然后再屏幕上显示出其对应的码值。七段共阴极LED显示码表见实验册P14。程序如下:DATA SEGMENTORG 1000HH1 DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71HH2 DB 1 DUP(?)TIP
13、 DB 13,10,The input number must be a HEX (0F), press to quit.,13,10,$ERR DB 13,10,The input number must be a HEX (0F).,13,10,$DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART PROC FARSTT:PUSH DS SUB AX,AX PUSH AX;= MOV AX,DATA MOV DS,AX LEA DX,TIP ;打印TIP信息 MOV AH,09H INT 21H BEGIN: MOV DL,13 ;打印换行 M
14、OV AH,2 INT 21H MOV DL,10 ;打印回行首 INT 21H MOV AH,1 ;等待从键盘输入 INT 21H MOV SI,OFFSET H2 ;保护输入 MOV SI,AL CMP AL,27 ;如果按下键,跳至QUIT JZ QUIT CALL DISPLAY0 ;调用DISPLAY0子程序 CALL ASCII2HEX ;调用ASCII2HEX子程序 CMP AL,0FFH ;如果AL不等于FF(出错码)则跳至CORRECT JNZ CORRECT LEA DX,ERR ;打印错误信息 MOV AH,09H INT 21H JMP FINISH ;跳至FINISH
15、 CORRECT: MOV BX,OFFSET H1 ;查表 XLAT MOV AH,0 MOV BX,0 MOV BL,AL ;分离AL的高4位和低4位,分离后AL中为高4位,BL中为低4位 AND AL,0F0H MOV CL,4 SHR AL,CL AND BL,0FH CALL HEX2ASCII ;调用HEX2ASCII CALL DISPLAY ;调用DISPLAY子程序 MOV AL,BL CALL HEX2ASCII CALL DISPLAY MOV DL,72 ;打印字母H MOV AH,2 INT 21H JMP FINISHQUIT:CALL ESCAPE ;调用ESCA
16、PE子程序FINISH: JMP BEGIN;= RETSTART ENDPASCII2HEX PROC NEAR CMP AL,30H ;ASCII转16进制子程序 JB ERROR ;如果AL0则跳至ERROR CMP AL,39H JBE NUMBER ;如果ALF则跳至ERROR SUB AL,07HNUMBER: SUB AL,30H JMP DONEERROR: MOV AL,0FFHDONE: RETASCII2HEX ENDPHEX2ASCII PROC NEAR CLC ;16进制转ASCII子程序 DAA ADD AL,0F0H ADC AL,40H RETHEX2ASCI
17、I ENDPDISPLAY PROC NEAR PUSH DX ;显示结果子程序 MOV DL,AL MOV AH,2 INT 21H POP DX RETDISPLAY ENDPDISPLAY0 PROC NEAR PUSH AX ;该子程序打印输入及: PUSH DX PUSHF MOV DL,13 MOV AH,2 INT 21H MOV DL,10 INT 21H MOV DL,SI ;打印输入 INT 21H MOV DL,58 ;打印: INT 21H POPF POP DX POP AX RETDISPLAY0 ENDPESCAPE PROC NEAR MOV AH,4CH ;返
18、回操作系统子程序 INT 21H RETESCAPE ENDPCODE ENDSEND STT实验04A把BX中的“1”的个数放到AL中,并在屏幕上显示“1”的个数。程序如下:CODE SEGMENTASSUME CS:CODESTART PROC FARSTT:PUSH DS SUB AX,AX PUSH AX;= CLC MOV AX,0 MOV DX,0 MOV BX,000FH MOV CX,16 CHECK: SHL BX,1 ADC DL,0 CMP DL,1 JZ COUNTCONTINUE: LOOP CHECK JMP FINISHCOUNT: ADD AL,1 DAA CL
19、C MOV DX,0 JMP CONTINUE FINISH: MOV AH,0 MOV BX,0 MOV BL,AL ;分离AL的高4位和低4位,分离后AL中为高4位,BL中为低4位 AND AL,0F0H MOV CL,4 SHR AL,CL AND BL,0FH CALL HEX2ASCII ;调用HEX2ASCII CALL DISPLAY ;调用DISPLAY子程序 MOV AL,BL CALL HEX2ASCII CALL DISPLAY ;= RETSTART ENDPHEX2ASCII PROC NEAR CLC ;16进制转ASCII子程序 DAA ADD AL,0F0H A
20、DC AL,40H RETHEX2ASCII ENDPDISPLAY PROC NEAR PUSH DX ;显示结果子程序 MOV DL,AL MOV AH,2 INT 21H POP DX RETDISPLAY ENDPCODE ENDSEND STT实验04B,选作编写程序在CRT上显示图形(图形见实验册P17)。程序如下:CODE SEGMENTASSUME CS:CODESTART PROC FARSTT:PUSH DS SUB AX,AX PUSH AX;= MOV BL,14H MOV BH,1 MOV CX,0AHLP: PUSH BX CALL SPACE CALL STAR
21、CALL CRLF POP BX DEC BL ADD BH,2 LOOP LP;= RETSTART ENDPSPACE PROC NEAR;打印空格子程序 PUSH CX MOV CX,0 MOV AH,2 MOV DL,32 MOV CL,BLLP1:INT 21H LOOP LP1 POP CX RETSPACE ENDPSTAR PROC NEAR;打印*子程序 PUSH CX MOV CX,0 MOV DL,2AH MOV AH,2 MOV CL,BHLP2:INT 21H LOOP LP2 POP CX RETSTAR ENDPCRLF PROC NEAR;回车换行子程序 MOV
22、 DL,13 MOV AH,2 INT 21H MOV DL,10 INT 21H RETCRLF ENDPCODE ENDSEND STT实验04C,选作自动生成1至99BCD数并送屏幕显示,显示格式见实验册P19。程序如下:CODE SEGMENTASSUME CS:CODESTART PROC FARSTT:PUSH DS SUB AX,AX PUSH AX;= MOV BL,16 MOV AL,0 CALL PRINT CALL CRLF;= RETSTART ENDPPRINT PROC NEAR;打印数字子程序 MOV AH,2 MOV DH,1 MOV CX,10 MOV BH,
23、30H LP2:PUSH CX MOV CX,10 MOV BL,30H LP0:CMP BH,30H JZ AA JMP BBAA: CMP BL,30H JZ CONBB: MOV DL,BH INT 21H MOV DL,BL INT 21H CALL SPACECON:INC BL LOOP LP0 INC BH POP CX LOOP LP2 RETPRINT ENDPSPACE PROC NEAR;打印空格子程序 PUSH CX MOV CX,0 MOV AH,2 MOV DL,32 MOV CL,2LP1:INT 21H LOOP LP1 INC DH CMP DH,17 JZ
24、KK JMP LLKK: CALL CRLF MOV DH,1 LL: POP CX RETSPACE ENDPCRLF PROC NEAR;回车换行子程序 MOV DL,13 MOV AH,2 INT 21H MOV DL,10 INT 21H RETCRLF ENDPCODE ENDSEND STT实验05A从首地址为BUF开始存放10个数(单字节无符号数),从这些数种找出最大值,存入MAX中,并显示到屏幕上。程序如下:DATA SEGMENTORG 1000HBUF DB 1H,2H,3H,4H,9H,5H,6H,0EH,8H,7HORG 1020HMAX DB 1 DUP(?)DATA
25、 ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART PROC FARSTT:PUSH DS SUB AX,AX PUSH AX;= MOV AX,DATA MOV DS,AX CALL CHAMAX CALL HEX2ASCII MOV DL,AL MOV AH,2 INT 21H;= RETSTART ENDPCHAMAX PROC NEAR MOV SI,OFFSET BUF MOV AL,SI MOV CX,9 INC SIF0: CMP AL,SI JGE F1 MOV AL,SIF1: INC SI LOOP F0 MOV DI,OFFSET MAX MOV DI,AL RETCHAMAX ENDP
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1