Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 了解';堆栈';进入标签时显示在gdb中_Assembly_X86_Stack_Gdb - Fatal编程技术网

Assembly 了解';堆栈';进入标签时显示在gdb中

Assembly 了解';堆栈';进入标签时显示在gdb中,assembly,x86,stack,gdb,Assembly,X86,Stack,Gdb,我有以下大会: _start: mov $strings, %rbx mov $1, %r12d print_loop: mov %rbx, %rdi 这很简单,但以下是它在gdb中为这三行/指令中的每一行显示的内容: mov$字符串,%rbx 0x00000000004000c4 ? mov $0x6000ea,%rbx # memory address of 'strings' ─── Stack ───────

我有以下大会:

_start:    
    mov $strings,   %rbx
    mov $1,         %r12d
  print_loop:
    mov %rbx,       %rdi
这很简单,但以下是它在
gdb
中为这三行/指令中的每一行显示的内容:

  • mov$字符串,%rbx

    0x00000000004000c4  ? mov    $0x6000ea,%rbx # memory address of 'strings'
    
    ─── Stack ──────────────────────────────────────────────────────────────────────────────────────────────────────
    [0] from 0x00000000004000c4 in _start
    
  • mov$1,%r12d

    0x00000000004000cb  ? mov    $0x1,%r12d
    
    ─── Stack ───────────────────────────────────────────────────────────────────────────────────────────────────────
    [0] from 0x00000000004000cb in _start
    
  • 但是,在第三条指令上——标签后面的第一条指令上——事情看起来不稳定:

    0x00000000004000d1  ? mov    %rbx,%rdi
    
    ─── Stack ───────────────────────────────────────────────────────────────────────────────────────────────────────
    [0] from 0x00000000004000d1 in print_loop
    [1] from 0x0000000000000001
    [2] from 0x00007fffffffe5aa
    [3] from 0x0000000000000000
    
  • 这到底是什么意思?为什么会出现这样的情况?堆栈似乎仍应显示一行:

    [0] from 0x00000000004000d1 in print_loop
    - or - 
    [0] from 0x00000000004000d1 in _start
    
    这到底是什么意思

    这意味着GDB认为您在
    print_loop
    函数内执行,并且认为该函数是从地址
    0x1
    处的某个代码调用的,该地址是从地址
    0x7fffffe5aa
    等处调用的

    为什么会出现这样的情况

    它是混乱的

    堆栈似乎仍应显示一行:

    [0] from 0x00000000004000d1 in print_loop
    - or - 
    [0] from 0x00000000004000d1 in _start
    


    现在,您的下一个问题可能是“为什么GDB会感到困惑?”

    答案有点复杂

    在不使用专用帧指针寄存器的平台上,例如
    x86_64
    ,GDB没有通用的方法来展开堆栈,因此需要编译器的帮助。编译器创建“展开表”,GDB将其解释为执行堆栈展开

    由于您是在汇编中编写的,并且没有使用
    .cfi.
    指令,因此您的代码没有任何展开描述符

    在没有展开描述符的情况下,GDB只能猜测,这里的猜测是错误的

    要解决此问题,您可以提供展开描述符,类似以下内容(未测试):


    这应该会取消GDB。可以找到各种
    .cfi
    指令的文档。

    GDB特例
    \u启动
    时,是否在堆栈内部执行时不尝试展开堆栈?因为它知道堆栈内容将是
    argc
    argv[]
    …是
    .cfi
    是“调用帧”的缩写,或者这些指令通常与什么有关?@samuelbrody1249我相信
    cfi
    代表“调用帧信息”@samuelbrody1249:google快速搜索
    站点:stackoverflow.com cfi指令
    可以找到一堆东西,包括回答这个问题的东西。看看。一般来说,在让其他人花时间回答评论之前,试着用谷歌搜索你的问题,尤其是广泛的问题。