微机原理第四章余春暄答案微机原理作业与答案第四章.docx
《微机原理第四章余春暄答案微机原理作业与答案第四章.docx》由会员分享,可在线阅读,更多相关《微机原理第四章余春暄答案微机原理作业与答案第四章.docx(14页珍藏版)》请在冰点文库上搜索。
微机原理第四章余春暄答案微机原理作业与答案第四章
微机原理第四章余春暄答案【微机原理作业与答案第四章】
第四章汇编语言程序设计
4-2下列程序执行后,寄存器AX,BX,CX的内容分别是多少?
ORG0202H
DA_WORDDW20H
MOVAX,DA_WORD;(AX)=0020H
MOVBX,OFFSETDA_WORD;(BX)=0202H(BX)=0,这是
MOVCL,BYTEPTRDA_WORD;(CL)=20H(因PTR,则字的第
一字节)
MOVCH,TYPEDA_WORD;(CH)=2(变量类型数值)
;(CX)=0220H
4-4试编制一程序(不是程序段),把CHAR1中各小写字母分
别转换为对应的大写字母,并存放在CHAR2开始的单元中
DDD0SEGMENT
CHAR1DB‘abcdef’
NEQU$-CHAR1;变量必须先定义后使用,而不能
相反
CHAR2DBNDUP(0);不能把此句与上一句对调DDD0ENDS
STACKSEGMENTSTACK
DB200DUP(0)
STACKENDS;P126(代码段和堆栈段是不可少的)
CSEGSEGMENTASSUMECS:
CSEG,DS:
DDD0,SS:
STACKSTART:
MOVAX,DDD0
MOVDS,AX;MOVDX,AX?
?
?
MOVES,AX;只要SI,DI都用
MOVSI,0;LEASI,CHAR1
MOVDI,0;LEADI,CHAR2
MOVCX,N
AGAIN:
MOVAL,CHAR1[SI];MOVAL,[SI]
SUBAL,20H
MOVCHAR2[DI],AL;MOV[DI],AL
MOVDL,AL;不是必须的,但做实验是有用的。
MOVAH,2
INT21H
INCSI
INCDILOOPAGAINMOVAH,4CHINT21H;不是必须的CSEGENDSENDSTART
第二种方法:
DDD0SEGMENT
CHAR1DB‘abcdef’
NEQU$-CHAR1
CHAR2DBNDUP(0)DDD0ENDS
STACKSEGMENTSTACK
DB200DUP(0)
STACKENDS;P126(代码段和堆栈段是不可少的)
CSEGSEGMENT
ASSUMECS:
CSEG,DS:
DDD0,SS:
STACK
START:
MOVAX,DDD0
MOVDS,AX
MOVES,AX
LEASI,CHAR1
LEADI,CHAR2
MOVCX,N
CLD;不写(隐含)也是0(递增)但不能STD
AGAIN:
LODSB;执行一次,隐含修改SI
SUBAL,32
stosb;MOV[DI],AL;执行一次,隐含修改DI
nop;INCDI
LOOPAGAIN;LOOP指令只修改CX,不管SI,DI
MOVAH,4CH
INT21H;不是必须的
CSEGENDS
ENDSTART
4-6在BUF地址处起,存放有100个字节的字符串,设其中有一个以上的“A”字符,编程查找出第一个“A”字符相对起始地址的距离,并将其存入LEN单元。
方法1DDD0SEGMENTBUFDB‘qasdA%^9F26HsdfhA$#12345678’
DB‘DFGH234546JII2334JI5467OPPAVG’
DB‘ASDFG45667RTY’;必须写实际的
LENDW?
;为变量LEN保留一个字DDD0ENDS
STACKSEGMENTSTACK
DB200DUP(0)
STACKENDS
CSEGSEGMENT
ASSUMECS:
CSEG,DS:
DDD0,SS:
STACK
START:
MOVAX,DDD0
MOVDS,AX
MOVES,AX
MOVCX,100
LEADI,BUF;MOVDI,OFFSETBUF
MOVAL,‘A’
REPNESCASB
DECDI;不必判断是否找到,一定找到
MOVLEN,DI;MOVBX,OFFSETLENMOV[BX],DI
MOVAH,4CH
INT21H
CSEGENDS
ENDSTART
4-8某程序设置的数据区如下所示,画出该数据段内容在内存中的存放形式(要
用十六进制补码表示,按字节组织)DATASEGMENTDB1DB12H,34H,0,56HDW1DW78H,90H,0AB46H,1234H0004HDW1ADR1DWDB1ADR2DWDW1AAADW$-DB1BUFDB5DUP(0)DATAENDS
000CHADR1
000EHADR20010HAAA
0012HBUF
0000HDB1
4-10以BUF1和BUF2开头的2个字符串,其长度均为LEN,试编程实现:
(1)DDD0SEGMENT
BUF1DB‘QWE233459JKGHGFHGF’
BUF2DB‘ASD33459JKGHGFHGFI’
LENEQULENGTHBUF2;DB$-BUF2DDD0ENDS
STACKSEGMENTSTACK
DB200DUP(0)
STACKENDS
CSEGSEGMENT
ASSUMECS:
CSEG,DS:
DDD0,SS:
STACKSTART:
CLD
MOVAX,DDD0
MOVDS,AX
MOVES,AX
MOVCX,LEN
LEASI,BUF1;MOVSI,OFFSETBUF1
LEADI,BUF2;MOVDI,OFFSETBUF2
REPMOVSB
CSEGENDS
ENDSTART
(2)
DDD0SEGMENTBUF1DB‘QWE233459JKGHGFHGF’
LENEQULENGTHBUF1DDD0ENDS
STACKSEGMENTSTACK
DB200DUP(0)
STACKENDS
CSEGSEGMENT
ASSUMECS:
CSEG,DS:
DDD0,SS:
STACK
START:
CLD
MOVAX,DDD0
MOVDS,AX
MOVCX,LEN
MOVAL,0
LEADI,BUF1;MOVDI,OFFSETBUF1
LLL:
STOSB
DECCX
JNZLLLCSEGENDS
ENDSTART
第二种做法:
DSEGMENT
BUF1DB‘QWE233459JKGHGFHGF’
BUF2DB‘ASD33459JKGHGFHGFI’
DENDS
STACKSEGMENTSTACK
DB200DUP(0)
STACKENDS
CSEGSEGMENT
ASSUMECS:
CSEG,DS:
D,SS:
STACK
BG:
MOVAX,D
MOVDS,AX
MOVES,AX
LEASI,BUF1
LEADI,BUF2
MOVCX,LEN
NEXT:
MOVAL,[SI]
MOV[DI],AL
MOV[SI],00H
INCSI
INCDI
LOOPNEXT
MOVAH,4CH
INT21H
CSEGENDS
ENDBG
4-14`试编写一程序,找出BUF数据区中带符号数的最大数和最小数,把最大数放到BH单元,把最小数放到BL单元。
DDD0SEGMENTBUFDB5,90,-45,100,99,„„„,-12
NEQU$-BUF
DDD0ENDS
STACKSEGMENTSTACK
DB200DUP(0)
STACKENDS
CSEGSEGMENT
ASSUMECS:
CSEG,DS:
DDD0,SS:
STACK
START:
MOVAX,DDD0
MOVDS,AX
MOVCX,N-1
MOVSI,0
MOVBH,BUF[SI]
MOVBL,BUF[SI]
AGAIN:
INCSI
CMPBH,BUF[SI]
JGENEXT;JAENEXT错(无符号数)
MOVBH,BUF[SI]
LOOPAGAIN
JMPSTOP
NEXT:
CMPBL,BUF[SI]
JLEABC
MOVBL,BUF[SI]
ABC:
LOOPAGAIN
STOP:
MOVAH,4CH
INT21H
CSEGENDS
ENDSTART
4-16若AL中的内容为2位压缩的BCD数68H,试编程:
(1)
将其拆开成非压缩的BCD数,高低位分别存入BH和BL中。
(2)将上述要求的2位BCD码变换成对应的ASCII码,并且存入CH和CL中。
(1)
STACKSEGMENTSTACK
DB200DUP(0)
STACKENDS
CSEGSEGMENT
ASSUMECS:
CSEG,SS:
STACK
START:
MOVBL,AL;而不是AX
ANDBL,0FH
MOVBH,AL
ANDBH,0F0H
MOVCL,4
SHRBH,CL(逻辑右移)
CSEGENDS
ENDSTART
(2)
STACKSEGMENTSTACK
DB200DUP(0)
STACKENDS
CSEGSEGMENT
ASSUMECS:
CSEG,SS:
STACK
START:
ADDBL,30H
MOVCL,BL
ADDBH,30H
MOVCH,BH
ENDS
STACKSEGMENTSTACK
DB200DUP(0)
STACKENDS
CSEGSEGMENT
ASSUMECS:
CSEG,SS:
STACK
START:
MOVBL,AL
ANDBL,0FH;(BL)是低位非压缩的BCD码
MOVDL,BL
ADDDL,30H;(DL)是低位ASCII码
MOVBH,AL;(BH)将是高位非压缩的BCD码ANDBH,0F0H
MOVCL,4
SHRBH,CL;(BH)是高位非压缩的BCD码
MOVCH,BH
ADDCH,30H;(CH)是高位ASCII码
MOVCL,DL;(CL)是低位ASCII码
CSEGENDS
4-18试用子程序结构编写一程序:
从键盘输入一个2位十
进制的月份数(01~12),然后显示出相应的英文缩写名。
提示:
根据题目要求实现的功能,可编写用一个主程序MAIN分别调用几个子程序。
(1)INPUT从键盘接收一个2位数,并把它转换为对应的
二进制数。
(2)LOCATE把输入的月份数与其英文缩写名(如JAN,
FEB,MAR,APP,MAY,JUN等)对应起来,制成一个字
符表以便查找。
(3)DISPLAY将找到的缩写字母在屏幕上显示出来,显
示可用DOS所提供的显示功能(INT21H的09号功能)。
DDD0SEGMENT
D1DB"Pleaseinputmonthfromthe
keyboad",0DH,0AH,"$"
D2DB3,?
3DUP(?
)ENDSTART
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,"$"
DDD0ENDS
STACKSEGMENTSTACK
DB200DUP(0)
STACKENDS
CSEGSEGMENTASSUMECS:
CSEG,DS:
DDD0,SS:
STACKSTART:
CLD
MOVAX,DDD0
MOVDS,AX
CALLINPUT
CALLLOCATE
CALLDISPLAY
MOVAH,4CH
INT21H
CSEGENDS;不可少
ENDSTART
INPUTPROCNEAR
LEADX,D1;将D1表示的相对地址送DX
MOVAH,9
INT21H;显示‘Pleaseinputmonthfromthekeyboad’并换行
ww2:
LEADX,D2;输入月份
MOVAH,0AH
INT21H
LEADI,D2;将D2表示的相对地址送DI
CMPbyteptr[DI+1],2JNEww2;输入的如果不是二位数,是错误,重新输入
MOVAH,[DI+2];输入的月份高字节(十位数)
MOVAL,[DI+3];输入的月份低字节(个位数)
XORAX,3030H;将ASCII码变成BCD码
MOVBX,AX
MOVAL,BH
movdl,0ah
MULdl;变成二进制数
MOVBH,AL
MOVAL,BL;输入的月份低字节(个位数)
ADDAL,BH
RET
INPUTENDP
LOCATEPROCNEAR
DECAL;
CMPAL,0CH
JNCERROR;≥12(原13),输入错误
MOVBL,06H
MULBL
MOVAH,0
MOVSI,Ax;AX里放的是月份-1
MOVDX,wordptrMONTH0[SI];制成一个字符表以便查找。
ret
ERROR:
LEADX,D3;将D3表示的相对地址送DXRET
LOCATEENDP
DISPLAYPROCNEAR
MOVAH,09H;将找到的缩写字母在屏幕上显示出来
INT21H
RET
DISPLAYENDP
CSEGENDS
ENDSTART
关于串操作指令与循环指令的说明:
1.串操作指令MOVSB/MOVSW、CMPSB/CMPSW、
SCASB/SCASW、LODSB/LODSW、STOSB/STOSW每执行一次,指针(SI、DI)都自动±1或±2,但这条指令不管计数器CX的修改。
2.串操作指令的重复前缀REP(无条件重复)、
REPE/REPZ(当相等/为0时重复)、REPNE/REPNZ(当不相等/不为0时重复),每重复一次,计数器CX自动减1/减2。
3.循环指令LOOP(循环)、LOOPE/LOOPZ(等于/结果为0循环)、LOOPNE/LOOPNZ(不等于/结果不为0循环):
每循环一次,计数器CX都自动减1,并且,CX
为0时退出循环的一个条件。
但这些指令不管数据指针(SI、DI)的修改。
注意:
第三章作业和第四章作业的要求区别:
第三章作业是编写程序段,不必按段结构写;
第四章作业是编写程序,必须按段结构写
有的同学的作业太潦草.