汇编语言习题课•1.请写出下列指令单独执行后,有关寄存器及存储单元的内容。•假设指令执行前(DS)=(ES)=3000H,(AX)=2000H,(BX)=1200H,(SI)=2,(31200H)=2400H,(31202H)=90F7H•(1)ADDES:[BX],900H•(2)MULWORDPTR[BX+SI]•(31200H)=2D00H•(DX)=121EH,(AX)=0E000H•假设(DS)=2000H,(ES)=3000H,(SS)=4000H,(SP)=100H,(BX)=200H,(SI)=1,•(D1)=2,(BP)=256,字变量ARRAY偏移地址为0050H,(20250H)=1234H,(40100H)=00AOH,(40102H)=2200H.填空回答下列问题。•(1)MOVAx,[BP][DI];源操作数物理地址=H•指令执行后(AX)=H•(2)POPAx;源操作数物理地址=H•指令执行后(AX)=H•(3)PUSHEs:[BX];源操作数有效地址=H•(4)LEADI,ARRAY;源字段的寻址方式是-•指令执行后(DI)=H•(5)JMP[BX];指令执行后(IP)=H•(6)ADDAL,BYTEPTRARRAY[BX];源字段的寻址方式是=•指令执行后(AL)=H•(1)401022200•(2)4010000AO•(3)200•(4)直接寻址方式0050•(5)200•(6)寄存器相对寻址方式34•已有AX=E896H,BX=3976H,若执行ADDBX,AX指令,则结果BX,AX,标志位CF,OF,ZF各为何值BX=220CHAX=E896HCF=1(1分)OF=0ZF=0•有变量定义的伪指令如下:•NUMSDW18DUP(4DUP(5),23)•VARDB'HOWAREYOU!',0DH,0AH•试问:NUMS、VAR变量各分配了多少存储字节?NUMS分配了180个字节(3分)VAR分配了15个字节•、已有MOVAL,INF[BP+SI]与MOVAL,ES:INF[BP+SI]两条指令,试问:其源操作数采用何种寻址方式?是字或是字节操作?两条指令有何区别?源操作采用基址+变址寻址方式(2分)是字节操作MOVAL,INF[BP+SI]—访问的是堆栈段MOVAL,ES:INF[BP+SI]—访问的是附加段,实现了段超越•判断下列指令是否有误,若有错,说明原因并予以改正。•(1)ADCAX,0ABH•(2)OUT3EBH,AX•(3)DECWORDPTR[BP]•(4)MOVBX,[AX]•1)无误•(2)有错•端口地址大于8位,用DX间接寻址•MOVDX,3EBH•OUTDX,AX•(3)无误•(4)错•AX不能间接寻址,可改为MOVBX,[SI]•用一条指令完成:将CX中间8位取反,其余位不变。XORCX,0FF0H•判断下列指令是否有误,若有错,说明原因并予以改正。•(1)SUBDX,12H•(2)OUT20H,BX•(3)INCWORDPTR[SI]•(4)MOVSI,[DX](1)无误(2)有错源寄存器必须是累加器OUT20H,AX(3)无误(4)错DX不能间接寻址,可改为MOVSI,[BX]•分析以下程序段•MOVDX,1234H•MOVBX,5678H•MOVAL,BL•ADDAL,DL•DAA•MOVCL,AL•MOVAL,BH•ADCAL,DH•DAA•MOVCH,AL•(1)简要说明上述程序段的主要功能;•(2)当程序执行后,CX寄存器的内容是多少?•ADDAL,DL;低位字节相加•DAA;十进制调整•MOVCL,AL;低位和到CL•MOVAL,BH•ADCAL,DH;高位字节相加•DAA;调整•MOVCH,AL;高位和到CH•(1)对两个组合BCD数相加,和放在CX中•(2)程序执行完后,CX=6912H•指出下列程序的功能,并将有分号(;)的语句加上简要注解•BUFDB100DUP(?)•MOVBX,OFFSETBUF;______•MOVCL,64H•LP:MOVBYTEPTR[BX],0;____•INCBX•DECCL;______•JNZLP•数据段中有以下定义:•ARRAY1EQU16H•ARRAY2DW16H•请指出下面两条指令的寻址方式:•MOVAX,ARRAY1;寻址方式:•MOVAX,ARRAY2;寻址地址:•阅读程序,并写出结果•1、MOVAL,05H•MOVBX,1050H•XORAX,AX•ADDAL,BL•执行结果;AX=_________,CF=_________。•2、MOVBL,15H•MOVAL,BL•MOVCL,2•SALAL,CL•ADDAL,BL•执行结果:AL=_________,CF=__________。1、AX=0050HCF=02、AL=69HCF=0•有如下程序段,•DATASEGMENT•X1DB0FAH•X2DB0FCH•DATAENDS•CODESEGMENT•……•MOVAL,X1•ADDAL,X2•……•CODEENDS•END•问:ADD指令执行完后标志寄存器中的哪些位受到影响?•OFDFIFTFSFZFAFPFCF•若STR是字符串的首地址,指出下列程序的功能,并将语句加上注解。•LEABX,STR•MOVCX,20•LP:CMP[BX],‘&’•JNZNEXT•MOV[BX],‘$’•NEXT:INCBX•LOOPLP•HLT•程序功能:将字符串STR(长度20字节)中所有‘&’用‘$’代替。•LEABX,STR;置地址指针•MOVCX,20;置计数器初值•LP:CMP[BX],‘&’;取字符与‘&’比较•JNZNEXT;不是‘&’转NEXT•MOV[BX],‘$’;是‘&’则用‘$’替换•NEXT:INCBX;地址加1•LOOPLP;CX-1不为0继续•HLT•分析下列程序,回答问题。•…•MOVAH,1•INT21H•CMPAL,‘Y’•JENO•CMPAL,‘y’•JENO•MOVDL,0•JMPEXIT•NO:MOVDL,1•EXIT:MOVAH,4CH•INT21H•…•.画出此段程序流程图。•.这段程序完成什么功能?从键盘上输入一个字符且与‘Y’或‘y’相比较,若相同则DL←1,不相同DL←0。•源程序如下:(5分)•MOVAX,SEGTABLE;TABLE为表头•MOVES,AX•MOVDI,OFFSETTABLE•MOVAL,‘0’•MOVCX,100•CLD•REPNESCASB•问:1)该段程序完成什么功能?•2)该段程序执行完毕之后,ZF和CX有几种可能的数值?各代表什么含义?•从目的串中查找是否包含字符‘0’,若找到则停止,否则继续重复搜索。•ZF=1,说明已找到字符•ZF=0,说明未找到字符•CX0,说明中途已找到字符退出•CX=0,且ZF=0说明串中无字符‘0’•下列程序段要求在100个带符号数中找出其中最大的一个数。设该数据区首址的偏移地址=2000H,最后要求将最大值存入偏移地址=2100H的单元中,试填空完成该程序。(6分)•MOVBX,________•MOVAX,[BX]•MOVCX,________•LOP1:INCBX•CMPAL,[BX]•_____LOP2•MOVAL,_______•LOP2:LOOP______•MOV______,AL•MOVBX,2000H•MOVAX,[BX]•MOVCX,100•LOP1:INCBX•CMPAL,[BX]•JNGLOP2•MOVAL,[BX]•LOP2:LOOPLOP1•MOV[2100H],AL•阅读下列程序并回答问题:•DSEGSEGMENT•ARRAYDW100DUP(?)•DSEGENDS•;·........................................•CSEGSEGMENT•MAINPROCFAR•ASSUMECS:CSEG,DS:DSEG,ES:DSEG•START:•MOVAX,DSEG•MOVDS,AX•MOVES,AX•MOVCX,100•MOVAX,2020H•LEAD1,ARRAY•CLD•REPSTOSW•MOVAX,4C00H•INT21H•MAINENDP•CSEGENDS•ENDSTART•(1)该程序完成什么功能?•(2)程序执行后,DS:0000字节单元中的内容是什么?ES:0000字节单元中的内容又是什么?•将ARRAY数组中的单元都填人空格符(20H)。•2.(DS:0)=20H,(ES:0)=20H•编写程序段,实现从数据段以BUF为首地址的字符串中寻找‘A’字符,将它们的偏移地址依次存放于ADDS为首地址的存储区内,并统计‘A’的个数,存放于NUM单元中,该字符串以‘$’结尾(‘$’=24H)。•BUFDB‘…………’,‘$’•COUNTEQU$-BUF•ADDSDWCOUNTDUP(?)•NUMDW?•……•LEABX,BUF•LEASI,ADDS•MOVCX,0•L1:MOVAL,[BX]•CMPAL,41H;‘A’•JNZL2•MOV[SI],BX•INCCX•ADDSI,2•L2:INCBX•CMPAL,24H;‘$’•JNZL1•MOVNUM,CX•HLT•编程.(可仅用指令性语句编写)•在数据段DS中的一个数据块STRING由大小写英文字母、数字、其他符号组成,长度为COUNT。将其传送到同一段中STRING1为首地址的内存区,并将英文中大写字母转换成小写英文字母,其余不变。•提示:’A’的ASCII码是41H,‘a’的ASCII码是61H。•LEASI,STRING•LEADI,STRING1•MOVCX,COUNT•NEXT:MOVAL,[SI]•CMPAL,41H•JBGO•CMPAL,5AH•JAGO•ADDAL,20H•GO:MOV[DI],AL•INCSI•INCDI•LOOPNEXT•根据从外设端口71H输入的内容M,判断M的取值情况,并分别处理如下:若M10,则向73H端口送0H;若M20,则向73H端口送0FFH;若10≤M≤20,向73H端口送88H。要求编写程序片段并画出流程框图。•START:INAL,71H•CLC•CMPAL,10)•JCLP1•CMPAL,20•JCLP2•MOVBL,0FFH•JMPLP3•LP1:MOVBL,00•JMPLP3•LP2:MOVBL,80H•LP3:MOVAL,BL•OUT73H,AL开始从71H端口读数据清除CFAL10?BL=88HBL=00H向73H口输出BL=0FFHAL20?NYYN•下面程序是将10个8位无符号数按递减次序排序,请将程序填写完整。•DATASEGMENT•ARRAYDB05H,78H,FFH,7BH,00H•DB8CH,20H,A0H,F0H,60H•DATAENDS•CODESEGMENT•ASSUMECS:CODE,DS:DATA•MAINPROCFAR•START:PUSHDS•XORAX,AX•PUSHAX•MOVAX,DATA•MOVDS,AX•AB1:MOVSI,OFFSETARRAY•MOVBL,0•MOVCX,10••AGAIN:MOVAL,[SI]•INCSI•CMPAL,[SI]•CD1•MOVAH,[SI]•MOV[SI],AL•DECSI•MOV[SI],AH•INCSI•MOVBX,1•CD1:LOOPAGAIN•DECBL•AB1•RET•MAINENDP•CODEENDS•ENDSTART•在数据段中,从2000H单元开始存放了50个8位字符,试编程序,求出其中’A’的个数,并将结果送入NUM单元中。•STACKSEGMENTSTACK•DB20DUP(?)•STACKENDS•DATASEGMENT•NUMDB?•DATAENDS•CODESEGMENT•ASSUMECS:CODE,DS:DATA•START:MOVSI,2000H•MOVCX,50•MOVBL,00H•A1:MOVAL