c - 为什么我追回一个字符串的反汇编地址时会有一堆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 '!'
解决方案
推荐阅读
- unity3d - Unity 2019.3.11.f1 + Unity 输入系统 1.0.0 + Unity Remote 5 + iPhone 8 触摸屏不工作
- codeigniter - sitemap.xml 中的内部链接
- php - 无法加载动态库“php_wincache.dll”(更新问题)
- python - SQL Alchemy 查询 Oracle 日期时间过滤器
- javascript - 使用 Google 地球引擎从 Javascript 中的字典中提取数字
- compression - 如果你丢失了 ZST 存档的训练字典,你还能解压它吗?
- angular - Angular Cdk 拖放,等长列表
- javascript - 检查给定的整数数组是否包含两次特定数字
- nginx - nginx服务器多位置反向代理
- python - 来自多个路径的内容的 zipfile 列表