第3章 8086/8088指令系统
一、选择题
1在8088变址寻址方式中,操作数的物理地址等于( )。[北京邮电大学研]
A.段寄存器左移4位加上变址寄存器的内容
B.段寄存器左移4位加上变址寄存器的内容再加给定的偏移量
C.段寄存器左移4位加上变址寄存器的内容再加基址寄存器内容
D.段寄存器左移4位加上基址寄存器的内容再加给定的偏移量
【答案】B
【解析】在变址寻址方式的指令中,指定DI或SI的内容进行间接寻址,并且还要指定一个8位或16位的位移量DISP。DI和SI称为变址寄存器,SI为源变址寄存器,DI为目的变址寄存器。因此,变址寻址操作数的有效地址EA等于变址寄存器内容和位移量之和,结果按16位计算。
对于变址寄存器,默认操作数在数据段中,因此计算物理地址时用DS的内容作为段首址,操作数的实际地址为:
段寄存器左移四位就相当于段寄存乘以10H,8088变址寻址操作数的物理地址等于段寄存器左移四位加上变址寄存器的内容再加给定的偏移量。
2当使用BP寄存器作基址寻址时,若无指定段替换,则内定在( )段内寻址。[华中科技大学研]
A.程序
B.堆栈
C.数据
D.附加
【答案】B
【解析】使用BP寄存器作基址寻址时,若无指定段替换,则默认在堆栈段SS内寻址。
3下列指令中,正确的是( )。[浙江工业大学研]
A.MOV AL,1000
B.MOV 100,AL
C.MOV AL,100H
D.MOV AL,100
【答案】D
【解析】A项,目的操作数是8位的寄存器AL,立即数1000超过范围,指令是非法的。B项,目的操作数是立即数,立即数不能作目的操作数,是非法指令。C项,源操作数100H超过8位,也是非法指令。
4假定(SS)=2000H、(SP)=0100H、(AX)=2107H执行指令PUSH AX后,存放数据21H的物理地址是( )。[华中科技大学研]
A.20102H
B.20101H
C.200FEH
D.200FFH
【答案】D
【解析】指令PUSH AX将AX的内容压入堆栈。压栈前的堆栈地址为(SS)×16+SP=20100H,执行指令后,先将SP-2→SP,因为压栈遵循“先高位后低位”原则,所以先往200FFH中压入21H,再往200FEH中压入07H。
5若AL、BL中是压缩BCD数,且在执行ADD AL,BL之后,(AL)=0CH,CF=1,AF=0。再执行DAA后,(AL)=( )。[浙江工业大学研]
A.02H
B.12H
C.62H
D.72H
【答案】B
【解析】执行ADD AL,BL之后,(AL)=0CH。因为CF=1,AF=0,因此要进行加6调整,0CH+6=12H。
6以下可以使寄存器AX和CF同时清零的指令为( )。[重庆大学研]
A.SUB AX,AX
B.XCHG AX,BX
C.PUSH AX
D.XOR AX,BX
【答案】A
【解析】BC两项,传送类指令不影响标志位。D项,是“异或”逻辑指令,指令结束后使CF=0,最终“异或”的值由BX中的内容决定,如果BX的内容和AX中的相等,则结果为0,如果不相等,则结果不为0。A项,是减法指令,源操作数和目的操作数都是AX,相减后结果为0回送给AX,即AX=0,指令操作没有产生借位,因此CF=0。
7假设AL=3,要使得AL=0CH,应执行的指令是( )。[浙江工业大学研]
A.NOT AL
B.AND AL,0FH
C.XOR AL,0FH
D.OR AL,0FH
【答案】C
【解析】AL=3=00000011B。
A项,指令NOT AL是将对AL的各位求反,指令执行后AL=11111100。因此不符合要求。
C项,指令XOR AL,0FH是将对AL的高四位保留不变,低四位按位取反,指令执行后AL=00001100=0CH。
B项,指令AND AL,0FH是将对AL的高四位清0,低四位保留不变,指令执行后AL=00000011。因此不符合要求。
D项,指令OR AL,0FH是将对AL的高四位保留不变,低四位置1,指令执行后AL=00001111B=0FH,不符合要求。
二、填空题
1指令MOV [BX+SI],AL中的目的操作数使用______段寄存器,属于______寻址方式。[东华大学研]
【答案】DS;基址变址
【解析】指令中的目的操作数在存储器中,操作数的有效地址EA是由指定的一个基址寄存器BX和一变址寄存器SI的内容之和,操作数在数据段中,因此使用的是DS段寄存器,属于基址变址寻址。
2XLAT指令规定BX寄存器存放______,AL寄存器中存放______。[西北工业大学研]
【答案】表首偏移地址;表内偏移量
【解析】XLAT指令将数据段中偏移地址为BX与AL寄存器之和的存储单元内的内容送入AL寄存器,表的首地址置于BX中,AL中存放查找对象在表中的下标。
3阅读程序段,请在注释中填写指令的执行结果。
BUF DW 4105
MOV AL,BYTE PTR BUF;AL=______
MOV AH,8
MUL AH
AAM;执行后AH=______,AL=______[南京邮电大学研]
【答案】05H;04H;00H
【解析】①BUF DW 4105
该指令是伪指令,定义了一个字变量BUF,它的内容为4105H。
②MOV AL,BYTE PTR BUF
传送类指令,取BUF变量的低字节05H到AL中,由此AL=05H。
③MOV AH,8
传送类指令,将立即数送到AH寄存器中AH=8。
④MUL AH
字节无符号数乘法指令,将AH×AL=08H×05H=28H结果送入到AX中,则AH=00H,AL=28H。
⑤AAM
分离BCD码乘法调整指令,对十进制数进行乘法运算,要求乘数和被乘数都是分离BCD码,先作乘法,后调整,调整后得到正确的分离BCD数的乘积,高位放在AH中,低位放在AL中。
调整步骤如下:
把AL寄存器内容除以0AH(10),商放在AH中,余数在AL中,本题中的AL=28H;
AL/10所得的商→AH 28H/0AH=4,得到AH=4H;
AL/10所得的余数→AL 28H%0AH=0,得到AL=0;
由此,第五条指令执行后,AH=04H,AL=00H。
4源程序如下:
MOV AH,0
MOV AL,9
MOV BL,8
ADD AL,BL
AAA
AAD
DIV AL
结果AL=______、AH=______、BL=______。[南京航空航天大学研]
【答案】01H;00H;08H
【解析】AL和BL相加的结果为17,即11H。
DIV用于无符号数的除法运算,对于字节除法,被除数在AX中,除数为指定目标数,在这里也为AX,商在AL中,余数在AH中。
所以执行完DIV AL后AL=1=01H,AH=0=00H,BL的值不变,依然为8=08H。
5若AX=80FEH、BX=FF80H
写出8086 CPU独立执行下列各条指令后,有关寄存器的内容与标志位。[北京邮电大学研]
(1)ADD AH,BL;AH=______H,标志SZAPCO=______B。
(2)IMUL BL;AX=______H,标志CFOF=______B。
(3)SUB AH,BL;AH=______H,标志SZAPCO=______B。
(4)SHL BL,01;BL=______H,标志SZPCO=______B。
【答案】
(1)0;010111
(2)0100;11
(3)0;010101
(4)0;01111
【解析】(1)ADD AH,BL
状态标志为:SF=0、ZF=1(结果为0)、AF=0、PF=1、CF=1、OF=1。
执行后结果为:AH=0、标志SZAPCO=010111B。
(2)IMUL BL
IMUL为带符号的乘法指令即
(BL)×(AL)→(AX)。
(BL)=80H=-128
(AL)=0FEH=-2
(AX)=256=0000 0001 0000 0000B=0100H
因为乘积的高半部分不是低半部分的符号扩展(不是全零或全1),是积的一部分,因此CF=OF=1。执行后结果为:AX=0100H,标志CFOF=11B。
(3)SUB AH,BL
SUB减法指令即:(AH)-(BL)=80H-80H=0。
状态标志为:SF=0、ZF=1(结果为0)、AF=0、PF=1、CF=0、OF=1。
执行后结果为:AH=0H、标志SZAPCO=010101B。
(4)SHL BL,01
SHL逻辑左移,BL=80H=10000000B,逻辑左移后BL=0、CF=1、OF=1、SF=0、ZF=1、PF=1。
执行后结果为:BL=0H、标志SZPCO=01111B。
6将下列程序补充完整:程序的功能是在数据段ADDR1地址处有200个字节,要传送到数据段地址ADDR2处。[北京航空航天大学研]
【答案】AX;OFFSET ADDR1;CX;MOVSB
【解析】在存储器中实现信息块的搬家,使用重复前缀,必须先给CX赋值重复的次数。如果信息块的长度是多少个字节,用MOVSB传送时,则将此字节数赋给CX作重复次数;若用MOVSW传送时,则将此字节数÷2赋给CX作重复次数。程序要求200个字节搬移,指令中使用的重复次数为200,由此使用REP MOVSB指令,完整的程序如下:
7指令REP MOVSB重复执行的条件为______。[北京理工大学研]
【答案】CX≠0。
【解析】指令REP MOVSB是紧接在它后面的字符串操作指令重复执行(CX)次,每执行一次字符串操作指令,计数器CX的内容自动减1,直到CX=0时,退出串处理循环,转而执行下一条指令。
8设AX=8000H,BX=0FFFFH,执行CMP AX,BX后,写出两条能引起转移的条件转移指令______、______。[北京航空航天大学研]
【答案】JC;JNZ
【解析】AX=8000H,BX=0FFFFH,执行CMP AX,BX后CF=1(有借位),OF=0(没有溢出),ZF=0(结果不为0),SF=1(结果为负数,最高位为1),PF=0(第8位有1个1)。因此能引起转移的条件指令有JC、JN0、JNZ等。
9若指令JMP ADDR1的机器码为E93512H,此指令的CS=1500H,IP=2400H,则目标ADDR1与本指令之间的位移量为______,执行本指令时,1P的当前值为______,本指令执行后,CPU转移至CS:IP为______。[西南交通大学研]
【答案】1235H;2403H;1500H:3638H
【解析】JMP指令是无条件转移指令,JMP ADDR1的机器码为E93512H,这是三字节指令,E9H表示操作码,8086系统中,高地址存放的是高字节,低地址则是低字节,因此1235H是操作数,表示本指令与ADDR1之间的位移量为1235H。
该指令是三字节指令,执行指令时,当前IP=2400H+3=2403H。由目标偏移地址当前IP值+指令中的位移量=2403H+1235H=3638H。因此,执行该指令后,CPU转移至1500H:3638H处。
三、判断题
1立即数寻址方式的操作数是在代码段中的,因此在执行指令的过程中也要执行总线周期。( )[西安交通大学研]
【答案】错误
【解析】立即数寻址方式下,操作数直接包含在指令中,它是一个8位或16位的常数,称为立即数。这类指令翻译成机器码时,立即数作为指令的一部分,紧跟在操作码之后,存放在代码段内,也就是说,操作码后面的一个(或两个)字节就是操作数。例如:
MOV AX,1234H
执行后,AX=1234H,其中,AH=12H,AL=34H,如图3-1所示。
图3-1 指令MOV AX,1234H的执行过程
从存储器的代码段中取指令到总线接口单元BIU的指令序列中,要执行总线周期。但在指令执行过程中,立即数作为指令的一部分直接从BIU的指令序列中取出,不需要另外占用总线周期,所以这种寻址方式的显著特点是执行速度快。
2指令OUT 383H,AL属于I/O端口寻址,是将AL寄存器的内容送到I/O接口383端口中。( )[重庆大学研]
【答案】错误
【解析】当端口地址大于或等于256,长格式的I/O指令不能实现对端口的寻址时,必须先把端口号放到寄存器DX中,因DX为16位寄存器,故端口号可从0000~FFFFH,这类似于存储器间接寻址,但不同的是,间接寻址端口的寄存器只能使用DX。为了实现将AL寄存器的内容送到I/O接口383端口中,必须是如下两条指令:
MOV DX,383;将端口号383H放入DX
OUT DX,AL;将AL输出到DX所指的端口中
四、解答题
1设DS=1000S、ES=3000H、SS=4000H、SI=00A0H、BP=0070H,执行指令
MOV AX,[BX+5]
请回答:指令使用的是何种寻址方式;源数据的逻辑地址和物理地址分别是多少;若源数据为1234H,则执行指令后上述各寄存器的内容。[西安理工大学研]
答:在基址寻址方式的指令中,指定BX或BP的内容进行间接寻址,并且还要指定一个8位或16位的位移量DISP。BX和BP称为基址寄存器,因此基址寻址操作数的有效地址EA等于基址寄存器内容和位移量之和,结果按16位计算。
对于BX寄存器,默认操作数在数据段中,因此计算物理地址时用DS的内容作为段首址,操作数的实际地址为:
对于BP寄存器,操作数在堆栈段中,因此则使用段寄存器SS的内容作段首址,操作数的实际地址为:
因此本指令为基址寻址,基址寄存器是BX,源操作数在数据段中,源操作数的逻辑地址为:
EA=BX+5=0700H+5=0705H
源操作数的物理地址为:
PA=DS×10H+EA=1000H×10H+0705H=10705H
若源数据为1234H,则执行指令MOV AX,[BX+5]后,AX中的内容就为1234H,DS、ES、SS、SI、BX和BP的内容不变,仍为DS=1000H、ES=3000H、SS=4000H、SI=00A0H、BX=0070H、BP=0070H。
2若(BX)=0158H、(DI)=10A5H、位移量=1B57H、(DS)=2100H、(SS)=1100H、(BP)=0100H,段寄存器按默认段寄存器。请写出传送指令(目的操作数都是AX,源操作数采用下列寻址方式),并写出各种寻址方式下的源操作数的有效地址和物理地址。
(1)直接寻址;
(2)寄存器间接寻址(假设寄存器为BX);
(3)基址寻址(假设寄存器为BP);
(4)基址变址寻址(假设寄存器为BX和DI);
(5)基址变址相对寻址(假设寄存器为BP和DI)。[西华大学研]
答:(1)直接寻址
MOV AX,[1B57H]
EA=1B57H
PA=DS×10H+EA=21000H+1857H=22B57H
(2)寄存器间接寻址(假设寄存器为BX)
MOV AX,[BX]
EA=(BX)=0158H
PA=DS×10H+EA=21000H+0158H=21158H
(3)基址寻址(假设寄存器为BP)
MOV AX,1B57H[BP]
EA=(BP)+IB57H=0100H+1B57H=1C57H
PA=SS×10H+EA=11000H+1C57H=12C57H
(4)基址变址寻址(假设寄存器为BX和DI)
MOV AX,[BX+DI]
EA=(BX)+(DI)=0158H+105AH=11FDH
PA=DS×10H+EA=21000H+11FDH=221FDH
(5)基址变址相对寻址(假设寄存器为BP和DI)
MOV AX,1B57H[BP][DI]
EA=(BP)+(DI)+1B57H=0100H+10A5H+1B57H=2CFCH
PA=SS×10H+EA=11000H+2CFCH=13CFCH
3若(DS)=3000H、(SI)=2000H、AREA=3000H、(DI)=1000H、(AX)=2500H、(34000H)=00H、(34001H)=34H、(34002H)=00H、(34003H)=50H,执行指令LDS SI,AREA[DI]后,SI和DS中的内容为多少?[广东工业大学研]
答:装入地址指针指令LDS DST,SRC的功能是取某变量的32位地址指针的指令,从由指令的源操作数SRC所指定的存储单元开始,由4个连续存储单元中取出某变量的地址指针(共4个字节),将其前两个字节(即变量的偏移地址)传送到由指令的目的操作数DST所指定的某16位通用寄存器,后两字节(即变量的段基址)传送到DS段寄存器中。
指令LDS SI,AREA[DI]的源操作数的有效地址EA=(DI)+3000H=4000H,物理地址PA=DS×10H+EA=34000H,从物理地址34000H开始的4个连续的存储单元即34000H~34003H中取4个字节的内容,将低字3400H送入到SI,取代原来的2000H,将高字5000H送入到DS,取代它的原值3000H。示意图如图3-2所示。
因此指令执行后,SI=3400H,DS=5000H。
图3-2 LDS SI,AREA[DI]操作示意图
4指出下列指令的错误:
(1)MOV DS,0200H
(2)MOV AH,BX
(3)MOV BP,AL
(4)MOV AX,[SI][DI]
(5)OUT 310H,AL
(6)MOV BYTE PTR[BX],1000
(7)MOV CS,AX
(8)MOV [BX+CX],AL
(9)MOV [BX],[SI]
(10)MOV 4[DI],02
(11)MOV [BX+SI+3],IP
(12)PUSH BH
(13)MOV AX,DISP[BX][BP]
(14)MOV AX,BYTE ETR[SI]
(15)OUT CX,AL
(16)LEA BX,CX [西南交通大学研]
答:(1)MOV DS,0200H
立即数不能直接向段寄存器送数据,要实现该语句的功能应改为:
MOV AX,0200H
MOV DS,AX
(2)MOV AH,BX
源操作数寄存器是16位,目的操作数的寄存器是8位,寄存器类型不匹配,应改为:MOV AH,BH(BL)或MOV AX,BX
(3)MOV BP,AL
源操作数寄存器是8位,目的操作数的寄存器是16位,寄存器类型不匹配,应改为MOV BP,AX
(4)MOV AX,[SI][DI]
两个变址寄存器SI和DI不能同时出现。
(5)OUT 310H,AL
在I/O端口寻址中,直接寻址的输出指令中,端口号只能在0~FFH范围内。要完成该指令的功能应改为寄存器间接端口寻址,指令如下:
MOV DX,310H
OUT DX,AL
(6)MOV BYTE PTE[BX],1000
数1000超出一个字节的范围,不匹配,应把目的操作数改为字操作数,指令如下:
MOV WORD PTR[BX],1000
(7)MOV CS,AX
不能用CS和IP作目的操作数,CS和IP的内容可以了解,但不能随便修改。
(8)MOV [BX+CX],AL
CX(DX)不能作为变址寄存器。
(9)MOV [BX],[SI]
源操作数和目的操作数都是存储器操作数,要实现存储单元的数据传送,通过寄存器来完成,指令如下:
MOV AX,[SI]
MOV [BX],AX
(10)MOV 4[DI],02
源操作数和目的操作数的类型均不明确。
(11)MOV [BX+SI+3],IP
IP不能作为源操作数和目的操作数。
(12)PUSH BH
堆栈操作只能对字操作,BH是8位的字节寄存器。
(13)MOV AX,DISP[BX][BP]
两个基址寄存器BX和BP不能同时出现。
(14)MOV AX,BYTE PTR[SI]
源操作数是字节数,目的寄存器是16位的,数据类型不匹配。
(15)OUT CX,AL
在I/O端口寻址中,使用的寄存器只能是AX(AL)和DX。
(16)LEA BX,CX
LEA是地址传送指令,源操作数必须是一个存储区操作数。
5下面的8086指令是否有误?若有错,指出错在何处。
(1)ADD CS,[AX-100H]
(2)CMP [SI],[BX]
(3)SBB 01,[01]
(4)INC DS
(5)IMUL DX,AX
(6)AND CX,[DX] [北京邮电大学研]
答:(1)ADD CS,[AX-100H]
非法指令,加法指令中目的操作数只能是通用寄存器或存储器,段寄存器不能参与算术指令的操作。
(2)CMP [SI],[BX]
非法指令,源操作数和目的操作数不能同时为存储器操作数。
(3)SBB 01,[01]
非法指令,立即数不能作目的操作数。
(4)INC DS
非法指令,INC指令中的操作数只能是通用寄存器或存储器操作数。段寄存器DS不能用在INC指令中。
(5)IMUL DX,AX
非法指令,乘法指令的操作数只有一个源操作数,目的操作数固定在AL,或AX中。
(6)AND CX,[DX]
非法指令,不能用DX进行寄存器间接寻址。
6设DX:AX中为一双字,若(DX:AX)den=(0FFFFH:8000H)有程序段:
NEG DX
NEG AX
SBB DX,0
试说明此程序段对双字实现什么操作功能?程序运行后(DX:AX)的内容是多少?ZF和CF是多少?[西北工业大学研]
答:(1)NEG DX
该指令实现对DX的求补,DX=0FFFFH,对DX求补后DX=0001H,产生了借位,则CF=1。
(2)NEG AX
实现对AX的求补,如果对8000H求补,其值不变。指令执行后AX还是为8000H,CF=1。
(3)SBB DX,0
带借位的减法指令,指令完成(DX)-0H-CF=0001H-0H-1H=0H,最终将0送到DX中,DX=0。运算结果都为0则ZF=1,没有产生借位则CF=0。
此程序段对双字实现了求双字的相反数;程序运行后(DX:AX)=(0000H:8000H);ZF=1,CF=0。
7写出一条能完成下述操作的指令。
(1)将AX的高字节清零,低字节不变。
(2)将BX的低字节置成“1”,高字节不变。
(3)将CX的高字节变反,低字节不变。[北京邮电大学研]
答:(1)将AX的高字节清零,低字节不变的指令如下:
AND AX,00FFH
(2)将BX的低字节置成“1”,高字节不变的指令如下:
OR BX,00FFH
(3)将CX的高字节变反,低字节不变的指令如下:
XOR CX,OFFOOH
8已知(AL)=80H、(CL)=03H,求执行下列指令后(AL)=?CF=?
(1)SAR AL,CL
(2)SHR AL,CL[上海大学研]
答:(1)SAR AL,CL
将AL中的内容80H算术右移3位,如图3-3所示。
指令执行后AL=0F0H(它是-10H的补码)、CF=0。
图3-3 将AL中的内容80H算术右移3位
(2)SHR AL,CL
将AL中的内容80H逻辑右移3位,如图3-4所示。指令执行后AL=10H、CF=0。
图3-4 将AL中的内容80H逻辑右移3位
9用一条指令完成:将CX中间8位取反,其余位不变。[华东理工大学研]
答:XOR CX,0FF0H,若为1,则与1异或之后为0,若为0,与1异或之后为1,达到了取反目的。
10已知CPU的寄存器和存储单元的内容如图3-5所示,请问执行下述指令后CPU转移至的目标地址的PA为多少?
(1)JMP [BX+DI]
(2)JMP DWORD PTR[BX+DI] [兰州大学研]
图3-5 CPU的寄存器和存储单元的内容
答:(1)JMP [BX+DI]
该指令是段内间接转移指令,它将要转向的段内目标地址存放在存储单元中,该存储单元的偏移地址EA=(BX)+(DI)=0410H,物理地址PA=DS×10H+EA=20410H。
段内间接转移指令转移时,仅改变IP寄存器的内容,CS的内容不变。指令执行后,IP=(20410H)=340AH,CPU转移至的目标地址PA=CS×10H+IP=1340AH。
(2)JMP DWORD PTR[BX+DI]
该指令是段间间接转移指令,它将要转移的目的地址的段地址和偏移量事先放在存储器中的4个连续地址单元中,其中前两个字节为偏移量,后两个字节为段基址。指令只给出存放目标地址的存储单元的首字节的偏移地址EA=(BX)+(DI)=0410H,物理地址PA=DS×10H+EA=20410H。前两个单元的字为340AH,取代当前的IP,后两个单元的字为6500H,取代当前的CS。CPU转移至的目标PA=CS×10H+IP=6500H×10H+340AH=6840AH。
11已知在指令执行前,有DI=0300H、BX=0010H、CF=0、DS=2000H、SS=3000H、BP=0100H、SP=0020H、[DS:0310H]=0AAH、[DS:0311H]=55H。
(1)执行指令RCR WORD PTR[BX+DI],1后,目的操作数值为;
(2)指令MOV AL,[BP+100H]的源操作数物理地址为;
(3)指令POP 300H[DI]的源操作数物理地址为。[中山大学研]
答:(1)RCR WORD PTR[BX+DI],1
目的操作数的EA=(BX)+(DI)-0310H,
目的操作数的PA=DS×10H-20310H,
目的操作数的内容=55AAH。
指令执行完毕后,目的操作数的数值为:2AD5H。
图3-6 RCR指令的执行
(2)MOV KL,[BP+100H]
源操作数的EA=(BP)+100H=0110H,
源操作数的PA=SS×10H+EA=30110H,
因此,源操作数物理地址为30110H。
(3)POP 300H[DI]
出栈指令POP的源操作数固定为堆栈栈顶SS:SP,
PA=SS×10H+SP=3000H×10H+0020H=30020H。
因此,指令POP 300H[DI]的源操作数物理地址为30020H。
五、编程题
1十六进制0~9,A~F对应的ASCII码为30H~39H、41H~46H,依次放在内存以TABLE开始的区域,将AL中某一位十六进制数××H转换为对应的ASCII码,请编写程序。[浙江工业大学研]
答:换码指令XLAT是一条隐含寻址方式的指令,该指令可通过查表完成代码转换功能。换码指令可将累加器AL中一个值(码)翻译为内存表格(Table)中的某一值后,再送回AL中。XLAT指令一般用来实现编码制问的转换。使用XLAT指令之前,要求BX寄存器指向表的首地址,AL中存放待查的码,用它表示表中某一项与表首址的距离。执行时,将BX和AL的值相加得到一个地址,最后将该地址单元中的值取到AL中,即AL←((BX)+(AL)),这就是查表转换的结果。
指令执行前,BX指向一张256个字节的表的起点,AL中是表的索引值。
MOV BX,TABLE;TABLE为表首地址
MOV AL,××H;××H为要转换的一位十六进制数
XL AT;执行后,AL←ASCII码
2编写程序将DX、AX中的32位数据左移一位,低位补零。[北京邮电大学研]
答:DX、AX中的32位数据左移一位,低位补零,对AX中的低字采用移位指令SHL,移位后原AX中的最高位移入到CF中。再将CF的值移到DX中的最低位,然后依次左移,DX中的最高位进入CF,也就是说,DX要CF参加移位,所以只能使用带进位的循环左移指令RCL指令。带进位的循环左移指令示意图如图3-7所示。
图3-7 带进位的循环左移指令示意图
指令如下:
SAL AX,1
RCL DX,1
3编写相应的程序段:将AX中的最高4位与最低4位交换。[西南交通大学研]
答:因为是将AX中的最高4位与最低4位交换,循环次数为4。
先将AX的每4位编号为1、2、3、4后面的操作,程序如下:
程序执行示意图如图3-8所示。
图3-8 程序执行示意图
4请编写一内存自检程序:检查从2000H:0000H开始的64KB是否损坏,检查内存的方法是,往内存的每一单元写两次特征字一次写55H,一次写0AAH,稍后再读出来检查是否还是那个特征字,如果每个单元都正确,则内存完好,转RAM_OK,若损坏转到RAM_ERR。[西南交通大学研]
答:在存储单元写两次特征字,一次写55H=01010101B,一次写0AAH=10101010B,这样操作是保证每个单元的每一位既能写1又能写0,确保安全。
程序用REP STOSW指令给每个单元写入55H,再使用REPE SCASW扫描每个单元是否为55H,有错则转到RAM_ERR。第二次同理写入0AAH。
5编写程序:设某个学生的英语成绩已存放在AL寄存器中,若低于60分,则将字符F(FAIL)赋值给AH;若高于或等于85分,将字符G(GOOD)赋值给AH;当在60分和84分之间时,将字符P(PASS)赋值给AH。[电子科技大学研]
答:一般来说,成绩不会小于0分,因此认为成绩是无符号数,使用的条件判断用无符号数方式来测试。先比较成绩是否小于60分,满足则赋字符F给AH;不满足说明大于60分,再判断是否大于等于85分,符合该条件就将字符G赋值给AH;如果不满足则是在60分和84分之间,赋字符P给AH。完整的程序如下:
6编程实现同一段内偏移地址100个字节的信息块搬家,要考虑操作的方向。[西南交通大学研]
答:同一段内实现信息块的搬家,要考虑信息的覆盖问题,也就说源块与目的块有地址重叠,原信息尚未搬走就被新的信息覆盖,程序完成后,目的块与源块不一致。解决此问题的方法是正确地设置传送方向。对于同一段内传送,即DS=ES,将SI和DI比较一下:
若SI>DI,则应从高到低,设置DF=0;
若SI<DI,则应从低到高,设置DF=1。
程序如下:
最后两条语句可以用REP MOVSB这一条指令来代替,功能不变。
7编写程序:给1A000H开始的256个内存单元均减去1,若发现某个单元减为0则立即退出循环,其后的单元不再减1。[西安理工大学研]
答:1A000H是物理地址,我们可以设DS=1A00H,偏移地址则为0。程序如下:
8在内存中TAB单元起始放置十六进制一ASCII代码转换表[30H,31H,32H,33H,34H,35H,36H,37H,38H,39H,41H,42H,43H,44H,45H,46H],将DATA单元起始的100H个一位十六进制数转换成为ASCII代码并放入DATA1起始的单元中。[西安理工大学研]
答:指令XLAT换码指令是将AL中的一个值翻译为内存表中某一个值后,再同送该AL使用 XLAT指令之前,要求BX寄存器指向表的首地址,AL中存放待查的码,用它表示表中的某一项与表首址的距离。执行时,将BX与AL的值相加得到一个地址,最后将该地址单元中的值取到AL中,这就是查表转换的结果。