华电微机原理汇编实验参考程序.docx
《华电微机原理汇编实验参考程序.docx》由会员分享,可在线阅读,更多相关《华电微机原理汇编实验参考程序.docx(19页珍藏版)》请在冰豆网上搜索。
华电微机原理汇编实验参考程序
实验一
1-1.从3500H内存单元开始建立0~15共16个数据(建立的数据为00H,01H~09H.0AH~0FH)。
并运行之,检查记录结果。
分析①:
3500H为偏移地址,对应的段基址采用默认的DS当前值;
②程序中,如果不涉及到堆栈,则堆栈段可省略;
源程序:
DATASSEGMENT
ORG3500H;指定数据存放的起始偏移地址
ANSWERDB16DUP(?
);为结果从偏移地址3500H开始连续预留16个字节单元
DATASENDS
STACKSSEGMENT
;此处输入堆栈段代码
STACKSENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS,SS:
STACKS
START:
MOVAX,DATAS
MOVDS,AX
MOVDI,3500H;程序开始设置数据区首地址
MOVCX,0010H;把字节数送入cx中(loop语句会用到)
MOVAL,00H;将初值OOH送入AL
RE:
MOV[DI],AL;写入第一字节
INCDI;地址指针+1
INCAL;将AL中的数据+1
LOOPRE;重复16次
MOVAH,4CH
INT21H
CODESENDS
ENDSTART
1-2.如果建立的数据为BCD码表示的十进制数据(建立的数据应为00H,01H~09H,10H~15H),应如何修改上述程序.并运行之,检查记录结果
源程序:
DATASSEGMENT
ORG3500H;指定数据存放的起始偏移地址
ANSWERDB16DUP(?
);为结果从偏移地址3500H开始连续预留16个字节单元
DATASENDS
STACKSSEGMENT
;此处输入堆栈段代码
STACKSENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS,SS:
STACKS
START:
MOVAX,DATAS
MOVDS,AX
MOVDI,3500H;程序开始设置数据区首地址
MOVCX,0010H;把字节数送入cx中(loop语句会用到)
MOVAL,00H;将初值OOH送入AL
RE:
MOV[DI],AL;写入第一字节
INCDI;地址指针+1
INCAL;将AL中的数据+1
DAA;调整BCD码为10进制
LOOPRE;重复16次
MOVAH,4CH
INT21H
CODESENDS
ENDSTART
1-3.编程完成1+2+3+4+5+6+7+8+9运算。
源程序:
DATASSEGMENT
SUMDB?
DATASENDS
STACKSSEGMENT
;此处输入堆栈段代码
STACKSENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS,SS:
STACKS
START:
MOVAX,DATAS
MOVDS,AX
MOVSUM,0
MOVAL,0
MOVDL,1
MOVCX,9
A1:
ADDAL,DL
DAA
INCDL
LOOPA1
MOVSUM,AL
MOVAH,4CH
INT21H
CODESENDS
ENDSTART
1-4.将内存3500H单元开始存放的0~9共10个字节数传递到3600H单元开始的数据区中(同一段内传送)。
DATASSEGMENT
ORG3500H
MEM1DB0,1,2,3,4,5,6,7,8,9
ORG3600H
MEM2DB10DUP(?
)
DATASENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS
START:
MOVAX,DATAS
MOVDS,AX
MOVSI,3500H
MOVDI,3600H
MOVCX,10
A1:
MOVAL,[SI]
MOV[DI],AL
INCSI
INCDI
LOOPA1
MOVAH,4CH
INT21H
CODESENDS
ENDSTART
1-5.在1-4题中,如果采用字数据传送,应该如何修改程序?
并运行之,检查记录结果。
源程序:
DATASEGMENT
ORG3500H
MEM1DB0,1,2,3,4,5,6,7,8,9
ORG3600H
MEM2DB10DUP(?
)
DATAENDS
STACKSSEGMENT
;此处输入堆栈段代码
STACKSENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATA,SS:
STACKS
START:
MOVAX,DATA
MOVDS,AX
MOVES,AX
MOVSI,3500H
MOVDI,3600H
MOVCX,5
AGAIN:
MOVAX,[SI]
MOV[DI],AX
INCSI
INCSI
INCDI
INCDI
LOOPAGAIN
MOVAH,4CH
INT21H
CODESENDS
ENDSTART
1-6.在1-4题中,如果采用串传送指令(MOVSB,MOVSW指令)如何修改程序?
并运行之,检查记录结果。
源程序:
DATASSEGMENT
ORG3500H
MEM1DB0,1,2,3,4,5,6,7,8,9
ORG3600H
MEM2DB10DUP(?
)
DATASENDS
STACKSSEGMENT
STACKSENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS,SS:
STACKS
START:
MOVAX,DATAS
MOVDS,AX
MOVES,AX
MOVSI,3500H
MOVDI,3600H
MOVCX,10
REPMOVSB
MOVAH,4CH
INT21H
CODESENDS
ENDSTART
实验二
2-1.教材161页例题3.39
源程序:
DATASSEGMENT
TABLEDB0,1,4,9,16,25,36,49,64,81,100,121,144,169,196,225
DATADB5
RESULTDB?
DATASENDS
STACKSSEGMENT
STACKSENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS,SS:
STACKS
START:
MOVAX,DATAS
MOVDS,AX
MOVBX,OFFSETTABLE
MOVAH,0
MOVAL,DATA
ADDBX,AX
MOVAL,[BX]
MOVRESULT,AL
MOVAH,4CH
INT21H
CODESENDS
ENDSTART
查看过程:
-U
1404:
0000B80214MOVAX,1402
1404:
00038ED8MOVDS,AX
1404:
0005BB0000MOVBX,0000
1404:
0008B400MOVAH,00
1404:
000AA01000MOVAL,[0010]
1404:
000D03D8ADDBX,AX
1404:
000F8A07MOVAL,[BX]
1404:
0011A21100MOV[0011],AL
1404:
0014B44CMOVAH,4C
1404:
0016CD21INT21
1404:
00180000ADD[BX+SI],AL
1404:
001A0000ADD[BX+SI],AL
1404:
001C0000ADD[BX+SI],AL
1404:
001E0000ADD[BX+SI],AL
-G=014
AX=0019BX=0005CX=0038DX=0000SP=0000BP=0000SI=0000DI=0000
DS=1402ES=13F2SS=1402CS=1404IP=0014NVUPEIPLNZNAPENC
-D1402:
0
1402:
00000001040910192431-4051647990A9C4E1......$1@Qdy....
1402:
00100519000000000000-0000000000000000................
1402:
0020B802148ED8BB0000-B400A0100003D88A................
1402:
003007A21100B44CCD21-0000000000000000.....L.!
........
1402:
00400000000000000000-0000000000000000................
1402:
00500000000000000000-0000000000000000................
1402:
00600000000000000000-0000000000000000................
1402:
00700000000000000000-0000000000000000................
2.1编程完成Z=3x+4y-4,其中x、y为字节单元,z为字单元。
如果x、y为字单元,z为双字单元,,如何修改程序,并运行,给出结果
源程序:
DATASSEGMENT
XDB5
YDB5
ZDW?
DATASENDS
STACKSSEGMENT
STACKSENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS,SS:
STACKS
START:
MOVAX,DATAS
MOVDS,AX
MOVAL,X
MOVBL,3
MULBL
MOVDX,AX
MOVAL,Y
MOVBL,4
MULBL
ADDDX,AX
SUBDX,4
MOVZ,DX
MOVAH,4CH
INT21H
CODESENDS
ENDSTART
2-2、从BUFFER单元开始存放若干数据,求其中负数的个数存入MDAT字节单元中。
源程序:
DATASSEGMENT
BUFFERDB1,-2,3,-4,5,6
COUNTEQU$-BUFFER
MDATDB?
DATASENDS
STACKSSEGMENT
STACKSENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS,SS:
STACKS
START:
MOVAX,DATAS
MOVDS,AX
MOVBL,0
LEASI,BUFFER
MOVCX,COUNT
AGAIN:
MOVAL,[SI]
CMPAL,0
JGEA1
INCBL
A1:
INCSI
LOOPAGAIN
MOVMDAT,BL
MOVAH,4CH
INT21H
CODESENDS
ENDSTART
2-3、修改程序,使其能求出数据区中正数的个数,存入PDAT单元中。
DATASSEGMENT
BUFFERDB1,-2,3,-4,5,6
COUNTEQU$-BUFFER
MDATDB?
DATASENDS
STACKSSEGMENT
STACKSENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS,SS:
STACKS
START:
MOVAX,DATAS
MOVDS,AX
MOVBL,0
LEASI,BUFFER
MOVCX,COUNT
AGAIN:
MOVAL,[SI]
CMPAL,0
JLEA1
INCBL
A1:
INCSI
LOOPAGAIN
MOVPDAT,BL
MOVAH,4CH
INT21H
CODESENDS
ENDSTART
2-5.调用DOS功能,在屏幕上显示0~9.。
源程序:
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS,SS:
STACKS
START:
MOVAX,DATAS
MOVDS,AX
MOVCX,10
MOVDL,30H
NEXT:
MOVAH,02H
INT21H
INCDL
LOOPNEXT
MOVAH,4CH
INT21H
CODESENDS
ENDSTART
调用DOS功能,在屏幕上显示0+1+2+3的结果。
源程序:
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS,SS:
STACKS
START:
MOVAX,DATAS
MOVDS,AX
MOVCX,3
MOVAL,1
MOVDL,0
NEXT:
ADDDL,AL
INCAL
LOOPNEXT
ADDDL,30H
MOVAH,02H
INT21H
MOVAH,4CH
INT21H
CODESENDS
ENDSTART
2-6、(选作)。
调用DOS功能,在屏幕上显示0+1+2+3+4+5+6+7+8+9的结果
源程序:
DATASSEGMENT
SUMDB?
DATASENDS
STACKSSEGMENT
STACKSENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS,SS:
STACKS
START:
MOVAX,DATAS
MOVDS,AX
MOVCX,9
MOVAL,1
MOVDL,0
NEXT:
ADDDL,AL
INCAL
LOOPNEXT
MOVAH,0
MOVAL,DL;AX存放和
MOVBL,10
DIVBL;AX/10商(4)存在AL,余数(5)存在AH
MOVBX,AX;将结果存到BX
MOVDL,BL
ADDDL,30H
MOVAH,2
INT21H;显示商4
MOVDL,BH
ADDDL,30H
MOVAH,2
INT21H;显示余数5
MOVAH,4CH
INT21H
CODESENDS
ENDSTART
实验三
3-1、教材习题3.12
已知从DS:
2200H,ES:
3200H单元起分别存放20个ASCII的字符。
找出这两个字符串中第一个不同字符的位置(段内偏地址),并放入DS:
22A0H开始的连续两个字单元中。
请设计完成此任务的程序段。
(1)使用通常用的比较指令(CMP)实现;
(2)使用数据串比较指令(CMPSB)实现
源程序:
DATASSEGMENT
ORG2200H
DATA1DB‘01234567890123456789’
ORG22A0H
DW2DUP(?
)
DATASENDS
ESEGSEGMENT
ORG3200H
DATA2DB‘01234587890123456789’
ESEGENDS
STACKSSEGMENT
STACKSENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS,ES:
ESEG
START:
MOVAX,DATAS
MOVDS,AX
MOVAX,ESEG
MOVES,AX
MOVSI,2200H
MOVDI,3200H
MOVCX,20
AGAIN:
MOVAL,[SI]
CMPAL,[DI]
JNZDONE
INCSI
INCDI
LOOPAGAIN
JMPEXIT
DONE:
MOVBX,22A0H
MOV[BX],SI
EXIT:
MOVAH,4CH
INT21H
CODESENDS
ENDSTART
3-2、教材习题3.21
编写程序段,在数据区0000H:
2000H开始100字节范围内,查找字符'A',若找到,则将偏移地址送入DX,没有找到,则结束。
源程序:
DATASSEGMENT
ORG2000H
DATADB'B','C','A','D'
DATASENDS
STACKSSEGMENT
STACKSENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS,SS:
STACKS
START:
MOVAX,DATAS
MOVDS,AX
CLD
MOVDI,2000H
MOVCX,100
MOVAL,'A'
REPNESCASB
JNZSTOP
DECDI
MOVDX,DI
STOP:
MOVAH,4CH
INT21H
CODESENDS
ENDSTART
3-3、教材习题3.34
在数据区中,以TABLE开始连续存放0~6的立方值(称为立方表),设任给一数x(0≤x≤6),x在TAB1单元,查表求x的立方值,并把结果存入TAB2单元。
源程序:
DATASSEGMENT
TABLEDB0,1,4,9,16,25,36
TAB1DB3
TAB2DB?
DATASENDS
STACKSSEGMENT
STACKSENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS,SS:
STACKS
START:
MOVAX,DATAS
MOVDS,AX
MOVBX,OFFSETTABLE
MOVAH,0
MOVAL,TAB1
ADDBX,AX
MOVDL,[BX]
MOVTAB2,DL
MOVAH,4CH
INT21H
CODESENDS
ENDSTART
方法2:
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS,SS:
STACKS
START:
MOVAX,DATAS
MOVDS,AX
MOVBX,OFFSETTABLE
MOVAL,TAB1
XLAT
MOVTAB2,AL
MOVAH,4CH
INT21H
CODESENDS
ENDSTART
3-4、教材习题3.36
编写程序,计算下面函数的值。
源程序:
DATASSEGMENT
XDB-5
SDW?
DATASENDS
STACKSSEGMENT
STACKSENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS,SS:
STACKS
START:
MOVAX,DATAS
MOVDS,AX
MOVAL,X
CMPAL,0
JGEA1
MOVBL,2
JMPDONE
A1:
CMPX,10
JGA2
MOVBL,3
JMPDONE
A2:
MOVBL,4
DONE:
IMULBL
MOVS,AX
MOVAH,4CH
INT21H
CODESENDS
ENDSTART
3-5、教材习题3.39
两个多字节压缩BCD码数9876543219H和1234567891H,它们分别按低位字节在前高位字节在后存放在变量A1和A2中,求它们的和与差,并将结果放在变量SUM和DEF中
源程序:
DATASSEGMENT
A1DB19H,32H,54H,76H,98H
A2DB91H,78H,56H,34H,12H
SUMDB6DUP(?
)
DEFDB6DUP(?
)
DATASENDS
STACKSSEGMENT
STACKSENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS,SS:
STACKS
START:
MOVAX,DATAS
MOVDS,AX
LEASI,A1
LEADI,A2
LEABX,SUM
MOVCX,5
CLC
AGAIN1:
MOVAL,[SI]
ADCAL,[DI]
DAA
MOV[BX],AL
INCBX
INCSI
INCDI
LOOPAGAIN1
LEASI,A1
LEADI,A2
LEABX,DEF
MOVCX,5
CLC
AGAIN2:
MOVAL,[SI]
SBBAL,[DI]
DAS
MOV[BX],AL
INCBX
INCSI
INCDI
LOOPAGAIN2
MOVAH,4CH
INT21H
CODESENDS
ENDSTART