寻址、基址加变址。此外,程序控制指令还有直接、相对、寄存器间接、存储器间接等寻址方式。
3.36 试写出寻址存储器操作时计算有效地址EA的通式。
解:EA=基址值(BX/BP)+变址值(SI/DI)+位移量Disp(0/8/16位) 3.37 指出8086/8088下列指令源操作数的寻址方式。
(1)MOV AX,1200H (2) MOV BX,[1200H]
(3)MOV BX,[SI] (4) MOV BX,[SI+1200H] (5)MOV [BX+SI],AL (6) ADD AX,[BX+DI+20H] (7)MUL BL (8) JMP BX
(9)IN AL,DX (10)INC WORD PTR[BP+50H] 解:(1)立即数寻址
(2)存储器直接寻址
(3)变址寄存器间接寻址 (4)寄存器变址间接寻址 (5)基址加变址寄存器间接寻址 (6)基址加变址间接寻址 (7)寄存器寻址 (9)端口间接寻址
(8)寄存器寻址
(10)寄存器基址加变址间接寻址
3.38 指出8086/8088下列指令中存储器操作数物理地址的计数表达式。 (1)MOV AL,[DI] (2)MOV AX,[BX+SI] (3)MOV 8[BX+DI],AL (4)ADD AL,ES:[BX]
(5)SUB AX,[2400H] (6)ADC AX,[BX+DI+1200H] (7)MOV CX,[BP+SI] (8)INC BYTP PTR[DI] 解:(1)PA=DS×16+DI (2)PA=DS×16+(BX+SI) (3)PA=DS×16+(BX+DI+8) (4)PA=ES×16+BX
(5)PA=DS×16+2400H (6)PA=DS×16+(BX+DI+1200H) (7)PA=SS×16+(BP+SI) (8)PA=DS×16+DI 3.39 指出8086/8088下列指令的错误何在?
(1)MOV [SI],IP (2)MOV CS,AX (3)MOV BL,SI+2 (4)MOV 60H,AL (5)PUSH 2400H (6) INC [BX]
(7)MUL-60H (8)ADD [2400H],2AH (9)MOV [BX],[DI] (10)MOV SI,AL 解:(1)IP不可与内部寄存器之间实现直接数据传送
(2)代码段寄存器CS不可与内部寄存器之间实现直接数据传送
(3)应是[SI+2]指示的内存单元的字节内容
(4)立即数60H不可做目的操作数
(5)PUSH的源操作数只能为寄存器操作数或内存操作数
(6)间接寻址存储器数据加1指令要用TYPE PTR类型操作符来标识数据类型 (7)MUL 指令的源操作数只能为寄存器操作数或内存操作数 (8)要用TYPE PTR类型操作符来标识数据类型 (9)两者不能同为存储器操作数
(10)AL为8位,SI为16位,数据类型不匹配
3.40 MOV CS,AX指令会带来什么错误?
解:这条指令不存在。如果有的话,将可以直接仅改变代码段的段基址而IP值不变,程序运行顺序发生变化,变到那里去了?很难控制。
3.41 阅读下列程序段,指出每条指令执行以后有关寄存器的内容是什么? MOV AX,0ABCH ; AX= 0ABCH DEC AX ; AX= 0ABBH
5
AND AX,00FFH ; AX= 00BBH MOV CL,4 ; CL= 4
SAL AL,1 ;AL= 76H,CF=1 MOV CL,AL ;CL= 76H ADD CL,78H ;CL= 0EEH,CF=0 PUSH AX ;AX=0076H POP BX ;BX=0076H
解:执行完后,AX=0076H,CF=0,CL=0EEH
3.42 指出RET和IRET两条指令的区别,并说明各用在什么场合? 解:RET用于从过程返回,而IRET用于从中断中返回。
3.43 说明MOV BX,DATA和MOV BX,0FFSET DATA指令之间的区别。 解: MOV BX,DATA ;DATA是字变量名,指令功能是把DATA变量的内容→BX
MOV BX,0FFSET DATA ;把DATA变量的段内偏移地址→BX 3.44 给定DS=1100H,BX=0200H,LIST=0250H和SI=0500H。试确定下面各条指令寻址存储器的物理地址。 (1)MOV LIST[SI],EDX (2)MOV CL,LIST[BX+SI] (3)MOV CH,[BX+SI] (4)MOV DL,[BX+100] 解:(1)PA=11000+0500+0250=11750H (2)PA=11000+0200+0500+0250=11950H (3)PA=11000+0200+0500=11700H (4)PA=11000+0200+0100=11300H 3.45 假定PC机存储器低地址区有关单元的内容如下所示。 (20H)=3CH,(21H)=00H,(22H)=86H,(23H)=0EH
且CS=2000H,IP=0010H,SS=1000H,SP=0100H FLAGS=0240H,这时若执行INT 8指令,试问:
(1)程序转向从何处执行(用物理地址回答)?
(2)栈顶6个存储单元的地址(用逻辑地址回答)及内容分别是什么?
解:(1)PA=0E86×10H + 003CH = 0E89CH
(2)LA=1000:00FAH~1000:00FFH
3.46 设SP=2000H,AX=3000H,BX=5000H,执行下列片段程序后,问SP=?AX=?BX=? PUSH AX
PUSH BX
POP AX
解:SP=1FFEH,AX=5000H,BX=5000H 3.47 某程序段为
2000H:304CH ABC:MOV AX,1234H 。。。 2000H:307EH JNE ABC
试问代码段中跳转指令的操作数为何值? 解:操作数为4CH-(7E+2)=0CCH
3.48 若AX=5555H,BX=FF00H,试问在下列程序段执行后,AX=?BX=?CF=? AND AX,BX ;AX=5500H XOR AX,AX ;AX=0000H NOT BX
解:AX=0000H,BX=00FFH,CF=0
3.49 若CS=E000H,说明代码段可寻址物理存储地址空间的范围。
解:代码段可寻址物理存储地址空间的范围是:E0000H—EFFFFH,共64KB的空间。 3.50 若DS=3000H,BX=2000H,SI=0100H,ES=4000H,计算出下述各条指令中存储器操作
6
数的物理地址。
(1)MOV [BX],AH (2) ADD AL,[BX+SI+1000H] (3)MOV AL,[BX+SI] (4)SUB AL,ES:[BX] 解:(1)PA=30000+2000=32000H (2)PA=30000+2000+0100+1000=33100H (3)PA=30000+2000+0100=32100H (4)PA=40000+2000=42000H
3.51 试比较SUB AL,09H与CMP AL,09H这两条指令的异同,若AL=08H,分别执行下述两条指令后,SF=?CF=?OF=?ZF=?
解:在SUB指令中,将AL- 09H的值赋给AL,而CMP指令只影响标志,不保存结果。 SUB AL,09H ;SF=1,CF=1,OF=0,ZF=0,AL=FF CMP AL,09 ;SF=1,CF=1,OF=0,ZF=0,AL=08 3.52 选用最少的指令,实现下述要求的功能。
(1)AH的高4位清零 (2)AL的高4位取反
(3)AL的高4位移到低4位,高4位清零 (4)AH的低4位移到高4位,低4位清零 解:(1)AND AH,0FH
(2)XOR AL,0F0H (3)MOV CL,4
SHR AL,CL
(4)MOV CL,4
SHL AH,CL
3.53 设BX=6D16H,AX=1100H,写出下列两条指令执行后BX寄存器中的内容。
MOV CL,06H ;CL=06H ROL AX,CL ;AX=4004H SHR BX,CL ;BX=01B4H 解:BX=01B4H
3.54 设初值AX=0119H,执行下列程序段后AX=?
MOV CH,AH ;CH=01H
ADD AL,AH ; AL=1AH,AF=0,CF=0 DAA ;AL=20,AF=1,CF=0 XCHG AL,CH ;AL=01H,CH=20H ADC AL,34H ;AL=01H+34H=35H DAA ;AL=35H MOV AH,AL ;AH=35H MOV AL,CH ;AL=20H HLT 解:AX=3520H
3.55 设初值AX=6264H,,CX=0004H,在执行下列程序段后AX=?
AND AX,AX ;AX=6264H,ZF=0
JZ DONE
SHL CX,1 ;CX=0008H
ROR AX,CL ;AX=6462H
DONE:OR AX,1234H ;AX=7676H 解:AX=7676H
3.56 写出可使AX清零的几条指令。 解: AND AX,0;
7
MOV AX,0;
XOR AX,AX。
3.57 什么叫堆栈?说明堆栈中数据进出的顺序以及压入堆栈和弹出堆栈的操作过程。 解:堆栈中数据的进出顺序为“先进后出”
PUSH S操作过程,先SP←SP-2,再[SS:SP]←S POP D操作过程,先D←[SS:SP],再SP←SP-2
3.58 8086~80286微处理器中PUSH和POP指令在堆栈和寄存器或存储单元之间总是传送多
少位数字? 解:传送16位数字
3.59 哪个段寄存器不能从堆栈中弹出? 解:SS段寄存器不能从堆栈中弹出。
3.60 如果堆栈底部定位在存储器位置02200H,试问SS和SP中将装入什么值? 解:SS=0220H,SP=0000H
3.61 带有OFFSET的MOV指令与LEA指令比较,哪条指令的效率更高?
解:MOV指令与LEA指令的功能不同,应用的地方也不同,应该说没有可比性。在二者都可用
时,MOV指令的效率更高。带有OFFSET的MOV指令不能完全替代LEA指令。
3.62 若AX=1001H,DX=20FFH,当执行ADD AX,DX指令后,请列出和数及标志寄存器
中每个位的内容(CF、AF、SF、ZF和OF)。
解:AX=3100H, CF=0;AF=1;SF=0;ZF=0;OF=0。
3.63 假如想从200中减去AL中的内容,用SUB 200,AL是否正确?如果不正确,请写出
正确的指令表示。 解:不可用立即数做目的操作数 MOV BL,200 SUB BL,AL
3.64 若DL=0F3H,BH=72H,当从DL减去BH后,列出差数及标志寄存器各位的内容。 解:差数为81H,AF=0,SF=1,ZF=0,OF=0
3.65 当两个16位数相乘时,乘积放在哪两个寄存器中?并指出积的高有效位和低有效位分别
防在哪个寄存器中?CF和OF两个标志位是什么?
解:乘积放在DX,AX中,高位放在DX中,低位放在AX中,当DX≠0时,CF=OF=1,否则 CF=OF=0 。 3.66
3.67 写出一个程序段,求DL寄存器中一个8位数的3次方,起初将5装入DL,要确保结果
是16位的数字。 解1:16位二进制数最大可以是40的三次方,而402 = 1600 > 256,故:
MOV AL,X ;X可以是0至40的任意数 MOV DL,AL MUL DL MOV DH,AH
MUL DL
;
;求X2
;保留X2的高8位 ;X2的低8位再乘X
MOV BX,AX ;保存X2的低8位与X的乘积
MOV AL,DH MUL DL ;X2的高8位再乘X,乘积不会超出8位 MOV CL,8 SHL AX,CL ;把X2的高8位与X的乘积左移8位(乘以256) ADD AX,BX ;再加上X2的低8位与X的乘积= X3 结果在AX中
8

