背景:
我一直在 Linux 系統上使用 NASM 學習 x86_64 匯編,并正在為 strlen(char *str)
我想從存盤的指標開始復制一個位元組rax并將其與 0 進行比較以找到字串的結尾,但是當我使用時,mov rbx, [rax]我沒有得到我想要的結果,后來我發現這是一種錯誤的方法,就像rbx四字一樣長度,mov一次復制 8 個位元組。建議的解決方案是使用bl確實有效的方法。
我還在 AT&T 語法中發現了movzbq將一個位元組復制到零并將其擴展為四字的助記符,在我的新手眼中,這看起來是預期指令的更簡潔更準確的表示,因為我不僅要移動,bl還要擦除剩余的 7 個位元組.
問題:
NASM 中是否有movzbq與其他 AT&T變體等效的變體?mov
哪個是更好的代碼實踐,movzbq rbx, [address]還是mov bl, [address]?
謝謝,
uj5u.com熱心網友回復:
在 Intel 語法中,記憶體運算元的大小由運算元上的前綴指示。所以你會寫movzx rbx, byte [address].
但是,對 32 位暫存器的寫入會自動將零擴展到 64 位暫存器。所以movzx ebx, byte [address]是等效的并且節省了一個位元組的代碼(不需要 REX 前綴)。
通常movzx ebx, byte [address]更可取,mov bl, [address]因為它會覆寫整個暫存器。在某些情況下,寫入位元組大小的暫存器可能會帶來輕微的性能損失,請參閱為什么 GCC 不使用部分暫存器?詳情。雖然mov bl, [address]代碼位元組數更少,但如果您需要優化大小,這可能值得權衡。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/415415.html
標籤:
