当我跟踪字符串的反汇编地址时,为什么会有一堆0

时间:2018-08-29 19:25:22

标签: c assembly gdb x86-64 disassembly

因此,我尝试在控制台上使用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 '!'

0 个答案:

没有答案