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

首頁 > 編程 > C > 正文

淺談C語言函數調用參數壓棧的相關問題

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

參數入棧的順序

以前在面試中被人問到這樣的問題,函數調用的時候,參數入棧的順序是從左向右,還是從右向左。參數的入棧順序主要看調用方式,一般來說,__cdecl 和__stdcall 都是參數從右到左入棧。

看下面的代碼:

#include <stdio.h>int test(int a, int b){  printf("address of a %x./n", &a);  printf("address of b %x./n", &b);  return 0;}int main(){  test(1, 2);  return 0;}

在64位Ubuntu的系統下的運行結果是:

address of a 1ec62c. address of b 1ec628.

32位Ubuntu的結果是:

address of a bfd03290. address of b bfd03294.

可以看出,首先,不同的體系結構,棧增長的方向也不同,有的是從低地址向高地址方向增長,有的是從高地址向低地址方向增長。

可以用以下的代碼來判斷棧的增長方向:

typedef enum {  LOW_TO_HIGH,  HIGH_TO_LOW,  LEFT_TO_RIGHT,  RIGHT_TO_LEFT,}stack_direc_t;int stack_grow_direc(){  static char *p = NULL;  char c;  if (p == NULL) {    p = &c;    stack_grow_direc();  }  else {    printf("First in stack address is %x./n", p);    printf("Second in stack address is %x./n", &c);    if (&c > p) {      printf("Stack grows from low address to high address!/n");      return LOW_TO_HIGH;    }    else {      printf("Stack grows from high address to low address!/n");      return HIGH_TO_LOW;    }  }}

函數調用時棧里都有什么

以參數從左到右入棧為例:

push arg0 -- High Addresspush arg1...push argnpush eippush ebp -- Low address

32位系統和64位系統函數調用時,參數入棧方式有不同么?

這個問題在不久之前被人問題,當時傻了,我一直以來只關注過32位系統的參數入棧方式,一直以為64位系統也是一樣,沒有什么不同,現在歸納起來有兩點:

64位系統先把傳入參數放在寄存器里面,在被調函數的具體實現中把寄存器的值入棧,然后再去棧中取參數

64位系統棧中參數存放的順序是從左至右的(因為先經歷了寄存器傳值)

看下面的反匯編:

C代碼同上面一樣Ubuntu 32位反匯編:int main(){ 804846d:  55           push  %ebp 804846e:  89 e5          mov  %esp,%ebp 8048470:  83 e4 f0        and  $0xfffffff0,%esp 8048473:  83 ec 10        sub  $0x10,%esp  test(1, 2); 8048476:  c7 44 24 04 02 00 00  movl  $0x2,0x4(%esp) 804847d:  00  804847e:  c7 04 24 01 00 00 00  movl  $0x1,(%esp) 8048485:  e8 8a ff ff ff     call  8048414 <test>  return 0; 804848a:  b8 00 00 00 00     mov  $0x0,%eax}int test(int a, int b){ 8048414:  55           push  %ebp 8048415:  89 e5          mov  %esp,%ebp 8048417:  83 ec 18        sub  $0x18,%esp  printf("address of a %x./n", &a); 804841a:  b8 60 85 04 08     mov  $0x8048560,%eax 804841f:  8d 55 08        lea  0x8(%ebp),%edx 8048422:  89 54 24 04       mov  %edx,0x4(%esp) 8048426:  89 04 24        mov  %eax,(%esp) 8048429:  e8 12 ff ff ff     call  8048340 <printf@plt>  return 0; 8048466:  b8 00 00 00 00     mov  $0x0,%eax}Ubuntu 64位反匯編:int main(){ 40056e:  55           push  %rbp 40056f:  48 89 e5        mov  %rsp,%rbp  test(1, 2); 400572:  be 02 00 00 00     mov  $0x2,%esi 400577:  bf 01 00 00 00     mov  $0x1,%edi 40057c:  e8 ac ff ff ff     callq 40052d <test>  return 0; 400581:  b8 00 00 00 00     mov  $0x0,%eax}int test(int a, int b){ 40052d:  55           push  %rbp 40052e:  48 89 e5        mov  %rsp,%rbp 400531:  48 83 ec 10       sub  $0x10,%rsp 400535:  89 7d fc        mov  %edi,-0x4(%rbp) 400538:  89 75 f8        mov  %esi,-0x8(%rbp)  printf("address of a %x./n", &a); 40053b:  48 8d 45 fc       lea  -0x4(%rbp),%rax 40053f:  48 89 c6        mov  %rax,%rsi 400542:  bf 14 06 40 00     mov  $0x400614,%edi 400547:  b8 00 00 00 00     mov  $0x0,%eax 40054c:  e8 bf fe ff ff     callq 400410 <printf@plt>  return 0; 400567:  b8 00 00 00 00     mov  $0x0,%eax}

看32位的ubuntu操作系統, 8048476: 的確是把參數直接入棧,2先入棧,1后入棧。

 8048476:  c7 44 24 04 02 00 00  movl  $0x2,0x4(%esp) 804847d:  00  804847e:  c7 04 24 01 00 00 00  movl  $0x1,(%esp) 8048485:  e8 8a ff ff ff     call  8048414 <test>

再來看64位的ubuntu操作系統,2 和1根本就沒有放入到棧中,而是放到了寄存器esi和edi中。

 40056f:  48 89 e5        mov  %rsp,%rbp test(1, 2); 400572:  be 02 00 00 00     mov  $0x2,%esi 400577:  bf 01 00 00 00     mov  $0x1,%edi 40057c:  e8 ac ff ff ff     callq 40052d <test>

再來看64位系統test的實現,先把edi入棧,再把esi入棧,這就是為什么函數看起來像是從左到右入棧的原因了。

40052d:  55           push  %rbp40052e:  48 89 e5        mov  %rsp,%rbp400531:  48 83 ec 10       sub  $0x10,%rsp400535:  89 7d fc        mov  %edi,-0x4(%rbp)400538:  89 75 f8        mov  %esi,-0x8(%rbp)

以上就是小編為大家帶來的淺談C語言函數調用參數壓棧的相關問題的全部內容了,希望對大家有所幫助,多多支持武林網~

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

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品久久久亚洲| 亚洲国产成人久久综合一区| 久久久精品999| 欧美成人第一页| 日韩欧美在线视频免费观看| 2019日本中文字幕| 福利精品视频在线| 亚洲第一福利网| 日本一区二区在线免费播放| 国内免费精品永久在线视频| 欧美日韩视频免费播放| 亚洲性69xxxbbb| 911国产网站尤物在线观看| 中文字幕免费精品一区| 午夜精品久久久久久久99热| 免费不卡在线观看av| 久久精品国产精品| 国产色婷婷国产综合在线理论片a| 欧美成人在线网站| 久久久在线视频| 久久精品这里热有精品| 91爱爱小视频k| 最新69国产成人精品视频免费| 日韩成人激情视频| 国产情人节一区| 欧美日韩国产va另类| 色七七影院综合| 日韩极品精品视频免费观看| 国产精品成人一区| 日韩欧美高清在线视频| 亚洲激情在线观看| 国产精品网址在线| 2019中文字幕在线免费观看| 国产一区二区三区日韩欧美| 亚洲色图在线观看| 草民午夜欧美限制a级福利片| 亚洲精品美女免费| 97精品一区二区视频在线观看| 成人免费视频在线观看超级碰| 日韩一区二区av| 2019中文字幕全在线观看| 亚洲毛茸茸少妇高潮呻吟| 91在线|亚洲| 色av吧综合网| 国产精品日日做人人爱| 国产精品老牛影院在线观看| 日韩美女免费视频| 57pao国产成人免费| 欧洲永久精品大片ww免费漫画| 91麻豆国产语对白在线观看| 亚洲韩国欧洲国产日产av| 国产精品www网站| 欧美性感美女h网站在线观看免费| 国产精品欧美一区二区| 国产精品视频在线播放| 人人爽久久涩噜噜噜网站| 国产精品第1页| 欧美日韩中文字幕日韩欧美| 秋霞午夜一区二区| 欧美成人手机在线| 91精品国产777在线观看| 欧美一性一乱一交一视频| 成人www视频在线观看| 日韩av理论片| 91精品国产综合久久久久久蜜臀| 色系列之999| 欧美大成色www永久网站婷| 2019中文字幕在线| 亚洲激情视频在线观看| 欧美人交a欧美精品| 一区国产精品视频| 精品二区三区线观看| 欧美性xxxxx极品娇小| 亚洲精品久久7777777| 91色p视频在线| 亚洲精品乱码久久久久久按摩观| 亚洲精品按摩视频| 日韩视频―中文字幕| 日韩精品在线视频美女| 国产在线98福利播放视频| 成人免费午夜电影| 97国产精品久久| 成年人精品视频| 97欧美精品一区二区三区| 亚洲社区在线观看| 91精品国产沙发| 日韩精品电影网| 欧美香蕉大胸在线视频观看| 日韩中文字幕网址| 国产精品第七影院| 国产精品999999| 亚洲在线免费视频| 亚洲韩国欧洲国产日产av| 国产亚洲精品91在线| 成人黄色中文字幕| 日韩精品久久久久久福利| 51久久精品夜色国产麻豆| 欧美丰满少妇xxxx| 欧美刺激性大交免费视频| 欧美性生活大片免费观看网址| 国产三级精品网站| 国产亚洲欧美一区| 亚洲日韩中文字幕| 亚洲精品国产综合区久久久久久久| 成人高清视频观看www| 午夜精品久久久久久久久久久久久| 日韩av一卡二卡| 亚洲第一国产精品| 日本一区二区三区在线播放| 日本一区二三区好的精华液| 色午夜这里只有精品| 久久福利网址导航| 亚洲国产中文字幕久久网| 亚洲aa在线观看| 久久久久中文字幕2018| 色视频www在线播放国产成人| 欧美在线观看一区二区三区| 成人激情av在线| 97av在线视频免费播放| 亚洲激情在线视频| 亚洲美女视频网| 中文字幕国产亚洲2019| 亚洲成人999| 91a在线视频| 日韩最新av在线| 成人网欧美在线视频| 欧美亚洲一级片| 中文国产亚洲喷潮| 91精品国产91久久久久久不卡| 97国产精品视频| 亚洲永久免费观看| 精品在线小视频| 亚洲精品一区久久久久久| 午夜精品久久久久久99热软件| 日韩精品视频中文在线观看| 欧美www视频在线观看| 日韩高清中文字幕| 亚洲欧美在线看| 丝袜亚洲欧美日韩综合| 欧美一级淫片aaaaaaa视频| 亚洲精品网址在线观看| 91精品国产综合久久久久久久久| 成人免费看片视频| 亚洲伊人久久大香线蕉av| 亚洲天堂男人的天堂| 91精品国产免费久久久久久| 亚洲老头老太hd| 亚洲影院在线看| 色婷婷av一区二区三区在线观看| 久久艹在线视频| 国内外成人免费激情在线视频| www亚洲精品| 免费91麻豆精品国产自产在线观看| 国产精品日韩av| 亚洲精品欧美一区二区三区| 国产日韩欧美中文在线播放| 26uuu另类亚洲欧美日本老年| 国产亚洲欧美视频| 色综合伊人色综合网站| 国产精品69久久久久| 日韩亚洲成人av在线| 中文字幕精品国产| 久久免费高清视频| 欧美在线观看视频|