8086 XLAT替代品

时间:2016-06-22 11:38:00

标签: assembly x86 masm x86-16

XLAT MASM 中不起作用。

我可以使用什么来改变相同的行为:

  

public function updateApp($ID,$APPID,$APPNAME) { $table = new table1(); $data = array( 'APP_ID'=> $APP_ID, 'APP_NAME'=> $APP_NAME ); $where = $table->getAdapter()->quoteInto('ID = ?', $ID); $table->update($data, $where); } :将AL设置为内存字节DS:[(E)BX + unsigned AL]

1 个答案:

答案 0 :(得分:6)

xlatb is a valid instruction in 16, 32, and 64bit modes。也许您需要使用MASM的xlatb助记符?英特尔手册建议xlatb与隐式操作数一起使用时是正确的助记符,或xlat byte ptr [bx]用于显式格式(其中,与movs一样,操作数基本上只是文档或段覆盖,并且暗示操作数大小。)另一个想法是看看反汇编程序用于指令的语法。

然而,使用其他东西通常是一个好主意,因为它只是在现代CPU(例如3 uops on Intel Haswell)上获得代码大小而不是速度。通常有更好的替代方案(特别是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。< / p>

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