首页 > 解决方案 > 为什么我追回一个字符串的反汇编地址时会有一堆0

问题描述

所以我尝试在控制台上使用 gdb 调试我的第一个程序。我能够理解所发布的内容,但我无法弄清楚为什么如果这个地址以一堆 0 开头,它为什么会被移动到 rcx 寄存器中?因此,我尝试进一步查看地址行,实际字符串出现在距离移入 rcx 寄存器的地址 14 个字节的位置。但为什么?我知道有一个来自 GDB 的地址放在那里“0x404000”,这实际上是字符串开始的地方,但是为什么这个地址不被移动到 rcx 寄存器中呢?我希望我能在这里得到答案!

源代码:

#include <stdio.h>

int main()
{
    int i;
    for(i = 0; i < 10; ++i)
    {
        printf("Hello, world!\n");
    }
}

这是main的反汇编:

Dump of assembler code for function main():
0x0000000000401550 <+0>:     push   rbp
0x0000000000401551 <+1>:     mov    rbp,rsp
0x0000000000401554 <+4>:     sub    rsp,0x30
0x0000000000401558 <+8>:     call   0x401640 <__main>
0x000000000040155d <+13>:    mov    DWORD PTR [rbp-0x4],0x0
0x0000000000401564 <+20>:    cmp    DWORD PTR [rbp-0x4],0x9
0x0000000000401568 <+24>:    jg     0x40157c <main()+44>
0x000000000040156a <+26>:    lea    rcx,[rip+0x2a8f]        # 0x404000
0x0000000000401571 <+33>:    call   0x402a70 <puts>
0x0000000000401576 <+38>:    add    DWORD PTR [rbp-0x4],0x1
0x000000000040157a <+42>:    jmp    0x401564 <main()+20>
0x000000000040157c <+44>:    mov    eax,0x0
0x0000000000401581 <+49>:    add    rsp,0x30
0x0000000000401585 <+53>:    pop    rbp
0x0000000000401586 <+54>:    ret
End of assembler dump.

0x403ff3:       0 '\000'        0 '\000'        0 '\000'        0 '\000'        0 '\000'        0 '\000'        0 '\000'        0 '\000'
0x403ffb:       0 '\000'        0 '\000'        0 '\000'        0 '\000'        0 '\000'        72 'H'  101 'e' 108 'l'
0x404003:       108 'l' 111 'o' 44 ','  32 ' '  119 'w' 111 'o' 114 'r' 108 'l'
0x40400b:       100 'd' 33 '!'

标签: cassemblygdbx86-64disassembly

解决方案


推荐阅读