Итак, я попытался отладить свою первую программу с помощью gdb на консоли. Я был в состоянии понять, что было выпущено, но я не мог понять, почему этот адрес перемещается в регистр rcx, если он начинается с набора из 0? Поэтому я попытался заглянуть дальше вниз по адресной строке, и фактическая строка появляется в 14 байтах от адреса, который перемещается в регистр rcx. Но почему? Я знаю, что есть адрес из GDB, помещенный туда "0x404000", и это фактически место, где начинается строка, но почему этот адрес не перемещается в регистр rcx? Я надеюсь, что я получу ответ здесь!
Исходный код:
#include <stdio.h>
int main()
{
int i;
for(i = 0; i < 10; ++i)
{
printf("Hello, world!\n");
}
}
Вот разборка основного:
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 '!'