Уча 64-битов nasm, сглобявам .nasm файла, който съдържа САМО 64-битови регистри, като правя следното
nasm -f elf64 HelloWorld.nasm -o HelloWorld.o
и го свържете, като направите следното
ld HelloWorld.o -o HelloWorld
програмата работи правилно и дори казва, че е 64-битов ELF, когато стартирам командата file
, но когато използвам objdump
или gdb
за разглобяване на изпълнимия файл, регистрите, които поставям като 64-битови регистри в кода, се показват като 32- битови регистри при разглобяване. (пример: rax
в източника се показва като eax
при разглобяване)
Защо е това?
Това не се случва само на един компютър и е нов проблем, не се е случвало преди.
HelloWorld.nasm:
global _start
section .text
_start:
mov rax, 1
mov rdi, 1
mov rsi, hello_world
mov rdx, length
syscall
mov rax, 60
mov rdi, 11
syscall
section .data
hello_world: db 'Hello World',0xa
length: equ $-hello_world
Разглобен HelloWorld:
...
00000000004000b0 <_start>:
4000b0: b8 01 00 00 00 mov eax,0x1
4000b5: bf 01 00 00 00 mov edi,0x1
4000ba: 48 be d8 00 60 00 00 movabs rsi,0x6000d8
4000c1: 00 00 00
4000c4: ba 0c 00 00 00 mov edx,0xc
4000c9: 0f 05 syscall
4000cb: b8 3c 00 00 00 mov eax,0x3c
4000d0: bf 0b 00 00 00 mov edi,0xb
4000d5: 0f 05 syscall
...