Странное поведение абсолютной адресации

есть такой код:

    bits 64
    section .text
    global _start
_start:
    jmp _end
_end:
    mov rax, 0
    ret

при компиляции получается такой

    _start:
0   jmp 2<_end>
    _end:
2   mov eax,0x0
7   ret

тут видно что адресс метки _end это 2 тогда будет логично что jmp 2 будет то же что и jmp _end

    bits 64
    section .text
    global _start
_start:
    jmp 2
_end:
    mov rax, 0
    ret

на при компиляции уже получается совсем другое и код перестаёт работать так как задумывалось:

    _start:
0   jmp 7<end+0x2>
    _end:
5   mov eax,0x0
a   ret

логично что 0 это адресс метки _start, но когда я пишу:

    bits 64
    section .text
    global _start
_start:
    jmp 0
_end:
    mov rax, 0
    ret

то при компиляции получится что 0 это адрес _end:

    _start:
0   jmp 5<_end>
    _end:
5   mov eax,0x0
a   ret

почему так происходит?


Ответы (0 шт):