# 訊息

## English

``````#include <stdio.h>

int main() {
int x = 1;
int y;
y = f1(x);
printf("y=%d\n", y);
return 1;
}
int f1(int t) {
int b = f2(&t);
return b+b;
}
int f2(int *p) {
int r= *p+5;
return r;
}```
```

``````File:ch03/f2.s                                               ; File:ch03/f2.c
.file    "f2.c"                                      ; #include <stdio.h>
.def    ___main;    .scl    2;    .type    32;    .endef ;
.section .rdata,"dr"                                     ;
LC0:                                                         ;
.ascii "y=%d\12\0"                                       ;
.text                                                    ;
.globl _main                                                 ;
.def    _main;    .scl    2;    .type    32;    .endef   ;
_main:                                                       ; int main() {
pushl    %ebp                                            ; // 保存框架指標
movl    %esp, %ebp                                       ; // 設定堆疊指標
subl    \$24, %esp                                        ; // 分配區域變數空間
andl    \$-16, %esp                                       ;
movl    \$0, %eax                                         ;
addl    \$15, %eax                                        ;
addl    \$15, %eax                                        ;
shrl    \$4, %eax                                         ;
sall    \$4, %eax                                         ;
movl    %eax, -12(%ebp)                                  ;
movl    -12(%ebp), %eax                                  ;
call    __alloca                                         ; // 分配堆積(heap)空間
call    ___main                                          ;
movl    \$1, -4(%ebp)                                     ;     int x = 1;
movl    -4(%ebp), %eax                                   ;     int y;
movl    %eax, (%esp)                                     ;
call    _f1                                              ;     y = f1(x);
movl    %eax, -8(%ebp)                                   ; // y = eax
movl    -8(%ebp), %eax                                   ; // eax = y
movl    %eax, 4(%esp)                                    ; // 參數 y (推入堆疊)
movl    \$LC0, (%esp)                                     ; // 參數 "y=%d\n"
call    _printf                                          ;     printf("y=%d\n", y);
movl    \$1, %eax                                         ; // 設定傳回值 eax=1
leave                                                    ;
ret                                                      ;     return 1;
.globl _f1                                                   ; }
.def    _f1;    .scl    2;    .type    32;    .endef     ;
_f1:                                                         ; int f1(int t) {
pushl    %ebp                                            ; // 保存框架指標
movl    %esp, %ebp                                       ; // 設定堆疊指標
subl    \$8, %esp                                         ; // 分配區域變數空間
leal    8(%ebp), %eax                                    ; // eax = 8(%ebp) 的位址
movl    %eax, (%esp)                                     ; // esp 上移 8 byte
call    _f2                                              ;     int b = f2(&t);
movl    %eax, -4(%ebp)                                   ; // -4(%ebp) 就是 b
movl    -4(%ebp), %eax                                   ; // eax = b
addl    -4(%ebp), %eax                                   ; // eax = eax + b
leave                                                    ;
ret                                                      ;     return b+b;
.globl _f2                                                   ; }
.def    _f2;    .scl    2;    .type    32;    .endef     ;
_f2:                                                         ; int f2(int *p) {
pushl    %ebp                                            ; // 保存框架指標
movl    %esp, %ebp                                       ; // 設定堆疊指標
subl    \$4, %esp                                         ; // 分配區域變數空間
movl    8(%ebp), %eax                                    ;
movl    (%eax), %eax                                     ;
addl    \$5, %eax                                         ;     int r= *p+5;
movl    %eax, -4(%ebp)                                   ; // 設定傳回值 eax=r
movl    -4(%ebp), %eax                                   ;
leave                                                    ;
ret                                                      ;     return r;
.def    _f2;    .scl    3;    .type    32;    .endef     ; }
.def    _printf;    .scl    3;    .type    32;    .endef ;
.def    _f1;    .scl    3;    .type    32;    .endef     ;```
```

# Facebook

page revision: 8, last edited: 11 Oct 2010 07:42
Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License