gpt4 book ai didi

c - 了解以下程序的程序集转储

转载 作者:行者123 更新时间:2023-11-30 18:43:05 25 4
gpt4 key购买 nike

我编写了一个用于打印参数的 C 程序

#include<stdio.h>
void main( int argc, char *argv[])
{
int i=0;
for(i=0;i<argc;i++)
printf("argument %d=%s\n",i,argv[i]);
}

我得到的使用 gdb 的上述程序的程序集转储是。

Dump of assembler code for function main:
0x00000000004004f4 <+0>: push %rbp
0x00000000004004f5 <+1>: mov %rsp,%rbp
0x00000000004004f8 <+4>: sub $0x20,%rsp
0x00000000004004fc <+8>: mov %edi,-0x14(%rbp)
0x00000000004004ff <+11>: mov %rsi,-0x20(%rbp)
0x0000000000400503 <+15>: movl $0x0,-0x4(%rbp)
0x000000000040050a <+22>: movl $0x0,-0x4(%rbp)
0x0000000000400511 <+29>: jmp 0x40053e <main+74>
0x0000000000400513 <+31>: mov -0x4(%rbp),%eax
0x0000000000400516 <+34>: cltq
0x0000000000400518 <+36>: shl $0x3,%rax
0x000000000040051c <+40>: add -0x20(%rbp),%rax
0x0000000000400520 <+44>: mov (%rax),%rdx
0x0000000000400523 <+47>: mov $0x40063c,%eax
0x0000000000400528 <+52>: mov -0x4(%rbp),%ecx
0x000000000040052b <+55>: mov %ecx,%esi
0x000000000040052d <+57>: mov %rax,%rdi
0x0000000000400530 <+60>: mov $0x0,%eax
0x0000000000400535 <+65>: callq 0x4003f0 <printf@plt>
0x000000000040053a <+70>: addl $0x1,-0x4(%rbp)
0x000000000040053e <+74>: mov -0x4(%rbp),%eax
0x0000000000400541 <+77>: cmp -0x14(%rbp),%eax
0x0000000000400544 <+80>: jl 0x400513 <main+31>
0x0000000000400546 <+82>: leaveq
0x0000000000400547 <+83>: retq
End of assembler dump.

现在我想要的是“传递参数的内存位置(地址)。例如,如果我将程序运行为“arg 1”它打印参数。现在我想知道它在哪条指令上提取这个参数,或者哪个寄存器保存参数(如果我传递超过 1 个参数,也采取这种情况..(这会告诉我它所在的内存地址吗?)

最佳答案

I want to know on which instruction it is extracting this argument ,or which register holds the arguments

此类问题的最佳答案是获取目标机器的汇编语言引用手册并进行研究。但是,您的具体问题可以通过检查轻松回答,而无需非常熟悉汇编语言的细节:

0x0000000000400503 <+15>:   movl   $0x0,-0x4(%rbp)
0x000000000040050a <+22>: movl $0x0,-0x4(%rbp)

这是为冗余 i = 0 语句生成的代码。

0x0000000000400513 <+31>:   mov    -0x4(%rbp),%eax

i 的值现在位于 %eax 寄存器中。

0x0000000000400518 <+36>:   shl    $0x3,%rax
0x000000000040051c <+40>: add -0x20(%rbp),%rax

这会计算 argv[i] 的地址并将其放入 %rax 寄存器中。

0x0000000000400520 <+44>:   mov    (%rax),%rdx

这会将 argv[i] 的值加载到 %rdx 寄存器中。以下代码以 iargv[i] 作为参数调用 printf

Now what i want is " The memory locations (addresses) at which the argument is passing.

您无法通过查看 asm 来确定,就像您无法通过查看 asm 来确定 argc 的值一样......这些值会有所不同,并且仅在实际运行时确定程序。如果你想在运行时确定地址,你可以使用

printf("address of argv = %p\n", (void*)argv);

如果这就是您想要的,那么放弃 asm 并了解它的含义是不必要的,并且与您的目标无关。

关于c - 了解以下程序的程序集转储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12679284/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com