I am new to asm. I am trying to copy a pointer from a register to a
.data variable using NASM, on linux 64-bit.
Concider this program:
section .data ptr: dq 0 section .text global _start _start: mov [ptr], rsp mov rax, 60 mov rdi, 0 syscall
Here I try to copy the current stack pointer to
ptr is declared as a quadword. Neither
nasm nor the linker complains, but when debugging the program with gdb, I can see that both addresses are different:
gdb ./test.s +(gdb) break _start Breakpoint 1 at 0x4000b0 +(gdb) run Starting program: test Breakpoint 1, 0x00000000004000b0 in _start () +(gdb) nexti 0x00000000004000b8 in _start () +(gdb) info registers ... rsp 0x7fffffffe460 0x7fffffffe460 ... +(gdb) x ptr 0xffffffffffffe460: Cannot access memory at address 0xffffffffffffe460
From what I understand,
mov should copy all 64 bits from
[ptr], but it seems that the most significant
0s are not copied and/or that there is some kind of sign extension, as if only the least significant bits were copied.