西工大微机原理试题例题
- 格式:docx
- 大小:25.44 KB
- 文档页数:13
西工大微机原理试题例题
第三章 80X86寻址方式和指令系统
二、典型题解析
例3.1 设DS=2000H,SS=3000H,BP=0200H,SI=4000H,BUF=1000H,EAX=00001000H,EBX=00002000H,假设按16位实模式操作,确定下列每条指令访问内存的物理地址,并且指出源操作数及目的操作数的寻址方式。
(1)MOV AL,[1234H]
(2)MOV EDX,[BX]
(3)MOV CL,[BX+100H]
(4)MOV [SI],EBX
(5)MOV AH,BUF[BX+SI]
(6)MOV EAX,[BP+1234H]
分析:DS给出数据段的段基址,因此,数据段的起始物理地址为(DS)×10H=20000H。ES给出堆栈段的段基址,因此,堆栈段的起始物理地址为(SS)×10H=30000H。若是存储器寻址,根据寻址方式的不同,可求出相应的有效EA,再加上段的起始物理地址即为将访问的内存单元的物理地址。
解(1)源操作数在数据段中,为直接寻址方式。
EA=1234H
物理地址=20000H+1234H=21234H
目的操作数为寄存器寻址
(2)源操作数在数据段中,为寄存器间接寻址。
EA=(BX)=2000H
物理地址=20000H+2000H=22000H
目的操作数为寄存器寻址
(3)源操作数在数据段中,为寄存器相对寻址。
EA=(BX)+100H=2100H
物理地址=20000H+2100H=22100H 目的操作数为寄存器寻址
(4)源操作数为寄存器寻址
目的源操作数在数据段中,为寄存器间接寻址。
EA=(SI)=4000H
物理地址=20000H+4000H=24000H (5)源操作数在数据段中,为相对基址变址寻址。
EA=(BX)+(SI)+BUF=2000H+4000H
+1000H=7000H
物理地址=20000H+7000H=27000H
目的操作数为寄存器寻址
(6)由于源操作数方括号中出现了BP,所以源操作数在堆栈段中,为寄存器相对寻址。
EA=(BP)+1234H=0200H+1234H=1434H
物理地址=30000H+1434H=31434H
目的操作数为寄存器寻址
【评注】注意操作数的位置,是立即数还是在寄存器中,或在存储器中。若为存储器寻址,还要判断操作数是在数据段中还是在堆栈段中。
注意区别直接寻址方式和立即寻址方式,(1)中源操作数是[1234H],该指令是要把数据段中1234H单元的内容送AL,并非将1234H送AL,是一种直接寻址方式。
使用寄存器间接寻址时应注意和寄存器寻址方式的区别。(2)中源操作数是[BX],BX寄存器中的内容2000H是一个地址,该指令是要把数据段中以2000H单元为首的一个双字数据送EDX寄存器中,并非将2000H送EDX。所以该指令源操作数为寄存器间接寻址。
例3. 2 (AL)=9AH,(BL)=0BCH,当分别进
行下列指令运算后,请写出标志位的内容。
(1)ADD AL,BL ;ZF=___,PF=___,CF=___,SF=___,OF=___。
(2)SUB AL,BL ;ZF=___,PF=___,CF=___,SF=___,OF=___。
(3)AND AL,BL ;ZF=___,PF=___,CF=___,SF=___,OF=___。
(4)OR AL,BL ;ZF=___,PF=___,CF=___,SF=___,OF=___。
(5)XOR AL,BL ;ZF=___,PF=___,CF=___,SF=___,OF=___。
解(1) ADD AL,BL
1 0 0 1 1 0 1 0 (9AH)
+1 0 1 1 1 1 0 0 (0BCH)
0 1 0 1 0 1 1 0 (有进位)
所以,ZF=0,PF=1,CF=1,SF=0,OF=1
(2) SUB AL,BL
1 0 0 1 1 0 1 0 (9AH)
-1 0 1 1 1 1 0 0 (0BCH)
1 1 0 1 1 1 1 0 (有借位)
所以,ZF=0,PF=1,CF=1,SF=1,OF=0
(3)对于“与”、“或”和“异或”逻辑运算,
将使CF=0,OF=0,而SF、ZF和PF则根据运算结果设置。
AND AL,BL
1 0 0 1 1 0 1 0 (9AH)
∧1 0 1 1 1 1 0 0 (0BCH)
1 0 0 1 1 0 0 0
所以,ZF=0,PF=0,CF=0,SF=1,OF=0
(3) OR AL,BL
1 0 0 1 1 0 1 0 (9AH)
∨1 0 1 1 1 1 0 0 (0BCH)
1 0 1 1 1 1 1 0
所以,ZF=0,PF=1,CF=0,SF=1,OF=0
(4) XOR AL,BL 1 0 0 1 1 0 1 0 (9AH)
1 0 1 1 1 1 0 0 (0BCH)
0 0 1 0 0 1 1 0
所以,ZF=0,PF=0,CF=0,SF=0,OF=0
例3.3 判断下列指令是否正确,若有错误,请指出原因,并改正。
(1)MOV BL,OFFSET BLOCK
(2)LEA DI,[BX+SI]
(3)PUSH AL
(4)POP CS
(5)OUT CX,AL
(6)MOV ES,DS
(7)JMP BYTE PTR [SI]
(8)MOV AX,[SI+DI]
(9)MOV [BX+BP],AX
(10)ADD AX,F000H
解(1)错误。OFFSET BLOCK是指变量BLOCK的偏移地址,不能送往8位的寄存器中,应改为MOV BX,OFFSET BLOCK
(2)正确。
(3)错误。堆栈操作不能进行字节操作。应改为PUSH AX
(4)错误。不能给CS赋值。可以改为别的段寄存器,比如POP
DS
(5)错误。I/O指令中只能用DX作为间接寻址的寄存器,应该改为OUT DX,AL。
(6)错误。段寄存器之间不能传送数据。要完成该语句的功能,应改为 MOV AX,DS
MOV ES,AX
(7)错误。转移地址必须是16位或32位。
可改为JMP WORD PTR [SI]
(8)错误。SI和DI两个变址不能同时出现在方括号里,可以是一个基址加一个变址,可改为MOV AX,[BX+DI] (9)错误。BX和BP两个基址不能同时出现在方括号里。可以改为MOV [BX+SI],AX
(10)错误。F000H是一个以字母打头的数字,为了和变量区别,应书写成0F000H,所以应改为ADD AX,0F000H
例3.4查表指令和串操作指令都采用隐含寻址,那么它们的地址分别都有哪些约定?
解查表指令XLAT隐含:表首地址存于BX中,表中偏移量在AL中。段基址在DS中,有效地址为BX和AL之和。串操作指令隐含:源串的段基址在DS中,串元素偏移地址为(E)SI;目的串段基址在ES中,串元素偏移地址在(E)DI中。每次串操作之后,(E)SI和(E)DI都会自动修改。
例3.5 根据题意各写一条指令
①用逻辑指令将EAX清0
②将BX的高8位清0
③将CX的低4位和高4位取反
④将DX的低8位置1
⑤对AX的内容算术右移两位
分析: 这些功能需要用逻辑运算指令来实现。AND指令常用于将操作数中某些位清0,只须将要清0的位与0,其它不变的位与1即可;OR指令常用于将操作数中某些位置1,只须将要置1的位或1,其它不变的位或0即可;XOR指令常用于将操作数中某些位取反,只须将要取反的位异或1,其它不变的位异或0即可;也常用XOR指令将某个寄存器清0。算术右移用SAR指令。
解① AND EAX,0 或XOR EAX,EAX
② AND BX,00FFH
③ XOR CX,0F00FH
④ OR DX,00FFH
⑤ SAR AX,2
例3.6写出把首地址为BUF的字节缓冲区中第5个字节数送AL寄存器的指令,要求使用以下几种寻址方式: (1)寄存器间接寻址
(2)寄存器相对寻址
(3)基址变址寻址
解(1)LEA BX,BUF+4
MOV AL,[BX] ;寄存器间接寻址
(2)LEA BX,BUF
MOV AL,[BX+4] ;寄存器相对寻址(3)LEA BX,BUF
MOV SI,4
MOV AL,[BX+SI] ;基址变址寻址例3.7试分别使用数据传送指令、交换指令和堆栈操作指令,实现将首地址为BLOCK的内存单元中两个数据字交换。BLOCK变量定义如下:BLOCK DW 10H,20H
解(1)用数据传送指令完成:
MOV AX,BLOCK
MOV BX,BLOCK+2 ;由于字数据,故20H的地址为BLOCK+2
MOV BLOCK,BX
MOV BLOCK+2,AX
(2)用交换指令完成:
XCHG AX,BLOCK
XCHG AX,BLOCK+2
XCHG BLOCK,AX
(3)用堆栈指令完成:
PUSH BLOCK ;10H入栈
PUSH BLOCK+2 ;20H入栈
POP BLOCK ;栈顶20H出栈,存入BLOCK
POP BLOCK+2 ;10H出栈,存入BLOCK +2
【评注】注意:①因为操作数在存储器单元中,10H和20H在指令中不能以立即数的形式出现;②由于是字数据,在取第二个字时,地址应为BLOCK+2;
③用堆栈指令来完成时,一定要按照先进后出的原则来操作。