C - 访问函数内部的参数

时间:2017-05-27 17:25:13

标签: c gcc assembly

我有main.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. 

1 个答案:

答案 0 :(得分:0)

函数boyut的声明如下:

int boyut(const char* string);

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

如果要将数组传递给函数以便将其复制到函数中,则必须将数组包装到结构中并传递它。