1、汇编语言习题课,1请写出下列指令单独执行后,有关寄存器及存储单元的内容。假设指令执行前(DS)=(ES)=3000H, (AX)=2000H, (BX)=1200H, (SI)=2, (31200H)=2400H, (31202H)=90F7H (1)ADD ES:BX,900H (2)MUL WORD PTR 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,
2、(20250H)=1234H,(40100H)=00AOH,(40102H)=2200H填空回答下列问题。(1)MOV Ax,BPDI ;源操作数物理地址= H指令执行后(AX)= H(2)POP Ax ;源操作数物理地址= H指令执行后(AX)= H(3)PUSH Es:BX ;源操作数有效地址= H(4)LEA DI,ARRAY ;源字段的寻址方式是 指令执行后(DI)= H(5)JMP BX ; 指令执行后(IP)= H(6)ADD AL,BYTE PTR ARRAYBX ;源字段的寻址方式是 指令执行后(AL)= H,(1)40102 2200(2)40100 00AO(3)200(4
3、)直接寻址方式 0050(5)200(6)寄存器相对寻址方式 34,已有AX=E896H,BX=3976H,若执行ADD BX,AX指令,则结果BX,AX,标志位CF,OF,ZF各为何值,BX=220CH AX=E896H CF=1 (1分) OF=0 ZF=0,有变量定义的伪指令如下: NUMS DW 18 DUP(4 DUP(5),23) VAR DB HOW ARE YOU !, 0DH, 0AH 试问:NUMS、VAR变量各分配了多少存储字节?,NUMS分配了180个字节 (3分) VAR分配了15个字节,、已有MOV AL,INFBP+SI与MOV AL,ES:INFBP+SI两条指
4、令,试问:其源操作数采用何种寻址方式?是字或是字节操作?两条指令有何区别?,源操作采用基址+变址寻址方式 (2分) 是 字节操作 MOV AL,INFBP+SI访问的是堆栈段 MOV AL,ES:INFBP+SI访问的是附加段,实现了段超越,判断下列指令是否有误,若有错,说明原因并予以改正。(1)ADC AX , 0ABH(2)OUT 3EBH , AX(3)DEC WORD PTR BP(4)MOV BX,AX,1)无误 (2)有错端口地址大于8位,用DX间接寻址MOV DX,3EBH OUT DX,AX(3)无误(4)错AX不能间接寻址,可改为 MOV BX,SI,用一条指令完成:将CX中
5、间8位取反,其余位不变。,XOR CX,0FF0H,判断下列指令是否有误,若有错,说明原因并予以改正。(1)SUB DX , 12H(2)OUT 20H , BX(3)INC WORD PTR SI(4)MOV SI,DX,(1)无误 (2)有错 源寄存器必须是累加器OUT 20H,AX(3)无误 (4)错 DX不能间接寻址,可改为 MOV SI,BX,分析以下程序段 MOV DX , 1234HMOV BX , 5678HMOV AL , BLADD AL , DLDAAMOV CL , ALMOV AL , BHADC AL , DHDAAMOV CH , AL (1)简要说明上述程序段的
6、主要功能; (2)当程序执行后, CX寄存器的内容是多少?,ADD AL,DL ;低位字节相加DAA ;十进制调整MOV CL,AL ;低位和到CLMOV AL,BH ADC AL,DH ;高位字节相加DAA ;调整MOV CH,AL ;高位和到CH(1) 对两个组合BCD数相加,和放在CX中 (2) 程序执行完后,CX6912H,指出下列程序的功能,并将有分号(;)的语句加上简要注解BUF DB 100 DUP(?) MOV BX,OFFSET BUF ;_ MOV CL,64H LP: MOV BYTE PTRBX,0 ;_ INC BX DEC CL ; _ JNZ LP,数据段中有以下
7、定义: ARRAY1 EQU 16H ARRAY2 DW 16H 请指出下面两条指令的寻址方式: MOV AX,ARRAY1;寻址方式: MOV AX,ARRAY2;寻址地址:,阅读程序,并写出结果1、 MOV AL, 05H MOV BX, 1050H XOR AX, AX ADD AL, BL 执行结果; AX=_, CF=_。 2、 MOV BL, 15H MOV AL, BL MOV CL, 2 SAL AL,CL ADD AL,BL 执行结果: AL=_,CF=_。,1、AX=0050H CF=0 2、AL=69H CF=0,有如下程序段, DATA SEGMENT X1 DB 0F
8、AH X2 DB 0FCH DATA ENDS CODE SEGMENT MOV AL,X1 ADD AL,X2 CODE ENDS END 问:ADD 指令执行完后标志寄存器中的哪些位受到影响?OF DF IF TF SF ZF AF PF CF,若STR是字符串的首地址,指出下列程序的功能,并将语句加上注解。 LEA BX,STR MOV CX,20 LP: CMP BX,& JNZ NEXT MOV BX,$ NEXT: INC BX LOOP LP HLT,程序功能:将字符串STR(长度20字节)中所有&用$代替。 LEA BX,STR ;置地址指针 MOV CX,20 ;置计数器初值
9、 LP: CMP BX,& ;取字符与&比较 JNZ NEXT ;不是&转NEXT MOV BX,$ ;是&则用$替换 NEXT: INC BX ;地址加1 LOOP LP ;CX-1不为0继续 HLT,分析下列程序,回答问题。MOV AH,1INT 21HCMP AL,YJE NOCMP AL,yJE NOMOV DL,0JMP EXITNO:MOV DL,1EXIT:MOV AH,4CHINT 21H.画出此段程序流程图。.这段程序完成什么功能?,从键盘上输入一个字符且与Y或y相比较,若相同则DL1,不相同DL0。,源程序如下:(5分)MOV AX, SEG TABLE ;TABLE为表头
10、 MOV ES, AX MOV DI, OFFSET TABLE MOV AL, 0 MOV CX, 100 CLD REPNE SCASB 问:1) 该段程序完成什么功能?2) 该段程序执行完毕之后,ZF和CX有几种可能的数值?各代表什么含义?,从目的串中查找是否包含字符 0,若找到则停止,否则继续重复搜索。 ZF=1, 说明已找到字符ZF=0, 说明未找到字符 CX0,说明中途已找到字符退出 CX=0,且ZF=0说明串中无字符 0,下列程序段要求在 100 个带符号数中找出其中最大的一个数。设该数据区首址的偏移地址=2000H,最后要求将最大值存入偏移地址=2100H 的单元中,试填空完成
11、该程序。(6 分) MOV BX, _ MOV AX, BX MOV CX, _ LOP1: INC BX CMP AL, BX _ LOP2 MOV AL,_ LOP2: LOOP _ MOV _,AL,MOV BX, 2000H MOV AX, BX MOV CX, 100 LOP1:INC BX CMP AL, BX JNG LOP2 MOV AL, BX LOP2:LOOP LOP1 MOV 2100H,AL,阅读下列程序并回答问题:DSEG SEGMENTARRAY DW 100 DUP(?)DSEG ENDS;CSEG SEGMENTMAIN PROC FARASSUME CS:C
12、SEG,DS:DSEG,ES:DSEGSTART:MOV AX,DSEGMOV DS,AXMOV ES,AXMOV CX,100MOV AX,2020HLEA D1,ARRAYCLDREP STOSW MOV AX,4C00HINT 21HMAIN ENDPCSEG ENDSEND START (1)该程序完成什么功能? (2)程序执行后,DS:0000字节单元中的内容是什么?ES:0000字节单元中的内容又是什么?,将ARRAY数组中的单元都填人空格符(20H)。2(DS:0)20H,(ES:0)20H,编写程序段,实现从数据段以BUF为首地址的字符串中寻找A字符,将它们的偏移地址依次存放于
13、ADDS为首地址的存储区内,并统计A的个数,存放于NUM单元中,该字符串以$结尾($24H)。,BUF DB ,$COUNT EQU $-BUFADDS DW COUNT DUP(?)NUM DW ? LEA BX, BUF LEA SI, ADDS MOV CX, 0 L1: MOV AL, BX CMP AL, 41H ;A JNZ L2 MOV SI, BXINC CXADD SI, 2L2: INC BX CMP AL, 24H ;$JNZ L1MOV NUM, CXHLT,编程.(可仅用指令性语句编写) 在数据段DS中的一个数据块STRING由大小写英文字母、数字、其他符号组成,长度
14、为COUNT。将其传送到同一段中STRING1为首地址的内存区,并将英文中大写字母转换成小写英文字母,其余不变。 提示:A的ASCII码是41H,a的ASCII码是61H。,LEA SI, STRINGLEA DI, STRING1MOV CX, COUNTNEXT: MOV AL, SICMP AL, 41HJB GOCMP AL, 5AHJA GOADD AL, 20HGO: MOV DI, ALINC SIINC DILOOP NEXT,根据从外设端口71H输入的内容M,判断M的取值情况,并分别处理如下:若M20,则向73H端口送0FFH;若10M20,向73H端口送88H。要求编写程序
15、片段并画出流程框图。,START:IN AL,71HCLCCMP AL,10 ) JC LP1 CMP AL,20 JC LP2 MOV BL,0FFH JMP LP3 LP1: MOV BL,00JMP LP3 LP2: MOV BL,80H LP3: MOV AL,BL OUT 73H,AL,下面程序是将10个8位无符号数按递减次序排序,请将程序填写完整。 DATA SEGMENT ARRAY DB 05H,78H,FFH,7BH,00HDB 8CH,20H,A0H,F0H,60H DATA ENDS CODE SEGMENTASSUME CS:CODE,DS:DATA MAIN PROC
16、 FAR START:PUSH DSXOR AX,AXPUSH AXMOV AX,DATAMOV DS,AX AB1: MOV SI,OFFSET ARRAYMOV BL,0MOV CX,10 AGAIN:MOV AL,SIINC SICMP AL,SICD1MOV AH,SIMOV SI,ALDEC SIMOV SI,AHINC SIMOV BX,1 CD1:LOOP AGAINDEC BLAB1RET MAIN ENDP CODE ENDSEND START,在数据段中,从2000H 单元开始存放了 50 个 8 位字符,试编程序,求出其中A的个数,并将结果送入NUM 单元中。,STACK
17、 SEGMENT STACK DB 20 DUP(?) STACK ENDS DATA SEGMENT NUM DB ? DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV SI,2000H MOV CX,50 MOV BL,00H A1: MOV AL,SI CMP AL,A; CMP AL,41H JNZ A2 INC BL A2: INC SI LOOP A1 MOV NUM,BL INT 03H CODE ENDS END START,有 1K 个单元的数据放在内存DAT 开始的顺序单元中,试编程将其转移到以NEXT 开始的顺序单元中。 编写程序,将以BLOCK单元开始的100个存储单元清0。要求有段说明和必要的伪指令。,从STRIN单元开始有一字符串,以*作为结束标志(字符串可用*表示)。编程序求字符串的长度,存入COUNT单元。要求段说明和必要的伪指令。,