我目前正在研究 gdb 反汇编,以帮助我了解有关 c 程序的更多细节,因此我编写了 ac 程序:
#include <stdio.h>
void swap(int a, int b){
int temp = a;
a = b;
b = temp;
}
void main(){
int a = 1,b = 2;
swap(a, b);
}
Run Code Online (Sandbox Code Playgroud)
我使用 gdb 并运行disass /m main
来获取这些:
(gdb) disass /m main
Dump of assembler code for function main:
8 void main(){
0x0000000000400492 <+0>: push %rbp
0x0000000000400493 <+1>: mov %rsp,%rbp
0x0000000000400496 <+4>: sub $0x10,%rsp
9 int a = 1,b = 2;
0x000000000040049a <+8>: movl $0x1,-0x8(%rbp) …
Run Code Online (Sandbox Code Playgroud) 这是我的源代码:
char *
cpy_strcpy (dest, src)
char *dest;
const char *src;
{
char c;
char *s = (char *) src;
const ptrdiff_t off = dest - s - 1;
do
{
//c = *s++
//s[off] = c;
s[off] = *s;
}
while (*s++ != '\0');
//while( c != '\0' );
return dest;
}
Run Code Online (Sandbox Code Playgroud)
当我使用gdb调试它时,我得到了这个:
(gdb) s
26 while (*s++ != '\0');
(gdb)
27 return dest;
(gdb)
28 }
(gdb)
Program received signal SIGSEGV, Segmentation fault.
0x000000000040050a in cpy_strcpy (dest=can't compute …
Run Code Online (Sandbox Code Playgroud)