3.4. Immediate Operands

Immediate operands in NASM may be 8 bits, 16 bits, 32 bits, and even 64 bits in size. The immediate size can be directly specified through the use of the BYTE, WORD, or DWORD keywords, respectively.

64 bit immediate operands are limited to direct 64-bit register move instructions in BITS 64 mode. For all other instructions in 64-bit mode, immediate values remain 32 bits; their value is sign-extended into the upper 32 bits of the target register prior to being used. The exception is the mov instruction, which can take a 64-bit immediate when the destination is a 64-bit register.

All unsized immediate values in BITS 64 in Yasm default to 32-bit size for consistency. In order to get a 64-bit immediate with a label, specify the size explicitly with the QWORD keyword. For ease of use, Yasm will also try to recognize 64-bit values and change the size to 64 bits automatically for these cases.

Examples in NASM syntax:

        add rax, 1           ; optimized down to signed 8-bit
        add rax, dword 1     ; force size to 32-bit
        add rax, 0xffffffff  ; sign-extended 32-bit
        add rax, -1          ; same as above
        add rax, 0xffffffffffffffff ; truncated to 32-bit (warning)
        mov eax, 1           ; 5 byte
        mov rax, 1           ; 5 byte (optimized to signed 32-bit)
        mov rax, qword 1     ; 10 byte (forced 64-bit)
        mov rbx, 0x1234567890abcdef ; 10 byte
        mov rcx, 0xffffffff  ; 10 byte (does not fit in signed 32-bit)
        mov ecx, -1          ; 5 byte, equivalent to above
        mov rcx, sym         ; 5 byte, 32-bit size default for symbols
        mov rcx, qword sym   ; 10 byte, override default size

A caution for users using both Yasm and NASM 2.x: the handling of mov reg64, unsized immediate is different between Yasm and NASM 2.x; YASM follows the above behavior, while NASM 2.x does the following:

        add rax, 0xffffffff  ; sign-extended 32-bit immediate
        add rax, -1          ; same as above
        add rax, 0xffffffffffffffff ; truncated 32-bit (warning)
        add rax, sym         ; sign-extended 32-bit immediate
        mov eax, 1           ; 5 byte (32-bit immediate)
        mov rax, 1           ; 10 byte (64-bit immediate)
        mov rbx, 0x1234567890abcdef ; 10 byte instruction
        mov rcx, 0xffffffff  ; 10 byte instruction
        mov ecx, -1          ; 5 byte, equivalent to above
        mov ecx, sym         ; 5 byte (32-bit immediate)
        mov rcx, sym         ; 10 byte (64-bit immediate)
        mov rcx, qword sym   ; 10 byte, same as above