微型计算机原理及应用.docx
- 文档编号:9693208
- 上传时间:2023-05-20
- 格式:DOCX
- 页数:31
- 大小:39.81KB
微型计算机原理及应用.docx
《微型计算机原理及应用.docx》由会员分享,可在线阅读,更多相关《微型计算机原理及应用.docx(31页珍藏版)》请在冰点文库上搜索。
微型计算机原理及应用
第四章 汇编语言程序设计
4-2下列程序执行后,寄存器AX,BX,CX的内容分别是多少?
DSEGMENTAT0202H;定位数据段地址
ORG0202H;定位偏移地址
DA_WORDDW20H
MOVAX,DA_WORD;(AX)=0020H
MOVBX,OFFSETDA_WORD;(BX)=0202H
MOVCL,BYTEPTRDA_WORD;(CL)=20H(将变量DA_WORD的属性改变为字节型)
MOVCH,TYPEDA_WORD;(CH)=2(变量类型数值)
;(CX)=0220H
4-4试编制一程序,把CHAR1中各小写字母分别转换为对应的大写字母,并存放在CHAR2开始的单元中(题目要求:
不改变CHAR1的内容)
方法1,小写字母转换一个输出显示一个,前3种方法均使用了AL寄存器
DSEGMENT
CHAR1DB"abcdefghijklmnopqrstuvwxyz"
NEQU$-CHAR1;变量必须先定义后使用,而不能相反
CHAR2DBNDUP(0);;不能把此句与上一句对调,CHAR2DB$-CHAR1有
;的同学这样写,错在哪
DENDS
SSEGMENTSTACK
DB200DUP(0)
SENDS
CSEGMENT
ASSUMECS:
C,DS:
D,SS:
S;ASSUME是伪指令,后面不能写冒号
START:
MOVAX,D
MOVDS,AX
;MOVES,AX;只要用到串操作指令且DI
LEASI,CHAR1;MOVSI,OFFSETCHAR1
LEADI,CHAR2;MOVDI,OFFSETCHAR2
MOVCX,N;$-CHAR1,不可以
AGAIN:
MOVAL,[SI]
SUBAL,20H;ANDAL,5FH有的同学是这样实现的
MOV[DI],AL
MOVDL,AL
MOVAH,2
INT21H;从屏幕显示
INCSI
INCDI
LOOPAGAIN
MOVAH,4CH
INT21H;;不是必须的
CENDS
ENDSTART
方法2:
使用通用数据传送指令MOV
DSEGMENT
CHAR1DB‘abcdefghijklmnopqrstuvwxyz’
NEQU$-CHAR1;变量必须先定义后使用,而不能相反
CHAR2DBNDUP(0);不能把此句与上一句对调DENDS
STACKSEGMENTSTACK
DB200DUP(0)
STACKENDS;P126(代码段和堆栈段是不可少的)
CSEGMENT
ASSUMECS:
C,DS:
D,SS:
S
START:
MOVAX,D
MOVDS,AX
MOVES,AX;只要用到串操作指令且DI
MOVSI,0;LEASI,CHAR1
MOVDI,0;LEADI,CHAR2
MOVCX,N
AGAIN:
MOVAL,CHAR1[SI];MOVAL,[SI]
SUBAL,20HMOVCHAR2[DI],AL;MOV[DI],ALINCSI
INCDI
LOOPAGAIN
MOVAH,4CH
INT21H;不是必须的
CENDS
ENDSTART
第3种方法:
使用串的读写指令LODSBSTOSB
DSEGMENT
CHAR1DB‘abcdef’
NEQU$-CHAR1
CHAR2DB$-CHAR1DUP(0)DENDS
STACKSEGMENTSTACK
DB200DUP(0)
STACKENDS;P126(代码段和堆栈段是不可少的)
CSEGMENT
ASSUMECS:
C,DS:
D,SS:
S
START:
MOVAX,D
MOVDS,AX
MOVES,AX
MOVSI,0;LEASI,CHAR1
MOVDI,0;LEADI,CHAR2
MOVCX,N
CLD;不写(隐含)也是0(递增)但不能STD
AGAIN:
LODSB;执行一次,隐含修改SI
SUBAL,32STOSB;MOV[DI],AL;执行一次,隐含修改DIINCDILOOPAGAIN;LOOP指令只修改CX,不管SI,DI
MOVAH,4CH
INT21H;不是必须的
CENDS
ENDSTART
第四种方法2006级,没有显示使用MOVSB指令
DSEGMENT
CHAR1DB"abcdefghijklmnopqrstuvwxyz"
NEQU$-CHAR1
CHAR2DBNDUP(0)
DENDS
SSEGMENTSTACK
DB200DUP(0)
SENDS
CSEGMENT
ASSUMECS:
C,DS:
D,SS:
S
START:
MOVAX,D
MOVDS,AX
MOVES,AX
LEASI,CHAR1
LEADI,CHAR2
MOVCX,N
AGAIN:
MOVSB;SUB[SI],20H
DECDI;MOVSB
SUBBYTEPTR[DI],20H;LOOPADAIN错在哪里?
结果如何?
INCDI
LOOPAGAIN
MOVAH,4CH
INT21H
CENDS
ENDSTART
方法5:
只用一个地址指针SI
DSEGMENT
CHAR1DB"abcdefghijklmnopqrstuvwxyz"
NEQU$-CHAR1
CHAR2DBNDUP(0)
DENDS
SSEGMENTSTACK
DB200DUP(0)
SENDS
CSEGMENT
ASSUMECS:
C,DS:
D,SS:
S
START:
MOVAX,D
MOVDS,AX
MOVES,AX
MOVSI,0
MOVCX,N
AGAIN:
MOVAL,CHAR1[SI];只用一个地址指针,SI[CHAR1]是错误的
SUBAL,20H
MOVCHAR2[SI],AL
INCSI
LOOPAGAIN
int3
MOVAH,4CH
INT21H
CENDS
ENDSTART
有的同学按数据是由键盘录入的来考虑的,也可行,程序中还有不少问题
方法6:
由键盘输入小写字母再转换输出,回车符也占一个字节,输入需要小写转换成大写字母的内容从输入串的第3个元素开始
DSEGMENT
ADB"CHAR1",0DH,0AH,"$"
BDB"CHAR2",0DH,0AH,"$"
CHAR1DB11,?
11DUP(0);准备输入10个小写字母
CHAR2DB10DUP(0)
DENDS
SSEGMENTSTACK
DB200DUP(0)
SENDS
CSEGMENT
ASSUMECS:
C,DS:
D,SS:
S
START:
MOVAX,D
MOVDS,AX
MOVES,AX
MOVDX,OFFSETA
MOVAH,9
INT21H
LEADX,CHAR1
MOVAH,0AH
INT21H;由键盘输入字符串,10个字母(显示),1个回车,共11个字节
LEASI,CHAR1[2]
LEADI,CHAR2
MOVCX,10;需要转换的字符长度为10个字节
AGAIN:
MOVAL,[SI]
SUBAL,20H
MOV[DI],AL
INCSI
INCDI
LOOPAGAIN;将小写字母字符串转换成大写字母字符串
MOVBYTEPTR[DI],0DH
INCDI
MOVBYTEPTR[DI],0AH
INCDI
MOVBYTEPTR[DI],'$';必须指明数据类型
MOVDX,OFFSETCHAR2
MOVAH,9
INT21H;输出'$'结尾的大写字母字符串
int3
MOVAH,4CH
INT21H
CENDS
ENDSTART
4-6在BUF地址处起,存放有100个字节的字符串,设其中有一个以上的“A”字符,编程查找出第一个“A”字符相对起始地址的距离,并将其存入LEN单元。
方法1,经过调试,数据串长N
DSEGMENT
BUFDB'qasdA%^9F26HsdfhA$#12345678'
DB'DFGH234546JII2334JI5467OPPAVG'
DB'ASDFG45667RTY';必须写实际的
NEQU$-BUF;有同学写成NEQUBUF
LENDW0;为变量LEN保留一个字,必须先定义后使用,LENDW?
DENDS
SSEGMENTSTACK;应该将程序写完整
DB200DUP(0)
SENDS
CSEGMENT
ASSUMECS:
C,DS:
D,SS:
S
START:
MOVAX,D
MOVDS,AX
MOVES,AX;这条指令是必须的
MOVCX,N
LEADI,BUF;MOVDI,OFFSETBUF
MOVAL,41H;MOVAL,‘A’
REPNESCASB;有的同学用的比较指令
DECDI;不必判断是否找到,一定找到
MOVLEN,DI;MOVLEN,[DI]错在哪里?
MOVLEN,[DI-1]或MOVLEN,BYTEPTR[DI]错在哪里,MOVLEN,OFFSETBUF[DI-1]对不对或LEALEN,BUF[DI-1]
MOVAH,4CH
INT21H
CENDS
ENDSTART
4-8某程序设置的数据区如下所示,画出该数据段内容在内存中的存放形式(要用十六进制补码表示,按字节组织)
DATASEGMENT
DB1DB12H,34H,0,56H
DW1DW78H,90H,0AB46H,1234H
ADR1DWDB1;取变量DB1的偏移地址
ADR2DWDW1;;取变量DW1的偏移地址
AAADW$-DB1;计算当前变量到DB1变量的字节数
BUFDB5DUP(0)
DATAENDS
有的同学认为0AB46H是负数,并取了它的补码
2
4-10以BUF1和BUF2开头的2个字符串,其长度均为LEN,试编程实现:
(1)将BUF1开头的字符串送到BUF2开始的内存空间。
(2)将BUF1开始的内存空间全部清零。
经过调试的:
方法1:
数据段与附加段重叠,利用MOVSB指令实现数据传的复制
DSEGMENT
D1DB'BUF1QWE233459JKGHGFHGF';看清题目要求,写出实际内容对存储器初始化,分配内存空间,不能偷懒
LENDB$-D1;有同学写成NEQULEN
D2DB'BUF2ASD33459JKGHGFHGFI';长度与D1相同
DENDS
SSEGMENTSTACK
DB200DUP(0)
SENDS
CSEGMENT
ASSUMECS:
C,DS:
D,SS:
S
STAR:
MOVAX,D
MOVDS,AX
MOVES,AX;附加段与数据段重叠,是允许的
LEASI,D1
LEADI,D2
MOVCX,LEN
REPMOVSB
LEADI,D1
MOVCX,LEN;这条语句不能少
MOVAL,00H;MOVAX,0错在哪
REPSTOSB
MOVAH,4CH
INT21H
CENDS
ENDSTAR
经过调试的:
方法2;数据段与附加段分开,串读一个写一个实现数据的传送,再利用串写指令使指定存储区清零
DSEGMENT
D1DB'BUF1qasdA%^9F26HsdfhA$#12345678'
LENEQU$-D1
DENDS
ESEGMENT
D2DB"BUF2abcdefghijklmnopqrstuvwxyz0";必须写实际的,
;与D1长度相同
EENDS
SSEGMENTSTACK
DB200DUP(0)
SENDS
CSEGMENT
ASSUMECS:
C,DS:
D,SS:
S
START:
MOVAX,D
MOVDS,AX
MOVAX,E
MOVES,AX
MOVCX,N
LEASI,D1;MOVSI,OFFSETD1
LEADI,D2
LP:
LODSB
STOSB
LOOPLP;LOOP只是使CX减1,不改变SIDI
LEADI,D1
MOVCX,N;这条语句不能少
MOVAL,00H
REPSTOSB
MOVAH,4CH
INT21H
CENDS
ENDSTART
第3种做法:
传送一个字节清零一个字节,再向下一个字节进行
DSEGMENT
D1DB'BUF1QWE233459JKGHGFHGF';看清题目要求,写出实际内容对存储器初始化,分配内存空间,不能偷懒
LENDB$-D1
D2DB'BUF2ASD33459JKGHGFHGFI';长度与D1相同
DENDS
SSEGMENTSTACK
DB200DUP(0)
SENDS
CSEGMENT
ASSUMECS:
C,DS:
D,SS:
S
STAR:
MOVAX,D
MOVDS,AX
MOVES,AX
LEASI,D1
LEADI,D2
MOVCX,LEN
NEXT:
MOVAL,[SI]
MOV[DI],AL
MOV[SI],00H
INCSI
INCDI
LOOPNEXT
MOVAH,4CH
INT21H
CSEGENDS
ENDSTAR
方法4;4-10-4从键盘输入初值,并显示
DSEGMENT
BUF1DB101,?
101DUP(0)
BUF2DB100DUP(0)
BUF3DB100DUP(0)
ADB'BUF1',0DH,0AH,'$'
BDB'BUF2',0DH,0AH,'$'
DENDS
SSEGMENTSTACK
DB200DUP(0)
SENDS
CSEGMENT
ASSUMECS:
C,DS:
D,SS:
S
START:
MOVAX,D
MOVDS,AX
MOVES,AX
MOVDX,OFFSETA
MOVAH,9
INT21H;输出显示'BUF1'
MOVDX,OFFSETBUF1
MOVAH,0AH
INT21H;键盘输入字符串
MOVCL,[BUF1+1];实际输入的字符串长度送CL,取相应单元的内容不需加方括号
MOVCH,0
PUSHCX
CLD
LEASI,BUF1+2
LEADI,BUF2
REPMOVSB;将输入的字符串传送到BUF2
MOVBYTEPTR[DI],0DH
INCDI
MOVBYTEPTR[DI],0AH
INCDI
MOVBYTEPTR[DI],'$';在BUF2末尾输入回车换行和‘$'
MOVSI,OFFSETBUF3
MOVDI,OFFSETBUF1+2;取变量的偏移地址,不能加方括号
POPCX
REPMOVSB;用BUF3替换BUF1
MOVBYTEPTR[DI],0DH
INCDI
MOVBYTEPTR[DI],0AH
INCDI
MOVBYTEPTR[DI],'$';在BUF1末尾输入回车换行和‘$'
MOVDX,OFFSETA
MOVAH,9
INT21H;输出显示’BUF1'
MOVDX,OFFSETBUF1+2
MOVAH,9
INT21H;输出空格,因为BUF1已经清零了
MOVDX,OFFSETB
MOVAH,9
INT21H;输出显示’BUF2'
MOVDX,OFFSETBUF2
MOVAH,9
INT21H;输出BUF2,即键盘输入的内容
MOVAH,4CH
INT21H
CENDS
ENDSTART
4-14试编写一程序,找出BUF数据区中带符号数的最大数和最小数,把最大数放到BH单元,把最小数放到BL单元。
DSEGMENT
BUF DB5,90,-45,100,99,………,-12
NEQU$-BUF
DENDS
STACKSEGMENTSTACK
DB200DUP(0)
STACKENDS
CSEGMENT
ASSUMECS:
C,DS:
D,SS:
S
START:
MOVAX,D
MOVDS,AX
MOVCX,N-1
MOVSI,0
MOVBH,BUF[SI]
MOVBL,BUF[SI]
AGAIN:
INCSI
CMPBH,BUF[SI]
JGENEXT;JAENEXT错(无符号数)
MOVBH,BUF[SI]
ABC:
LOOPAGAIN;这句不要也行
NEXT:
CMPBL,BUF[SI]
JLEABC
MOVBL,BUF[SI]
LOOPAGAINCENDS
ENDSTART
4-16若AL中的内容为2位压缩的BCD数68H,试编程:
(1)将其拆开成非压缩的BCD数,高低位分别存入BH和BL中。
(2)将上述要求的2位BCD码变换成对应的ASCII码,并且存入CH和CL中。
方法1,经过调试的
DSEGMENT
D1DB1,2,3
DENDS
SSEGMENTSTACK
DB10DUP(?
)
SENDS
CSEGMENT
ASSUMECS:
C,SS:
S,DS:
D
STAR:
MOVAX,D
MOVDS,AX
MOVAL,68H
MOVBH,AL
ANDAL,0FH
MOVBL,AL;(BL)是低位非压缩的BCD码
ANDBH,0F0H;(BH)将是高位非压缩的BCD码
MOVCL,4
SHRBH,CL;(BH)是高位非压缩的BCD码
MOVCL,BL
ADDCL,30H;(CL)是低位ASCII码
MOVCH,BH
ADDCH,30H;(CH)是高位ASCII码
MOVAH,4CH
INT21H
CENDS
ENDSTAR
方法2
DSEGMENT
D1DB1,2,3
DENDS
SSEGMENTSTACK
DB10DUP(?
)
SENDS
CSEGMENT
ASSUMECS:
C,SS:
S,DS:
D
STAR:
MOVAX,D
MOVDS,AX
MOVSI,OFFSETD1
MOVDL,68H
MOVAL,68H
ANDAL,0FH
MULBYTEPTR[SI]
AAM;乘法的ASCII码调整指令,P99
MOVBL,AL
MOVBH,DL
ANDBH,0F0H
MOVCL,4
SHRBH,CL
MOVAL,BH
MULBYTEPTR[SI]
AAM
MOVBH,AL
MOVCL,BL
ADDCL,30H
MOVCH,BH
ADDCH,30H
CENDS
ENDSTAR
4-18试用子程序结构编写一程序:
从键盘输入一个2位十进制的月份数(01~12),然后显示出相应的英文缩写名。
提示:
根据题目要求实现的功能,可编写用一个主程序MAIN分别调用几个子程序。
(1)INPUT从键盘接收一个2位数,并把它转换为对应的二进制数。
(2)LOCATE把输入的月份数与其英文缩写名(如JAN,FEB,MAR,APP,MAY,JUN等)对应起来,制成一个字符表以便查找。
(3)DISPLAY将找到的缩写字母在屏幕上显示出来,显示可用DOS所提供的显示功能(INT21H的09号功能)。
方法1:
与方法2的不同主要在数据表的制定
DSEGMENT
D1DB"Pleaseinputmonthfromthekeyboad",0DH,0AH,"$"
D2DB3,?
3DUP(?
);分配键盘输入缓冲区,回车符占一个字节,但实际输入的字符数中不包含它,即输入2位数至少需预留3个字节的空间,输入完成后,实际输入的字符数为2
D3DB"ERROR",0DH,0AH,"$"
MONTH0DB"JAN",0DH,0AH,"$"
DB"FEB",0DH,0AH,"$"
DB"MAR",0DH,0AH,"$"
DB"APP",0DH,0AH,"$"
DB"MAY",0DH,0AH,"$"
DB"JUN",0DH,0AH,"$"
DB"JUL",0DH,0AH,"$"
DB"AUG",0DH,0AH,"$"
DB"SEP",0DH,0AH,"$"
DB"OCT",0DH,0AH,"$"
DB"NOV",0DH,0AH,"$"
DB"DEC",0DH,0AH,"$"
DENDS
SSEGMENTSTACK
DB200DUP(0)
SENDS
CSEGMENT
ASSUMECS:
C,DS:
D,SS:
S
START:
CLD
MOVAX,D
MOVDS,AX
CALLINPUT
CALLLOCATE
CALLDISPLAY
MOVAH,4CH
INT21H
INPUTPROCNEAR
LEADX,D1;将D1表示的相对地址送DX
MOVAH,9
INT21H;显示‘Pleaseinputmonthfromthekeyboad’并换行
ww2:
LEADX,D2;输入月份
MOVAH,0AH
INT21H
LEADI,D2;将D2表示的相对地址送DI
CMPbyteptr[DI+1],2
JNEww2;输入的如果不是二位数,是错误
MOVAH,[DI+2];输入的月份高字节(十位数)
MOVAL,[DI+3];输入的月份低字节(个位数)
X
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 微型计算机 原理 应用