Assembly 8086 XLAT备选方案

Assembly 8086 XLAT备选方案,assembly,x86,masm,x86-16,Assembly,X86,Masm,X86 16,在MASM中不起作用 我可以使用什么来替代相同的行为: XLAT:将AL设置为内存字节DS:[(E)BX+无符号AL] 。也许您需要为MASM使用xlatb助记符?《英特尔手册》建议,当与隐式操作数一起使用时,xlatb是正确的助记符,对于显式形式,xlat byte ptr[bx]是正确的助记符(其中,与movs一样,操作数基本上只是文档或段重写,并暗示操作数大小。)另一个想法是查看反汇编程序对指令使用的语法 然而,使用其他东西通常是一个好主意,因为在现代CPU上,这只是代码大小的胜利,而不

在MASM中不起作用

我可以使用什么来替代相同的行为:

XLAT
:将AL设置为内存字节DS:[(E)BX+无符号AL]

。也许您需要为MASM使用
xlatb
助记符?《英特尔手册》建议,当与隐式操作数一起使用时,
xlatb
是正确的助记符,对于显式形式,
xlat byte ptr[bx]
是正确的助记符(其中,与
movs
一样,操作数基本上只是文档或段重写,并暗示操作数大小。)另一个想法是查看反汇编程序对指令使用的语法


然而,使用其他东西通常是一个好主意,因为在现代CPU上,这只是代码大小的胜利,而不是速度的胜利(例如)。通常有更好的选择(特别是在32位或64位代码中),比如使用
movzx
将零扩展值放入寄存器,您可以将其用作索引

在普通代码中,您可以执行以下操作:

; table in rbx
movzx  eax,  src                 ; or any other way of producing a zero-extended result in rax
movzx  eax, byte ptr [rbx + rax]     ; a movzx load avoids false deps and partial-reg slowdowns
在8086代码中,您可以执行以下操作:

; pointer to the table in DI or SI
xor  bx,bx             ; can be hoisted out of a loop, if bh will stay zeroed

mov  bl, src   ; src can be any addressing mode, or the result of a computation

mov  bl, [si + bx]     ; this is the same load that xlat does, your choice of dest
bx
是唯一可用于16位寻址模式的寄存器,该模式具有单独可用的低半部和高半部(bl/bh)。您需要REX前缀(仅64位模式)才能使用
sil
/
dil
。如果希望将表指针保持在
bx
中,就像
xlatb
那样,则必须使用不同的寄存器进行零扩展,然后将
mov
扩展到si或di

如果表是静态的,您当然可以使用不绑定寄存器,而只使用
[table+(e/r)bx]
。也许您需要为MASM使用
xlatb
助记符?《英特尔手册》建议,当与隐式操作数一起使用时,
xlatb
是正确的助记符,对于显式形式,
xlat byte ptr[bx]
是正确的助记符(其中,与
movs
一样,操作数基本上只是文档或段重写,并暗示操作数大小。)另一个想法是查看反汇编程序对指令使用的语法


然而,使用其他东西通常是一个好主意,因为在现代CPU上,这只是代码大小的胜利,而不是速度的胜利(例如)。通常有更好的选择(特别是在32位或64位代码中),比如使用
movzx
将零扩展值放入寄存器,您可以将其用作索引

在普通代码中,您可以执行以下操作:

; table in rbx
movzx  eax,  src                 ; or any other way of producing a zero-extended result in rax
movzx  eax, byte ptr [rbx + rax]     ; a movzx load avoids false deps and partial-reg slowdowns
在8086代码中,您可以执行以下操作:

; pointer to the table in DI or SI
xor  bx,bx             ; can be hoisted out of a loop, if bh will stay zeroed

mov  bl, src   ; src can be any addressing mode, or the result of a computation

mov  bl, [si + bx]     ; this is the same load that xlat does, your choice of dest
bx
是唯一可用于16位寻址模式的寄存器,该模式具有单独可用的低半部和高半部(bl/bh)。您需要REX前缀(仅64位模式)才能使用
sil
/
dil
。如果希望将表指针保持在
bx
中,就像
xlatb
那样,则必须使用不同的寄存器进行零扩展,然后将
mov
扩展到si或di


如果表是静态的,您当然可以使用不绑定寄存器,而只使用
[table+(e/r)bx]

您所说的“我不能用XLAT替换XLAT:…”是什么意思?你还没有展示任何你想做的事情,我需要的是用他的行为替换xlat的代码。因此,在本例中,添加BX、AX,然后在AL中添加MOV。可能是这样,但它不起作用。如果MASM无法组装
xlat
,我会非常惊讶。我之所以回答这个问题,是因为替换xlat通常对性能有好处。现代CPU不需要花费晶体管来提高速度,所以它可以解码到3 UOP(例如在英特尔Haswell上)。因为即使对于与8086兼容的代码,我们也可以做得比在循环中更好(通过将bx的归零提升到循环外),这个问题可能值得回答。我编辑了这个问题,以便更清楚地问出我认为您试图问的问题。我留下了一个非常可疑的声明,说它在MASM中不起作用。原始版本没有关于它如何“不工作”的更多细节,所以IDK如果它没有组装,或者因为他们使用错误而没有执行OP想要的操作。@linux91:XLAT不工作,或者它没有按照您想要的方式工作?它只支持将
AL
中的无符号字节作为偏移量。它确实像预期的那样工作。如果您希望XLAT在AX中获取16位值,则必须手动编写代码。如果您向我们展示一段代码,说明它不起作用,那将非常有用。您说的“我不能用XLAT替换XLAT:…”是什么意思?你还没有展示任何你想做的事情,我需要的是用他的行为替换xlat的代码。因此,在本例中,添加BX、AX,然后在AL中添加MOV。可能是这样,但它不起作用。如果MASM无法组装
xlat
,我会非常惊讶。我之所以回答这个问题,是因为替换xlat通常对性能有好处。现代CPU不需要花费晶体管来提高速度,所以它可以解码到3 UOP(例如在英特尔Haswell上)。因为即使对于与8086兼容的代码,我们也可以做得比在循环中更好(通过将bx的归零提升到循环外),这个问题可能值得回答。我编辑了这个问题,以便更清楚地问出我认为您试图问的问题。我留下了一个非常可疑的声明,说它在MASM中不起作用。原始版本没有关于它如何“不工作”的更多细节,所以IDK如果它没有组装,或者因为他们使用错误而没有执行OP想要的操作。@linux91:XLAT不工作,或者它没有按照您想要的方式工作?它只支持将
AL
中的无符号字节作为偏移量。它确实像预期的那样工作。如果您希望XLAT在AX中获取16位值,则必须手动编写代码。如果你给我们看一段代码,证明它不起作用,那会很有帮助。XLAT或XLATB在MASM上作为菜单已经支持了几十年了,所以我冒昧地猜测OPs对指令的理解有问题。我不知道询问者是否标记了这个8086,因为他实际上是在编写在该处理器上运行的代码,但是XLAT实际上是一个巨大的性能指标