查表指令XLAT–主要用于字节查表转换,如:把一种代码转化为另一种代码,数字0~9转化为7段显示器件所需要的驱动代码等。
指令的汇编格式:XLAT opr 或 XLAT,一般写作XLAT,而XLAT opr 的写作方式只是为了程序的易读性
指令的特殊要求:所建字节表格的长度不能超过256字节,因为存放位移量的是8位寄存器AL
下面是摘自百度百科的3个例子:
ex1:
X DW 1122H,3344H,5566H,7788H;假设X变量就是一个用于转换的表
LEA BX,X;这是个地址传送指令,一般执行XLAT之前必对BX和AL进行传送数值,形式可能各种各样
MOV AL,03H;将表在这里插入代码片格的第4个字节即第4个数值的序号或第四个值在表格中的偏移地址传送给AL
XLAT;操作数隐含的隐式指令,(AL)<-((DS)*16+(BX)+(AL))
;XLAT执行过程为取指令--取 DS BX AL中的值给地址加法器,将最终地址通过地址总线传送给主存,然后控制总线传送读命令,读取一个字节数据后通过数据总线传送给AL寄存器,一共访存2次
结果AL为33H。
XLAT作用:将((BX)+(AL))送给(AL)----简单:将BX为首地址的,偏移地址为AL的内容送给AL。
在运行XLAT之前,AL=3 BX=(X的首地址)。
这时BX+AL就是33…为什么?注意高地址放在下面。
也就是。
22------BX指向这里。
11
44。
33-----偏移地址AL为3的位置就是这里。
XLAT X。
在执行XLAT之前,先将X的地址送给BX,偏移次数送给AL。
XLAT即为查找指令 (一个字节)。
ex2:
;xlat指令测试。
;汇编语言查表指令 XLAT。
;查表指令 XLAT。
;即(AL)<--((BX)+(AL)). 执行XLAT将使待查内容送到累加器。 注意:是将bx和al中的值相加再取地址
;本指令不影响状态标位,表格长度不超过256字节。
assume cs:code,ds:data。
data segment。
tab db 1000000b,1111001b,0100100b,0110000b ;tab是数据段定义的变量,也是表格的首地址
db 0011001b,0010010b,0000010b,1111000b
db 0000000b,0010000b,0001000b,0000011b
db 1000110b,0100001b,0000110b,0001110b
db 0010110b,0100001b,0010010b,0110000b
XCODE db 9 ;定义变量XCODE,占9个字节大小的内存空间
YCODE db ?
data ends
code segment
start:
mov ax,data
mov ds,ax
mov bx,offset tab ;将tab变量在内存的地址的值传送到bx寄存器中
mov al,XCODE ;将XCODE变量在内存地址的第一个字节的值传送给al
and al,0fH
xlat
mov YCODE,al
mov ah,4cH
int 21H
code ends
end start
ex3:
数据段中存放有一张ASCII码转换表,设首地址为2000H,现欲查出表中第12个代码的ASCII码。
可用如下指令实现:
MOV BX,2000H ;BX←表首地址
MOV AL,0BH ;AL←序号
XLAT;查表转换
执行后:AL = 42H
还可用其他方法实现,如:
MOV BX,0BH
MOV AL,[BX+2000H]