习题4部分答案 4.1分别指出下列指令中源操作数和目的操作数的寻址方式 (1) MOV EAX,12345678H (2)MOV [ESI],AX (3)MOV 2[EDI], BX (4)MOV 2[BX+SI], DX (5) MOV AX,[10] (6)MOV EAX, 2[ESI*4] (7)MOV EAX, 2[EBX*8][EDI] (8)MOV EAX, [ESI][EBP+OFFFFOH] (9 ) MOV EAX, 2[EDI=*8][EBP+80 目的操作数的寻址 指令 源操作数的寻址方式 方式 (1) MOV EAX,12345678H 寄存器寻址 立即寻址 (2)MOV [ESI, AX 寄存器间接寻址 寄存器寻址 (3)MOV 2[EDI, BX 变址寻址 寄存器寻址 (4)MOV 2[BX+SI], DX 基址变址寻址 寄存器寻址 (5)MoA,[10] 寄存器寻址 直接寻址 (6)MOV EAX, 2[ESI*4] 寄存器寻址 带有比例因子的变址寻址 (7)MOV EAX, 2[EBX*8][EDI 寄存器寻址 带有比例因子的基址变址寻址 MOV 寄存器寻址 带有位移量的基址变址寻址 EAX,ESILEBP+OFFFFOH] (9)MOV EAX,2EDI8JEBP+80 寄存器寻址 带有位移量和比例因子的基址变址寻址 4.2指出下列指令的错误原因 (1)INC [ESI] (2)MOV AX, BL 3)MOV 2, EA 4)MOV AX, [DX] (5)MOV AX, [BX+BP (6)MOV AX, [SI+DI] (7)MOV AH, 300 (8)MOV [ESI], [EDI (9)PUSH AL (10) POP DH (11)MOV CS, AX (12)MOV SS, AX (13)SHL AX, 3 指令 错误原因 (1)INC LESI] 目的操作数[ES门]类型不明确 (2)MOV AX, BL 源操作数和目的操作数类型不一致 (3)MOV 2, EAX 常数不能作目的操作数
习 题 4 部分答案 4.1 分别指出下列指令中源操作数和目的操作数的寻址方式 (1) MOV EAX,12345678H (2) MOV [ESI],AX (3) MOV 2[EDI],BX (4) MOV 2[BX+SI],DX (5) MOV AX,[10] (6) MOV EAX,2[ESI*4] (7) MOV EAX,2[EBX*8][EDI] (8) MOV EAX,[ESI][EBP+0FFFF0H] (9) MOV EAX,2[EDI*8][EBP+80] 解: 指令 目的操作数的寻址 方式 源操作数的寻址方式 (1) MOV EAX,12345678H 寄存器寻址 立即寻址 (2) MOV [ESI],AX 寄存器间接寻址 寄存器寻址 (3) MOV 2[EDI],BX 变址寻址 寄存器寻址 (4) MOV 2[BX+SI],DX 基址变址寻址 寄存器寻址 (5) MOV AX,[10] 寄存器寻址 直接寻址 (6) MOV EAX,2[ESI*4] 寄存器寻址 带有比例因子的变址寻址 (7) MOV EAX,2[EBX*8][EDI] 寄存器寻址 带有比例因子的基址变址寻址 (8) MOV EAX,[ESI][EBP+0FFFF0H] 寄存器寻址 带有位移量的基址变址寻址 (9) MOV EAX,2[EDI*8][EBP+80] 寄存器寻址 带有位移量和比例因子的基址变址寻址 4.2 指出下列指令的错误原因 (1) INC [ESI] (2) MOV AX,BL (3) MOV 2,EAX (4) MOV AX,[DX] (5) MOV AX,[BX+BP] (6) MOV AX,[SI+DI] (7) MOV AH,300 (8) MOV [ESI],[EDI] (9) PUSH AL (10) POP DH (11) MOV CS,AX (12) MOV SS,AX (13) SHL AX,3 解: 指令 错误原因 (1) INC [ESI] 目的操作数[ESI]类型不明确 (2) MOV AX,BL 源操作数和目的操作数类型不一致 (3) MOV 2,EAX 常数不能作目的操作数
(4)MOV AX, [DX] DX不能作地址寄存器 (5)MvAx,[BX+BP]源操作数寻址方式错两个寄存器都是基址寄存器 (6)MVAX,[S1+Dn]源操作数寻址方式错,两个寄存器都是变址寄存器 (7) MOV AH, 300 300超出A允许范围 (8)M[ESI,[EDI]源操作数和目的操作数不能同时为内存单元地址 (9)PUSH AL 入栈的数据必须是一个16或32位数据 (10)POP DH 出栈的数据是一个16或32位数据,DH是8位寄存器 (11)MoV CS, AX CS值不能由程序员编程该变 (12) MOV SS, AX SS值不能由程序员编程该变 (3)SHAX3移位次数大于1,应先将移位次数送CL 43比较下列两条指令,指出它们的区别 MOV EAX, ESI MOV IESILEAX 解:这两条指令的区别是,指令“MOⅤ EAX, ESI”是将内存单元 DS: ESI中的内容读 到CPU中的寄存器EAX;而指令“MOV[ ESILEAX”是将CPU中寄存器EAX中的内容写 入内存单元DS:[ES1 44比较下列两条指令,指出它们的区别 MOⅤAX,[S LEAAX,ISI 解:这两条指令的区别是,指令“ MOV AX,S”是将内存单元DS:[S中的内容读到 CPU中的寄存器AX;而指令“ LEAAX[S”是将内存单元DS[S的偏移地址送到AX。 45假定(EAX)=12345678H不用计算,写出下面每条指令执行后EAX)=? ① TEST EAX,1 ② XOR EAXEAX ③ SUB EAXEAX ④ CMP EAX8765432lH 解:①(EAX)=12345678H②0③0④(AX)=12345678H 46假定(AX)=1234HBX)=5678H指出下列指令中 ①哪些指令执行后源操作数和目的操作数都不发生变化? ②哪些指令执行后,源操作数和目的操作数都发生变化? ③哪些指令执行后,源操作数不发生变化而目的操作数发生变化? 指令 ① TESTAX,1234 ② AND AX BX ③ SUBAX1234H ④ CMP AX,1234H ⑤ XCHG AX BX 解 ①指令“ TESTAX,1234”和指令“ CMPAX,1234H”执行后,源操作数和目的操作数都 不发生变化
(4) MOV AX,[DX] DX 不能作地址寄存器 (5) MOV AX,[BX+BP] 源操作数寻址方式错,两个寄存器都是基址寄存器 (6) MOV AX,[SI+DI] 源操作数寻址方式错,两个寄存器都是变址寄存器 (7) MOV AH,300 300 超出 AH 允许范围 (8) MOV [ESI],[EDI] 源操作数和目的操作数不能同时为内存单元地址 (9) PUSH AL 入栈的数据必须是一个 16 或 32 位数据 (10) POP DH 出栈的数据是一个 16 或 32 位数据,DH 是 8 位寄存器 (11) MOV CS,AX CS 值不能由程序员编程该变 (12) MOV SS,AX SS 值不能由程序员编程该变 (13) SHL AX,3 移位次数大于 1,应先将移位次数送 CL 4.3 比较下列两条指令,指出它们的区别 MOV EAX,[ESI] MOV [ESI],EAX 解:这两条指令的区别是,指令“MOV EAX,[ESI]”是将内存单元 DS:[ESI]中的内容读 到 CPU 中的寄存器 EAX;而指令“MOV [ESI],EAX”是将 CPU 中寄存器 EAX 中的内容写 入内存单元 DS:[ESI]。 4.4 比较下列两条指令,指出它们的区别 MOV AX,[SI] LEA AX,[SI] 解:这两条指令的区别是,指令“MOV AX,[SI]” 是将内存单元 DS:[SI]中的内容读到 CPU 中的寄存器 AX;而指令“LEA AX,[SI]”是将内存单元 DS:[SI]的偏移地址送到 AX。 4.5 假定(EAX)=12345678H,不用计算,写出下面每条指令执行后(EAX)=? ① TEST EAX,1 ② XOR EAX,EAX ③ SUB EAX,EAX ④ CMP EAX,87654321H 解: ①(EAX)=12345678H ② 0 ③ 0 ④(AX)=12345678H 4.6 假定(AX)=1234H,(BX)=5678H 指出下列指令中 ① 哪些指令执行后,源操作数和目的操作数都不发生变化? ② 哪些指令执行后,源操作数和目的操作数都发生变化? ③ 哪些指令执行后, 源操作数不发生变化而目的操作数发生变化? 指令: ① TEST AX,1234 ② AND AX,BX ③ SUB AX,1234H ④ CMP AX,1234H ⑤ XCHG AX,BX 解: ① 指令“TEST AX,1234”和指令“CMP AX,1234H”执行后,源操作数和目的操作数都 不发生变化
②指令“ XCHG AX,BX”执行后,源操作数和目 的操作数都发生变化 变量 EA ③指令“ AND AX BX”和“ SUB AX1234H”执BUF3H 行后,源操作数不发生变化而目的操作数发生变化 4747阅读下面的程序,回答问题 32H 1.【程序一】 33H DATA SEGMENT BUF DB '1234 BCD 234 N=S-BUF BCD DB N DUP(?) DATA ENDS CODE SEGMENT 567 LSSUME CS: CODE. DS: DATA START: MOV AX DATA MOV DS.AX LEA SI BUF MOV CXN LEA DI BCD+N-1 LOOP1: MOV AL, [SI SUB AL 30H MOV IDIAL INC SI DEC D DEC CX JNE LOOP1 MOV AH.4CH INT 2IH CODE END END START 【问题一】画出内存分配图。 【问题二】说明程序功能程序执行后,从BCD开始的N个字节单元中的内容是什么? 【问题三】找出一条指令代替指令“ SUB AL,30H”,使程序功能不变。 【问题四】如果将代码段中的指令 LEA DI,BCD+N-1改成 LEA DI,BCD: DEC DI改成 INC DI, 其它指令不变,程序执行后,从BCD开始的N个字节单元中的内容是什么? 【问题五】取消数据段的BCD存储区,将处理后的数据放回原处,应如何修改程序? 2.【程序二】 MODEL SMALL DATA STRING DB Assemble Language is powerful N=S-STRING NEWSTR DB N DUP(O) CODE
② 指令“XCHG AX,BX”执行后,源操作数和目 的操作数都发生变化。 ③ 指令“AND AX,BX”和“SUB AX,1234H”执 行后, 源操作数不发生变化而目的操作数发生变化。 4.74.7 阅读下面的程序,回答问题 1.【程序一】 DATA SEGMENT BUF DB '1234' N=$-BUF BCD DB N DUP(?) DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX LEA SI,BUF MOV CX,N LEA DI,BCD+N-1 LOOP1:MOV AL,[SI] SUB AL,30H MOV [DI],AL INC SI DEC DI DEC CX JNE LOOP1 MOV AH,4CH INT 21H CODE ENDS END START 【问题一】画出内存分配图。 【问题二】说明程序功能,程序执行后,从 BCD 开始的 N 个字节单元中的内容是什么? 【问题三】找出一条指令代替指令“SUB AL,30H”,使程序功能不变。 【问题四】如果将代码段中的指令 LEA DI,BCD+N-1 改成 LEA DI,BCD;DEC DI 改成 INC DI, 其它指令不变,程序执行后,从 BCD 开始的 N 个字节单元中的内容是什么? 【问题五】取消数据段的 BCD 存储区,将处理后的数据放回原处,应如何修改程序? 2.【程序二】 .MODEL SMALL .386 .STACK .DATA STRING DB 'Assemble Language is powerful' N=$-STRING NEWSTR DB N DUP(0) .CODE 变量 值 EA BUF → 31H 0 32H 1 33H 2 34H 3 BCD → 4 5 6 7
STARTUP MOV CX. N LEA SI STRING EA DI. NEWSTR REPEAT MOV AL, [SI] IF(AL>='a’)&&(AL<=’z’) SUB AL. 32 ENDIF MOV [DI], AL INC SI INC DI NTILCXZ EXIT END 【问题】写出程序功能,程序执行后,从 NEWSTR开始的N个字节中的内容是什么? 1.【程序一】 【问题一】内存分配图 【问题二】 变量 EA 程序功能是将从BUF开始的连续4个字符1234 转变为4个对应的数值按逆序存放到以变量BCD为F|3|0 首地址的存储单元中。程序执行后,从BCD开始的N 个字节单元中的内容是4321。 32H 【问题三】 33H 用指令“ AND AL, OFH”代替指令“ SUBAL30H 程序功能不变 BCD 【问题四】如果将代码段中的指令 LEA DI,BCD+N-1 改成 LEA DI,BCD; DEC DI改成 INC DI,其它指令不 变,程序执行后,从BCD开始的N个字节单元中的内容 是1234 【问题五】取消数据段的BCD存储区,将经处理后的数据放回原处,修改程序如下 DATA SEGMENT 变量 BUF DB ' 1234' BUF N=S-BUF 31H DATA ENDS CODE SEGMENT 33H 2 ASSUME CS: CODE DS: DATA START: MOV AX. DATA BCD MOV DS.AX LEA SIBUF MOV CXN LOOP1:MOⅴAL[SI 6 SUB AL, 30H
.STARTUP MOV CX,N LEA SI,STRING LEA DI,NEWSTR .REPEAT MOV AL,[SI] .IF (AL >= 'a') && (AL <= 'z') SUB AL,32 .ENDIF MOV [DI],AL INC SI INC DI .UNTILCXZ .EXIT END 【问题】写出程序功能,程序执行后,从 NEWSTR 开始的 N 个字节中的内容是什么? 解: 1.【程序一】 【问题一】内存分配图 【问题二】 程序功能是将从 BUF 开始的连续 4 个字符'1234' 转变为 4 个对应的数值,按逆序存放到以变量 BCD 为 首地址的存储单元中。程序执行后,从 BCD 开始的 N 个字节单元中的内容是 4 3 2 1。 【问题三】 用指令“AND AL,0FH”代替指令“SUB AL,30H”, 程序功能不变。 【问题四】如果将代码段中的指令 LEA DI,BCD+N-1 改成 LEA DI,BCD;DEC DI 改成 INC DI,其它指令不 变,程序执行后,从 BCD 开始的 N 个字节单元中的内容 是 1 2 3 4。 【问题五】取消数据段的 BCD 存储区,将经处理后的数据放回原处,修改程序如下 DATA SEGMENT BUF DB '1234' N=$-BUF DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX LEA SI,BUF MOV CX,N LOOP1:MOV AL,[SI] SUB AL,30H 变量 值 EA BUF → 31H 0 32H 1 33H 2 34H 3 BCD → 4 4 3 5 2 6 1 7 变量 值 EA BUF → 31H 0 32H 1 33H 2 34H 3 BCD → 1 4 2 5 3 6 4 7
MOV ISILAL INC SI DEC CX JNE LOOPI MOV AH.4CH INT 21H CODE ENDS END START 2.【程序二】 程序功能是将从 STRING开始的N个字节中的字符串变成大写存放到从 NEWSTR开始 的N个字节中。程序执行后,从 NEWSTR开始的N个字节中的内容是" ASSEMBLE LANGUAGE IS POWERFUL# 48阅读下面的程序,填空。 1.【程序一说明】用减法实现除法。Ⅹ是被除数,Y是除数,处理结束后商存放在 RESULT 余数存放在 XYMOD。 【程序一】 MODEL SMALL 被除数除数商 0 STACK DATA 2222 余数→ Y DW 2 DATA? 图4-15用减法实现 RESULT DW XYMOD DW CODE STARTUP MOV AX, X Mov BX, Y MOV CX. 0 WHILE① SUB AX BX ENDW MOV RESULT. CX MOV XYMOD A 2.【程序二说明】从BUF开始的11个单元中存放着11个整数,找出这11个数中正数并且 是偶数的个数存入R中。 【程序二】 DATA SEGMENT BUF DB-2,5,-3,6,100,0-20,-9,8,-110,21
MOV [SI],AL INC SI DEC CX JNE LOOP1 MOV AH,4CH INT 21H CODE ENDS END START 2.【程序二】 程序功能是将从 STRING 开始的 N 个字节中的字符串变成大写存放到从 NEWSTR 开始 的 N 个字节中。程序执行后,从 NEWSTR 开始的 N 个字节中的内容是"ASSEMBLE LANGUAGE IS POWERFUL"。 4.8 阅读下面的程序,填空。 1.【程序一说明】用减法实现除法。X 是被除数,Y 是除数,处理结束后商存放在 RESULT, 余数存放在 XYMOD。 【程序一】 .MODEL SMALL .386 .STACK .DATA X DW 7 Y DW 2 .DATA? RESULT DW ? XYMOD DW ? .CODE .STARTUP MOV AX,X MOV BX,Y MOV CX,0 .WHILE _____①____ SUB AX,BX _____②_____ .ENDW MOV RESULT,CX MOV XYMOD,AX .EXIT END 2.【程序二说明】从 BUF 开始的 11 个单元中存放着 11 个整数,找出这 11 个数中正数并且 是偶数的个数存入 R 中。 【程序二】 DATA SEGMENT BUF DB –2,5,-3,6,100,0,-20,-9,8,-110,21 被除数 除数 商 7 2 0 5 2 1 3 2 2 余数→ 1 2 3 ←商 图 4-15 用减法实现除法示意图