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]
答案 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]
。