问答题
阅读以下有关80X86汇编语言的叙述,回答问题1和问题2,将解答填入对应栏内。
【说明】
本题由两部分组成,第一部分为计算AX寄存器的值,第二部分为判错题。
问答题
【问题1】
已知DS=2000H,BX=0100H,SI=0002H,存储单元[20100H]到[20103H]依次存放12H、34H、56H、78H,[21200H]~[21203H]依次存放2AH、4CH、B7H、65H,说明下列每一条指令执行后AX寄存器的内容。
(1)MOV AX,[1200H] (2)MOV
AX,[BX] (3)MOV AX,[BX+1100H]
(4)MOV AX,[BX+SI] (5)MOV
AX,[BX][SI+1100H] |
【正确答案】
【答案解析】(1)4C2AH (2)3412H (3)4C2AH (4)7856H (5)65B7H
[分析]
本问题主要考查汇编语言中数据寻址方式,寻址方式是寻找指令中用于说明操作数所在地址的方法,或者是寻找操作数有效地址的方法。包括数据寻址和转移地址寻址两大类。本问题的具体解析如下:
MOV AX,[1200H]
为直接寻址,对应的物理地址为:DS×10H+200H=21200H,该单元的字内容为4C2AH,所以该条指令执行后AX的内容为4C2AH。
MOV AX,[BX]
为寄存器间接寻址,对应的物理地址为:DS×10H+BX=20100H,该单元的字内容为3412H,所以该条指令执行后AX的内容为3412H。
MOV AX,[BX+1100H]
为寄存器相对寻址,对应的物理地址为:DS×10H+BX+1100H=21200H,该单元的内容为4C2AH,所以该条指令执行后AX的内容为4C2AH。
MOV AX,[BX+SI]
为基址变址寻址,对应的物理地址为:DS×10H+BX+SI=20102H,该单元的字内容为7856H,所以该条指令执行后AX的内容为7856H。
MOV AX,[BX][SI+1100H]
为基址变址相对寻址,对应的物理地址为:DS×10H+BX+SI+1100H=21202H,该单元字的内容为65B7H,所以该条指令执行后AX的内容为65B7H。
问答题
【问题2】
下列MOV指令都是错误的,请指出错误原因。 (1)MOV ES,
1234H (2)MOV AL, 300
(3)MOV [SP], AX (4)MOV AX,
BX+DI (5)MOV 20H,
AH |
【正确答案】
【答案解析】(1)立即数不能直接赋给段寄存器。
(2)立即数300超过8位,不能赋给8位寄存器AL。
(3)SP不能作为间接寻址寄存器寻址。
(4)两个寄存器不能相加。
(5)立即数不能作为目标操作数。
[分析]
本问题主要考查汇编语言的基础知识。在8086的指令系统中,应用通用传送指令时,需要注意以下几点:
传送指令可传送8位数据,也可传送16位数据,具体取决于指令中涉及的寄存器是8位还是16位,也取决于立即数的形式。
传送指令中总是即含源操作数,又含目的操作数,两者之中至少有一个是用寄存器来指出的,这可减少指令长度。因此,一个立即数不能直接送直接寻址的内存单元。交换指令(XCHG)两个操作数都不能是立即数。
传送指令不能在两个内存单元之间直接传送数据。
在传送指令中,寄存器即可以作为源操作数,也可以作为目的操作数,但CS寄存器不能作为目的操作数,换句话说,这个寄存器的值不能随意修改。而IP寄存器即不能作源操作数,也不能作为目的操作数。
用BX、SI、DI来间接寻址时,默认的段寄存器位DS,而用BP来间接寻址时,默认的段寄存器为SS。
8086系统规定,凡是遇到给SS寄存器赋值的传送指令时,系统会自动禁止外部中断,等到本条指令和下条指令执行后,又自动恢复对SS寄存器赋值前的中断开放状态。这样做是为了允许程序员连续用两条指令分别对SS和SP寄存器赋值,同时又防止堆栈空间变动过程中出现中断。了解这点后,就应注意在修改SS和SP的指令之间不要插入其他指令。
除了一些直接影响FLAGS的指令外,一般传送指令不改变标志寄存器的内容。
立即数不能直接送段寄存器DS、ES以及SS,要用通用寄存器或存储单元作桥梁。
因此,指令“MOV ES,1234H”的错误在于立即数直接赋给了段寄存器;指令“MOV AL,300”的错误在于立即数300超过8位,不能赋给8位寄存器AL;指令“MOV[SP],AX”的错误在于SP不能作为间接寻址寄存器寻址:指令“MOV AX,BX+DI”的错误在于两个寄存器不能相加;指令“MOV 20H,AH”的错误在于立即数不能作为目标操作数。