'MOVZBQ equivalent in NASM
Background:
I have been learning x86_64 assembly using NASM on a Linux system and was writing a subroutine for strlen(const char *str)
I wanted to copy one byte starting from a pointer stored in rax
and comparing it to 0
to find the end of the string, but when I used mov rbx, [rax]
I didn't get the results I wanted which I later learned to be a wrong approach as rbx
is quadword length and mov
will copy 8 bytes at a time. The suggested solution was to use bl
instead which did work.
I also found in AT&T syntax the movzbq
mnemonic to copy one byte and zero extend it to a quadword, which in my newbie eyes looked as a neater more accurate representation of the intended instruction as I am not only moving to bl
but also erasing the remaining 7 bytes.
Question:
Is there an equivalent to movzbq
and other AT&T mov
variants in NASM?
Which is a better code practice, movzbq rbx, [address]
or mov bl, [address]
?
Thank you,
Solution 1:[1]
In Intel syntax, the size of memory operands is indicated by a prefix on the operand. So you would write movzx rbx, byte [address]
.
However, writes to 32-bit registers automatically zero-extend into the 64-bit register. So movzx ebx, byte [address]
is equivalent and saves one byte of code (no REX prefix needed).
Generally movzx ebx, byte [address]
is preferable to mov bl, [address]
because it overwrites the entire register. Writing to the byte-sized register can have a minor performance penalty in some cases, see Why doesn't GCC use partial registers? for details. Though mov bl, [address]
is fewer bytes of code, which may be worth the tradeoff if you need to optimize for size.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | Nate Eldredge |