2017-05-27 97 views
1

内部访问参数I具有main.c文件c - 接收功能

int boyut(const char* string); 

char greeting[6] = {"Helle"}; 
int main(){ 
    greeting[5] = 0x00; 
    int a = boyut(greeting); 
    return 0; 
} 

int boyut(const char* string){ 
    int len=0; 
    while(string[len]){ 
     len++; 
    } 
    return len; 
} 

我与GCC命令gcc -Wall -m32 -nostdlib main.c -o main.o 当我检查拆卸,我看到变量greeting置于.data段编译它。在致电boyut之前,它没有被推入堆栈。在boyut函数内部,它的作用就像变量greeting处于堆栈段。所以这个变量实际上不在函数内部被访问。为什么它会生成这样的代码?我该如何解决这个问题?

Disassembly of section .text: 

080480f8 <main>: 
80480f8: 55      push ebp 
80480f9: 89 e5     mov ebp,esp 
80480fb: 83 ec 18    sub esp,0x18 
80480fe: c6 05 05 a0 04 08 00 mov BYTE PTR ds:0x804a005,0x0 
8048105: 83 ec 0c    sub esp,0xc 
8048108: 68 00 a0 04 08   push 0x804a000 
804810d: e8 0d 00 00 00   call 804811f <boyut> 
8048112: 83 c4 10    add esp,0x10 
8048115: 89 45 f4    mov DWORD PTR [ebp-0xc],eax 
8048118: b8 00 00 00 00   mov eax,0x0 
804811d: c9      leave 
804811e: c3      ret  

0804811f <boyut>: 
804811f: 55      push ebp 
8048120: 89 e5     mov ebp,esp 
8048122: 83 ec 10    sub esp,0x10 
8048125: c7 45 fc 00 00 00 00 mov DWORD PTR [ebp-0x4],0x0 
804812c: eb 04     jmp 8048132 <boyut+0x13> 
804812e: 83 45 fc 01    add DWORD PTR [ebp-0x4],0x1 
8048132: 8b 55 fc    mov edx,DWORD PTR [ebp-0x4] 
8048135: 8b 45 08    mov eax,DWORD PTR [ebp+0x8] 
8048138: 01 d0     add eax,edx 
804813a: 0f b6 00    movzx eax,BYTE PTR [eax] 
804813d: 84 c0     test al,al 
804813f: 75 ed     jne 804812e <boyut+0xf> 
8048141: 8b 45 fc    mov eax,DWORD PTR [ebp-0x4] 
8048144: c9      leave 
8048145: c3      ret  

main.o:  file format elf32-i386 

Contents of section .data: 
804a000 48656c6c 6500      Helle. 
+0

用'gcc -Wall -m32 -O1 -fverbose-asm -S main.c'编译,然后查看生成的'main.s'汇编文件 –

+0

并研究系统的ABI规范 –

+3

'push 0x804a000' < =这似乎在推送“问候”的地址。当然,如果你检查'.o'文件,你不应该忘记你仍然需要链接(从而符号重定位)。我想你应该看到一个占位符'推$ 0x0'。 – dhke

回答

0

功能boyut可以声明如下:

int boyut(const char* string); 

这意味着:boyut采用指向char并返回一个int。事实上,编译器将一个点推到堆栈上的char。该指针指向greeting的开头。发生这种情况是因为在C中,在大多数情况下,数组会隐式转换为指向其第一个元素的指针。

如果你想传递一个数组到一个函数,所以它被复制到函数中,你必须将数组包装到一个结构中并传递它。