xlatb是16,32和64位模式下的有效指令.也许你需要使用xlatbMASM 的助记符?英特尔手册表明,xlatb当与隐式操作数一起使用时,它是正确的助记符,或者xlat byte ptr [bx]用于显式形式(其中,movs操作数基本上只是文档或段覆盖,并且暗示操作数大小.)另一个想法是看看你的语法是什么反汇编程序用于指令.
但是,使用其他东西通常是一个好主意,因为它只是现代CPU上的代码大小而不是速度的胜利(例如,在Intel Haswell上为3 uops).通常有更好的替代方案(特别是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
Run Code Online (Sandbox Code Playgroud)
在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
Run Code Online (Sandbox Code Playgroud)
bx是唯一可用于16位寻址模式的寄存器,具有可单独使用的低半部分和高半部分(bl/bh).您需要一个REX前缀(仅限64位模式)才能使用sil/ dil.如果你想保持表指针bx,就像xlatb那样,你必须使用不同的寄存器进行零扩展,然后mov使用si或di.
如果表是静态的,你当然可以使用不绑定寄存器,只需使用[table + (e/r)bx].