gpt4 book ai didi

linux - NASM:将指针从寄存器复制到 .data 中的缓冲区

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:09:13 24 4
gpt4 key购买 nike

我是 asm 的新手。我正在尝试在 64 位 Linux 上使用 NASM 将指针从寄存器复制到 .data 变量。

考虑这个程序:

    section .data
ptr: dq 0

section .text
global _start

_start:
mov [ptr], rsp

mov rax, 60
mov rdi, 0
syscall

这里我尝试将当前堆栈指针复制到ptrptr 声明为四字。 nasm 和链接器都没有提示,但是当用 gdb 调试程序时,我可以看到两个地址不同:

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

据我了解,mov 应该将所有 64 位从 rsp 复制到 [ptr],但似乎最重要的 0 未被复制和/或存在某种符号扩展,就好像只复制了最低有效位。

最佳答案

问题是,您没有 ptr 类型的调试信息,因此 gdb 将其视为整数。您可以使用以下方法检查其真实内容:

(gdb) x/a &ptr
0x600124 <ptr>: 0x7fffffffe950
(gdb) p/a $rsp
$3 = 0x7fffffffe950

当然,我对 rsp 的值与您不同,但您可以看到 ptrrsp 匹配。

关于linux - NASM:将指针从寄存器复制到 .data 中的缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30982992/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com