内蒙古工业大学微型计算机实验,内蒙古工业大学微型计算机原理及应用汇编程序实验答案.doc...

96f4938f6e70ea43fb5afefe86d9be82.gif内蒙古工业大学微型计算机原理及应用汇编程序实验答案.doc

内蒙古工业大学内蒙古工业大学微型计算机原理及应用实验参考汇编程序实验01A将FFFFH送到AX,BX,CX,DX,SI,DI,BP寄存器程序如下CODE SEGMENTASSUME CSCODESTART PROC FARSTTPUSH DSSUB AX,AXPUSH AX;MOV AX,0FFFFHMOV BX,AXMOV CX,AXMOV DX,AXMOV SI,AXMOV DI,AXMOV BP,AX;RETSTART ENDPCODE ENDSEND STT实验01B将FFH送到内存1000H,1001H,1002H,1003H,1004H单元中程序如下DATA SEGMENTORG 1000HH1 DB 5 DUPDATA ENDSCODE SEGMENTASSUME CSCODE,DSDATASTART PROC FARSTTPUSH DSSUB AX,AXPUSH AX;MOV AL,0FFHMOV DI,1000HMOV CX,5;循环5次LP1MOV DI,AL;FF放入1000H-1004H中INC DIDEC CXJNZ LP1;RETSTART ENDPCODE ENDSEND STT实验02A编写一个加法程序,在数据段偏移地址1000H处开始,存放有两个3字节长的数据(高位对应高地址,低位对应低地址),求这两数据(十六进制数)的和,并将结果放在两数据之后,利用DEBUG调试程序,并求解CCBBAAH223344HCCBBAA554433H程序如下DATA SEGMENTORG 1000HH1 DB 10 DUPDATA ENDSCODE SEGMENTASSUME CSCODE,DSDATASTART PROC FARSTTPUSH DSSUB AX,AXPUSH AXMovax,dsegMovds,ax;MOV SI,1000H;不带最高位进位的全加器MOV DI,1003HMOV BX,1006HMOV CX,3CLCAA MOV AL,SIADC AL,DIMOV BX,ALPUSHF;保护FR,这里其实没有必要,因为INC不会产生进位INC SIINC DIINC BXPOPFLOOP AAMOV DL,0;最高位进位ADC DL,0MOV DI,1009HMOV DI,DL;RETSTART ENDPCODE ENDSEND STT实验02B用串传送指令把A程序的数据块(被加数、加数、和)偏移地址1000H开始的区域传递到同一数据段的偏移地址为1010H开始的区域,并利用DEBUG查看运行结果程序如下DATA SEGMENTORG 1000HH1 DB 20 DUPDATA ENDSCODE SEGMENTASSUME CSCODE,DSDATASTART PROC FARSTTPUSH DSSUB AX,AXPUSH AX;MOV AX,DS;使ES段地址与DS相同MOV ES,AXMOV SI,1000H;不带最高位进位的全加器MOV DI,1003HMOV BX,1006HMOV CX,3CLCAA MOV AL,SIADC AL,DIMOV BX,ALPUSHF;保护FR,这里其实没有必要,因为INC不会产生进位INC SIINC DIINC BXPOPFLOOP AAMOV DL,0;最高位进位ADC DL,0MOV DI,1009HMOV DI,DLMOV SI,1000H;串传送MOV DI,1010HMOV CX,5CLDREP MOVSW;一次传送一个字;RETSTART ENDPCODE ENDSEND STT实验02C,选作编写一个两位十进制数加法程序,当从键盘上输入n1n2n3n4则在CRT上显示n1n2n3n4n5n6程序如下DATA SEGMENTH1 DB The addends all must be two figures, insufficient adds 0 in front.,13,10,DATA ENDSCODE SEGMENTASSUME CSCODE,DSDATASTART PROC FARSTTPUSH DSSUB AX,AXPUSH AX;MOV AX,DATAMOV DS,AXLEA DX,H1;打印注释加数和被加数都必须为两位数,不够的前面补0MOV AH,09HINT 21HSUB CX,CX;CX清零SUB DX,DX;DX清零CLC;清CFMOV AH,1;输入第1个数INT 21HMOV CH,AL;放入CHSUB CH,30H;ASCII码调整INT 21H;输入第2个数MOV CL,AL;放入CLSUB CL,30H;ASCII码调整MOV AH,2;打印加号MOV DL,2BHINT 21HMOV AH,1;输入第3个数INT 21HMOV DH,AL;放入DHSUB DH,30H;ASCII码调整INT 21H;输入第4个数MOV DL,AL;放入DLSUB DL,30H;ASCII码调整ADD CL,DL;ASCII码个位加法CMP CL,10;比较个位数结果是否大于10JNC AA;大于等于10则跳至AAADD CH,DH;个位不向十位进位的十位加法JMP BBAA ADD CH,DH;个位向十位有进位的十位加法ADD CH,1SUB CL,10BB MOV DL,3DH;打印等号MOV AH,2INT 21HCMP CH,10;比较十位数结果是否大于10JNC CCMOV DL,0;打印十位不向百位进位的百位0INT 21HJMP CCCCC MOV DL,31H;打印十位向百位进位的百位1INT 21HSUB CH,10CCCADD CH,30H;ASCII码调整MOV DL,CH;打印结果中的十位INT 21HADD CL,30H;ASCII码调整MOV DL,CL;打印结果中的个位INT 21HMOV AH,1;暂停INT 21H;RETSTART ENDPCODE ENDSEND STT实验03A在数据段偏移地址0100H处开始,存放0-9的平方值(构成一个表格),任给一个自然数M在0110H单元中(0M9),查表求出M的平方值,并将结果放入0111H单元。程序如下DATA SEGMENTORG 0100HH1 DB 00,01,04,09,16,25,36,49,64,81ORG 0110HH2 DB 7,DATA ENDSCODE SEGMENTASSUME CSCODE,DSDATASTART PROC FARSTTPUSH DSSUB AX,AXPUSH AX;MOV AX,DATAMOV DS,AXMOV SI,OFFSET H2MOV AL,SIMOV BX,OFFSET H1XLATINC SIMOV SI,AL;RETSTART ENDPCODE ENDSEND STT实验03B从内存1000H开始,建立19个自然递增然后又递减的数据串(0-9-0),用DEBUG查看运行结果。程序如下DATA SEGMENTORG 1000HH1 DB 20 DUPDATA ENDSCODE SEGMENTASSUME CSCODE,DSDATASTART PROC FARSTTPUSH DSSUB AX,AXPUSH AX;MOV SI,OFFSET H1MOV DI,OFFSET H1ADD DI,12HMOV AL,0MOV CX,10AA MOV SI,ALMOV DI,ALINC SIDEC DIINC ALLOOP 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 DUPTIP DB 13,10,The number must be a HEX 0F, press ESC to quit.,13,10,ERR DB 13,10,The number must be a HEX 0F.,13,10,DATA ENDSCODE SEGMENTASSUME CSCODE,DSDATASTART PROC FARSTTPUSH DSSUB AX,AXPUSH AX;MOV AX,DATAMOV DS,AXLEA DX,TIP;打印TIP信息MOV AH,09HINT 21HBEGINMOV DL,13;打印换行MOV AH,2INT 21HMOV DL,10;打印回行首INT 21HMOV AH,1;等待从键盘输入INT 21HMOV SI,OFFSET H2;保护输入MOV SI,ALCMP AL,27;如果按下ESC键,跳至QUITJZ QUITCALL DISPLAY0 ;调用DISPLAY0子程序CALL ASCII2HEX ;调用ASCII2HEX子程序CMP AL,0FFH;如果AL不等于FF出错码则跳至CORRECTJNZ CORRECTLEA DX,ERR;打印错误信息MOV AH,09HINT 21HJMP FINISH;跳至FINISHCORRECTMOV BX,OFFSET H1;查表XLATMOV AH,0MOV BX,0MOV BL,AL ;分离AL的高4位和低4位,分离后AL中为高4位,BL中为低4位AND AL,0F0HMOV CL,4SHR AL,CLAND BL,0FHCALL HEX2ASCII;调用HEX2ASCIICALL DISPLAY;调用DISPLAY子程序MOV AL,BLCALL HEX2ASCIICALL DISPLAYMOV DL,72;打印字母HMOV AH,2INT 21HJMP FINISHQUITCALL ESCAPE;调用ESCAPE子程序FINISHJMP BEGIN;RETSTART ENDPASCII2HEX PROC NEARCMP AL,30H;ASCII转16进制子程序JB ERROR;如果AL0则跳至ERRORCMP AL,39HJBE NUMBER;如果AL9则跳至NUMBERCMP AL,46HJA ERROR;如果ALF则跳至ERRORSUB AL,07HNUMBERSUB AL,30HJMP DONEERRORMOV AL,0FFHDONERETASCII2HEX ENDPHEX2ASCII PROC NEARCLC;16进制转ASCII子程序DAAADD AL,0F0HADC AL,40HRETHEX2ASCII ENDPDISPLAY PROC NEARPUSH DX;显示结果子程序MOV DL,ALMOV AH,2INT 21HPOP DXRETDISPLAY ENDPDISPLAY0 PROC NEARPUSH AX;该子程序打印输入及PUSH DXPUSHFMOV DL,13MOV AH,2INT 21HMOV DL,10INT 21HMOV DL,SI;打印输入INT 21HMOV DL,58;打印INT 21HPOPFPOP DXPOP AXRETDISPLAY0 ENDPESCAPE PROC NEARMOV AH,4CH;返回操作系统子程序INT 21HRETESCAPE ENDPCODE ENDSEND STT实验04A把BX中的“1”的个数放到AL中,并在屏幕上显示“1”的个数。程序如下CODE SEGMENTASSUME CSCODESTART PROC FARSTTPUSH DSSUB AX,AXPUSH AX;CLCMOV AX,0MOV DX,0MOV BX,000FHMOV CX,16CHECKSHL BX,1ADC DL,0CMP DL,1JZ COUNTCONTINUELOOP CHECKJMP FINISHCOUNTADD AL,1DAACLCMOV DX,0JMP CONTINUEFINISHMOV AH,0MOV BX,0MOV BL,AL;分离AL的高4位和低4位,分离后AL中为高4位,BL中为低4位AND AL,0F0HMOV CL,4SHR AL,CLAND BL,0FHCALL HEX2ASCII;调用HEX2ASCIICALL DISPLAY;调用DISPLAY子程序MOV AL,BLCALL HEX2ASCIICALL DISPLAY;RETSTART ENDPHEX2ASCII PROC NEARCLC;16进制转ASCII子程序DAAADD AL,0F0HADC AL,40HRETHEX2ASCII ENDPDISPLAY PROC NEARPUSH DX;显示结果子程序MOV DL,ALMOV AH,2INT 21HPOP DXRETDISPLAY ENDPCODE ENDSEND STT实验04B,选作编写程序在CRT上显示图形(图形见实验册P17)。程序如下CODE SEGMENTASSUME CSCODESTART PROC FARSTTPUSH DSSUB AX,AXPUSH AX;MOV BL,14HMOV BH,1MOV CX,0AHLP PUSH BXCALL SPACECALL STARCALL CRLFPOP BXDEC BLADD BH,2LOOP LP;RETSTART ENDPSPACE PROC NEAR;打印空格子程序PUSH CXMOV CX,0MOV AH,2MOV DL,32MOV CL,BLLP1INT 21HLOOP LP1POP CXRETSPACE ENDPSTAR PROC NEAR;打印*子程序PUSH CXMOV CX,0MOV DL,2AHMOV AH,2MOV CL,BHLP2INT 21HLOOP LP2POP CXRETSTAR ENDPCRLF PROC NEAR;回车换行子程序MOV DL,13MOV AH,2INT 21HMOV DL,10INT 21HRETCRLF ENDPCODE ENDSEND STT实验04C,选作自动生成1至99BCD数并送屏幕显示,显示格式见实验册P19。程序如下CODE SEGMENTASSUME CSCODESTART PROC FARSTTPUSH DSSUB AX,AXPUSH AX;MOV BL,16MOV AL,0CALL PRINTCALL CRLF;RETSTART ENDPPRINT PROC NEAR;打印数字子程序MOV AH,2MOV DH,1MOV CX,10MOV BH,30HLP2PUSH CXMOV CX,10MOV BL,30HLP0CMP BH,30HJZ AAJMP BBAA CMP BL,30HJZ CONBB MOV DL,BHINT 21HMOV DL,BLINT 21HCALL SPACECONINC BLLOOP LP0INC BHPOP CXLOOP LP2RETPRINT ENDPSPACE PROC NEAR;打印空格子程序PUSH CXMOV CX,0MOV AH,2MOV DL,32MOV CL,2LP1INT 21HLOOP LP1INC DHCMP DH,17JZ KKJMP LLKK CALL CRLFMOV DH,1LL POP CXRETSPACE ENDPCRLF PROC NEAR;回车换行子程序MOV DL,13MOV AH,2INT 21HMOV DL,10INT 21HRETCRLF ENDPCODE ENDSEND STT实验05A从首地址为BUF开始存放10个数(单字节无符号数),从这些数种找出最大值,存入MAX中,并显示到屏幕上。程序如下DATA SEGMENTORG 1000HBUF DB 1H,2H,3H,4H,9H,5H,6H,0EH,8H,7HORG 1020HMAX DB 1 DUPDATA ENDSCODE SEGMENTASSUME CSCODE,DSDATASTART PROC FARSTTPUSH DSSUB AX,AXPUSH AX;MOV AX,DATAMOV DS,AXCALL CHAMAXCALL HEX2ASCIIMOV DL,ALMOV AH,2INT 21H;RETSTART ENDPCHAMAX PROC NEARMOV SI,OFFSET BUFMOV AL,SIMOV CX,9INC SIF0 CMP AL,SIJGE F1MOV AL,SIF1 INC SILOOP F0MOV DI,OFFSET MAXMOV DI,ALRETCHAMAX ENDPHEX2ASCII PROC NEARCLC;16进制转ASCII子程序DAAADD AL,0F0HADC AL,40HRETHEX2ASCII ENDPCODE ENDSEND STT实验05B在BUF开始存放10个字节的带符号数组,分别统计正数、负数、零的个数,存放在数组的后面。程序如下DATA SEGMENTORG 1000HBUF DW 1,2,3,0,-4,-5,-6,-7,-8,-9EZ DB 0HLZ DB 0HT1 DB ZHENG SHU, LING, FU SHU,13,10,DATA ENDSCODE SEGMENTASSUME CSCODE,DSDATASTART PROC FARSTTPUSH DSSUB AX,AXPUSH AX;MOV AX,DATAMOV DS,AXCLCMOV AX,0MOV BX,0MOV SI,OFFSET BUFMOV CX,10CHECKMOV AX,SICMP AX,0JZ EQALZEROSHL AX,1ADC BL,0CMP BL,1JZ LESSZEROCONTINUEADD SI,2CLCMOV BL,0LOOP CHECKJMP FINISHEQALZEROMOV DI,OFFSET EZMOV DL,DIINC DLMOV DI,DLJMP CONTINUELESSZEROMOV DI,OFFSET LZMOV DL,DIINC DLMOV DI,DLJMP CONTINUEFINISHMOV BL,10MOV DI,OFFSET EZMOV AL,DISUB BL,ALMOV DI,OFFSET LZMOV AL,DISUB BL,ALMOV AL,BLPUSH DXPUSH AXLEA DX,T1MOV AH,09HINT 21HPOP AXPOP DXCALL HEX2ASCIICALL DISPLAYMOV DI,OFFSET EZMOV AL,DICALL HEX2ASCIICALL DISPLAYMOV DI,OFFSET LZMOV AL,DICALL HEX2ASCIICALL DISPLAY;RETSTART ENDPHEX2ASCII PROC NEARCLC;16进制转ASCII子程序DAAADD AL,0F0HADC AL,40HRETHEX2ASCII ENDPDISPLAY PROC NEARPUSH DXMOV DL,ALMOV AH,2INT 21HMOV DL,2CHMOV AH,2INT 21HPOP DXRETDISPLAY ENDPCODE ENDSEND STT实验05CBUF开始存放10个16位有符号数(字),将其中的负数抹掉,把正数连续地重新存放在BUF数组之后。程序如下DATA SEGMENTORG 1000HBUF DW 1,2,3,0,-4,-5,-6,-7,-8,-9GZ DW 10 DUPDATA ENDSCODE SEGMENTASSUME CSCODE,DSDATASTART PROC FARSTTPUSH DSSUB AX,AXPUSH AX;MOV AX,DATAMOV DS,AXCLCMOV AX,0MOV BX,0MOV SI,OFFSET BUFMOV DI,OFFSET GZMOV CX,10CHECKMOV AX,SIMOV DX,AXCMP AX,0JZ LESSZEROSHL AX,1ADC BL,0CMP BL,1JZ LESSZEROMOV DI,DXADD DI,2CONTINUEADD SI,2CLCMOV BL,0LOOP CHECKJMP FINISHLESSZEROMOV WORD PTR SI,0HJMP CONTINUEFINISH;RETSTART ENDPCODE ENDSEND STT实验06,软件综合设计模拟温度测量软件设计,具体要求见实验册P22。程序如下DATA SEGMENTORG 1000HTEMP DB 128,127,122,128,128,128,127,128,129,129,128,128,129,128,128,128ORG 1010HAVER DB 10 DUPORG 1020HBCD1 DB 10 DUPORG 1030HBCD2 DB 10 DUPORG 1040HXLATED DB 10 DUPORG 1060HLEDA DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,88H,83H,0C6H,0A1H,86H,8EH,7FHDATA ENDSCODE SEGMENTASSUME CSCODE,DSDATASTART PROC FARSTTPUSH DSSUB AX,AXPUSH AX;MOV AX,DATAMOV DS,AXMOV AX,0MOV BX,0MOV CX,0MOV DX,0CALL Z1CALL Z2CALL Z3CALL Z4CALL Z5;RETSTART ENDPZ1 PROC NEAR;将首地址为1000H开始存放的16个单字节数组取平均值后,存放在1010H开始的单元中MOV SI,OFFSET TEMPCLCMOV CX,15MOV AL,SILP1INC SIMOV BL,SIADD AX,BXADC DX,0LOOP LP1MOV BX,16DIV BXMOV SI,OFFSET AVERMOV

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值