What does the MOVZBL instruction do in IA-32 AT&T syntax?

前端 未结 2 1397
孤城傲影
孤城傲影 2020-11-29 08:52

What exactly does this instruction do?

movzbl  0x01(%eax,%ecx), %eax
2条回答
  •  谎友^
    谎友^ (楼主)
    2020-11-29 09:33

    Minimal example

    mov $0x01234567, %eax
    mov $1, %bl
    movzbl %bl, %eax
    /* %eax == 0000 0001 */
    
    mov $0x01234567, %eax
    mov $-1, %bl
    movzbl %bl, %eax
    /* %eax == 0000 00FF */
    

    Runanble GitHub upstream with assertions.

    The mnemonic is:

    • MOV
    • Zero extend
    • Byte (8-bit)
    • to Long (32-bit)

    There are also versions for other sizes:

    • movzbw: Byte (8-bit) to Word (16-bit)
    • movzwl: Word (16-bit) to Long (32-bit)

    Like most GAS instructions, you can omit the last size character when dealing with registers:

    movzb %bl, %eax
    

    but I cannot understand why we can't omit the before last letter, e.g. the following fails:

    movz %bl, %eax
    

    Why not just deduce it from the size of the operands when they are registers as for mov and Intel syntax?

    And if you use registers of the wrong size, it fails to compile e.g.:

    movzb %ax, %eax
    

提交回复
热议问题