亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

c文件匯編后函數參數傳遞的不同之處

2020-01-26 15:42:25
字體:
來源:轉載
供稿:網友

mac下clang編譯后函數的參數先保存在寄存器中(以一定的規則保存),然后在函數中壓入棧里,
以待后用。例如上篇例子,紅色部分:

復制代碼 代碼如下:

.global _decToBin

 _decToBin:
     pushq     %rbp
     movq    %rsp,%rbp

     movq     %rdi,-8(%rbp) #第一個參數,保存在rdi中
     movq     %rsi,-16(%rbp) #第二個參數,保存在rsi中

     movq    -8(%rbp),%rax
     movq    -16(%rbp),%rbx
     movq    $63,%rcx

......

     popq     %rbp
     ret

而我在w7下使用cygwin安裝的gcc編譯test.c文件:

test.c:

復制代碼 代碼如下:

int hello(int a,int b,int c,int d)
{
    return b;
}

test.c
復制代碼 代碼如下:

.file    "test.c"
    .text
    .globl    _hello
    .def    _hello;    .scl    2;    .type    32;    .endef
_hello:
    pushl    %ebp
    movl    %esp, %ebp
    movl    12(%ebp), %eax #說明參數是函數在使用其值之前就已經壓入棧中
    popl    %ebp
    ret

這說明clang與gcc使用了兩種不同的規則(網上有很多介紹函數值傳遞的不同規則的,我就不介紹了)。
所以不同的平臺不同的編譯器要不同的對待。以上算是上次的不足補充吧。
下面來看看數組:
test.c例子:
復制代碼 代碼如下:

void hello1()
{
    int a[3]={1,2,3};
        int b=a[1];
}
void hello2()
{
    int a[3]={1,2,3};
    int b=*(a+1);
}
void hello3()
{
    int a[3]={1,2,3};
    int b=1[a]; //這也對?
}

如果看的夠仔細的話,三個函數沒什么不同就是對數組a[1]的不同(當然函數名除外).
gcc -S test.c 后:
復制代碼 代碼如下:

.file    "test.c"
    .data
    .align 4
LC0:
    .long    1
    .long    2
    .long    3
    .text
    .globl    _hello1
    .def    _hello1;    .scl    2;    .type    32;    .endef
_hello1:
    pushl    %ebp
    movl    %esp, %ebp
    pushl    %edi
    pushl    %esi
    pushl    %ebx
    subl    $16, %esp
    leal    -28(%ebp), %edx
    movl    $LC0, %ebx
    movl    $3, %eax
    movl    %edx, %edi
    movl    %ebx, %esi
    movl    %eax, %ecx
    rep movsl
    movl    -24(%ebp), %eax
    movl    %eax, -16(%ebp)
    addl    $16, %esp
    popl    %ebx
    popl    %esi
    popl    %edi
    popl    %ebp
    ret
    .globl    _hello2
    .def    _hello2;    .scl    2;    .type    32;    .endef
_hello2:
    pushl    %ebp
    movl    %esp, %ebp
    pushl    %edi
    pushl    %esi
    pushl    %ebx
    subl    $16, %esp
    leal    -28(%ebp), %edx
    movl    $LC0, %ebx
    movl    $3, %eax
    movl    %edx, %edi
    movl    %ebx, %esi
    movl    %eax, %ecx
    rep movsl
    leal    -28(%ebp), %eax
    movl    4(%eax), %eax
    movl    %eax, -16(%ebp)
    addl    $16, %esp
    popl    %ebx
    popl    %esi
    popl    %edi
    popl    %ebp
    ret
    .globl    _hello3
    .def    _hello3;    .scl    2;    .type    32;    .endef
_hello3:
    pushl    %ebp
    movl    %esp, %ebp
    pushl    %edi
    pushl    %esi
    pushl    %ebx
    subl    $16, %esp
    leal    -28(%ebp), %edx
    movl    $LC0, %ebx
    movl    $3, %eax
    movl    %edx, %edi
    movl    %ebx, %esi
    movl    %eax, %ecx
    rep movsl
    movl    -24(%ebp), %eax
    movl    %eax, -16(%ebp)
    addl    $16, %esp
    popl    %ebx
    popl    %esi
    popl    %edi
    popl    %ebp
    ret

只要看紅色的行,我們可以看到25-27行與74-76行一樣,說明hello1與hello3沒什么不同,
效率一樣。而49-52行比他們多了一行,所以*(a+1)比a[1]和1[a]要低一點。
但是我們看下面的例子。
test1.c與test2.c:
復制代碼 代碼如下:

//1--------------
#include <stdlib.h>
void hello()
{
    int *a=(int*)malloc(sizeof(int)*3);
    int b=*(a+1);
    free(a);
}
 //2--------------
#include <stdlib.h>
void hello()
{
    int *a=(int*)malloc(sizeof(int)*3);
    int b=a[1];
    free(a);
}

匯編后完全一樣:
復制代碼 代碼如下:

.file    "main.c"
    .text
    .globl    _hello
    .def    _hello;    .scl    2;    .type    32;    .endef
_hello:
    pushl    %ebp
    movl    %esp, %ebp
    subl    $40, %esp
    movl    $12, (%esp)
    call    _malloc
    movl    %eax, -12(%ebp)
    movl    -12(%ebp), %eax
    movl    4(%eax), %eax
    movl    %eax, -16(%ebp)
    leave
    ret
    .def    _malloc;    .scl    2;    .type    32;    .endef

所以在堆中使用*(a+n)與a[n]沒什么不同,只用在棧中才會有所不同。
學習匯編不是必要,但是它可以讓我們知道效率。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩av三级在线观看| 欧美日韩不卡合集视频| 茄子视频成人在线| 成人黄色中文字幕| 欧美成人精品激情在线观看| 欧美刺激性大交免费视频| 亚洲精品欧美日韩| 午夜精品久久久久久久99热| 在线观看视频99| 国产91色在线|免| 欧美性猛xxx| 日韩一中文字幕| 亚洲国产欧美久久| 久久亚洲春色中文字幕| 综合久久五月天| 色偷偷91综合久久噜噜| 日韩在线免费高清视频| 亚洲国产精品久久久久| 国产精品69久久久久| 久久久久久久电影一区| 亚洲久久久久久久久久| 国产欧美日韩中文字幕| 日韩成人在线视频观看| 国产亚洲综合久久| 姬川优奈aav一区二区| 欧美日本黄视频| 久久精品国产成人精品| 亚洲欧美日韩中文视频| 日韩最新中文字幕电影免费看| 成人高清视频观看www| 欧美日韩在线影院| 欧美精品www在线观看| 亚洲石原莉奈一区二区在线观看| 日韩欧美成人网| 国产精品视频午夜| 在线观看成人黄色| 日韩成人中文字幕| 久久综合久久八八| 国模吧一区二区| 永久免费看mv网站入口亚洲| 91亚洲va在线va天堂va国| 97婷婷大伊香蕉精品视频| 8x拔播拔播x8国产精品| 国产美女久久精品| 亚洲人成网站色ww在线| 欧美黑人狂野猛交老妇| 亚洲影视九九影院在线观看| 色偷偷9999www| 亚洲国产日韩欧美在线动漫| 日韩福利在线播放| 国产亚洲精品激情久久| 日韩中文字幕av| 国产香蕉97碰碰久久人人| 岛国av一区二区| 亚洲综合国产精品| 亚洲国产91色在线| 中文字幕一精品亚洲无线一区| 亚洲精品视频在线观看视频| 亚洲аv电影天堂网| 日本三级久久久| 国产美女精品视频免费观看| 亚洲第一网中文字幕| 日韩av中文在线| 久久久久亚洲精品国产| 日本三级韩国三级久久| 欧美福利在线观看| 91午夜理伦私人影院| 国内自拍欧美激情| 亚洲91精品在线| 亚洲最大福利视频网| 亚洲精品白浆高清久久久久久| 日韩精品在线观看一区二区| 亚洲色图美腿丝袜| 国产综合在线视频| 国语自产精品视频在线看抢先版图片| 大量国产精品视频| 日韩欧美极品在线观看| 免费不卡欧美自拍视频| 2019精品视频| 日韩视频亚洲视频| 国产亚洲精品一区二555| 在线观看欧美日韩国产| 欧美一级片在线播放| 欧美日韩免费网站| 美日韩精品免费观看视频| 青草热久免费精品视频| 国产999在线观看| 国产视频久久久久久久| 91天堂在线观看| 久久久久久国产精品久久| 日韩欧美在线观看视频| 97超视频免费观看| 欧美日韩在线免费观看| 亚洲国产精品网站| 日韩人体视频一二区| 欧美色视频日本高清在线观看| 亚洲精品免费一区二区三区| 亚洲精品自产拍| 精品毛片三在线观看| 国产成人久久久| 97超视频免费观看| 97久久精品人搡人人玩| 国产精品久久久久久久天堂| 国产欧美va欧美va香蕉在| 欧亚精品中文字幕| 高清欧美一区二区三区| 亚洲欧美成人在线| 美日韩精品免费视频| 国产成人精品a视频一区www| 福利一区福利二区微拍刺激| 欧美一区第一页| 成人综合国产精品| 136fldh精品导航福利| 欧美成人精品一区二区三区| 久久91亚洲精品中文字幕奶水| 成人动漫网站在线观看| 8090理伦午夜在线电影| 日韩h在线观看| 九九热最新视频//这里只有精品| 亚洲美女又黄又爽在线观看| 亚洲成人在线视频播放| 久久精品视频导航| 国产啪精品视频| 久久久久久久久国产| 97视频免费在线观看| 日韩视频免费中文字幕| 成人网欧美在线视频| 国产精品丝袜久久久久久不卡| 亚洲福利影片在线| 亚洲欧美中文字幕| 国产精品一区二区三| 成人h片在线播放免费网站| 国产亚洲精品久久久久久牛牛| 美女啪啪无遮挡免费久久网站| 91国产美女在线观看| 日本免费一区二区三区视频观看| 国产精品久久久久一区二区| 国产精品影片在线观看| 久色乳综合思思在线视频| 91成人在线播放| 亚洲国产精久久久久久久| 欧美久久精品一级黑人c片| 亚洲一区二区三区视频播放| 亚洲成年人在线播放| 亚洲一区美女视频在线观看免费| 国产精品旅馆在线| 26uuu久久噜噜噜噜| 国产成人午夜视频网址| 亚洲a在线播放| 亚洲欧美一区二区激情| 亚洲国产欧美在线成人app| 成人黄色av免费在线观看| 久久久日本电影| 亚洲精品久久久久中文字幕欢迎你| 欧美精品在线免费观看| 色七七影院综合| 久久精品小视频| 日本欧美黄网站| 色99之美女主播在线视频| 国产第一区电影| 亚洲影视九九影院在线观看| 午夜精品蜜臀一区二区三区免费| 国产亚洲aⅴaaaaaa毛片| 亚洲成人国产精品|