Assembly XLAT指令在8086中做什么? XLAT做什么 我们为什么要用它

Assembly XLAT指令在8086中做什么? XLAT做什么 我们为什么要用它,assembly,x86,instructions,Assembly,X86,Instructions,它对DS:BX(实模式)中指定的表执行简单的基于字节的查找。例如,用于执行直接字符集转换(ASCII到EBCDIC)。在过去,我曾使用它进行其他基于索引/结果的字节查找。速度慢,但指令紧凑。我编写8086的时候已经很久了。我记得它是用来查表的。如果你知道C,你可以将它与switch()语句进行比较,当使用一个好的编译器时,它会将所有的情况转换成一个查找(跳转)表,而不是使用带有大量If-then-else的“意大利面编程” 然后,每种情况转换为跳转表中的地址+偏移量,跳转表中包含要调用的函数的地

它对DS:BX(实模式)中指定的表执行简单的基于字节的查找。例如,用于执行直接字符集转换(ASCII到EBCDIC)。在过去,我曾使用它进行其他基于索引/结果的字节查找。速度慢,但指令紧凑。

我编写8086的时候已经很久了。我记得它是用来查表的。如果你知道C,你可以将它与switch()语句进行比较,当使用一个好的编译器时,它会将所有的情况转换成一个查找(跳转)表,而不是使用带有大量If-then-else的“意大利面编程”

然后,每种情况转换为跳转表中的地址+偏移量,跳转表中包含要调用的函数的地址


然后执行一个简单的JMP,就完成了。不使用比较语句。只需进行加法,无论您有多少个案例,它都会变得很快。

如果您知道C,那么它的工作原理如下:

const uint8_t table[256]={…一些字节常量(表数据)…};
const uint8_t*ds_bx=表格;
uint8_t al=;
al=ds_bx[al];//al=表[al];
//类似于ASM中的“mov al,[ds:bx+al]”
[ds:bx+al]
不是
mov
指令的合法内存操作数,但
xlat
接受它,实际上这是
xlat
寻址内存的唯一方法(不能修改它以使用不同的寄存器)

您将什么样的数据放在表中,或者将表放在内存中的什么位置,取决于您。还有你用它做什么。这与内存分页或其他一些内存操作系统表无关,这只是纯粹的用户数据

例如,您可以使用它将菜单中的食物索引转换为食物的价格,如果您的食物索引为0..255,并且价格也将适合8位。然后为包含价格数据的表保留256字节,并加载带有该表地址的
ds:bx
,将食品索引放入
al
,然后
xlat
将索引从表中转换为价格


在我的绘图DOS 51B COM()()中,我使用
xlat
指令将带列0..4的索引转换为蓝色/蓝色/白色/蓝色/蓝色配置

我首先检查[x,y]坐标是否在标志的左上角,其中是蓝色矩形上的大白色十字。如果在外部,像素的颜色是简单的
(y div strip_size)&1
交替蓝/白颜色

但在交叉区域内,我计算了5x5网格,中间的一排条纹是全白色的。中间上方和下方的两条带必须根据x坐标(它所属的列带)以
[蓝、蓝、白、蓝、蓝]
的形式绘制。要将
[0,1,2,3,4]
值转换为
[1,1,0,1,1]
,我使用
xlat
指令,指向代码本身,屏蔽指令操作码以仅提取最低位(奇数/偶数)。通过对代码中的指令进行小范围的重新排列,我成功地在我可以通过
xlat
到达的地址获得了所需的奇偶指令操作码字节

如果我通过
If-else
分支或其他一些算法来进行转换,它将比简单的
xlat
重用
bx
al
中已经需要的值需要更多字节的代码


在普通应用程序中,几乎找不到
xlat
指令的任何用法。它是8086时代的古语,编译器肯定不会使用它,大多数手工编写的汇编也不会,因为通常可以使用simple
mov al、[bx+si]
或类似的东西

在32b模式下,如果您知道该值已经零扩展到32b,则
mov al、[ebx+eax]
xlat
快(结果相同)


在代码高尔夫运动中,当你试图产生最短的机器代码时,
xlat
可能很方便(到目前为止,我一生中曾两次需要它,用于十六进制数字格式和希腊国旗绘图代码)。

xlat
使用AL寄存器的内容作为表索引,在内存中查找表中的字节项,然后将表条目的内容复制回AL寄存器。

即使是我搜索引擎上的“x86 xlat”的第一个结果也非常透彻地解释了这一点@扎希德·汗:阅读下面的我的答案表格被指定为DS:BX(BX是到表格开头的内存偏移量)。AL是表中的索引。例如,XLAT将简单地返回索引ALAs处的值。我最近写了这篇文章,它使用XLAT将字节转换成十六进制字符。特别是功能
打印字节/hex
。该代码用于16位实模式。XLAT用于将0到15的值转换为ASCII值“0”到“9”,并将“A”转换为“F”@ZahidKhan(我猜,我没有否决投票),因为搜索“x86 XLAT指令”将返回许多相关资源,很难想象您不清楚的是什么,你是否会把一些事情复制到问题中,并解释你是如何理解它们的,或者确切地说是什么,看起来你的问题需要付出更多的努力。
xlat
使用的“表”是由
ds:(e/r)bx
指向的任何256B内存区域,返回的字节从地址
ds:(e/r)bx+al
加载。这取决于程序员设置
ds:bx
,将一些地址转换成一些有用的数据(“表格”),将
al
转换成
tab[al]
。如果我们能够添加代码,以便进一步的读者更好地理解,这一点令人满意。我很乐意接受答案。
xlatb
是一种字节查找。
开关
跳转表绝对不是明显的用例,因为您需要将结果零扩展到16位@查希德汗:查找表只是一个数组。它并不意味着任何关于控制流的事情,比如开关
。e、 g.加速