程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 關於C語言函數調用壓棧和返回值問題的疑惑,函數返回值

關於C語言函數調用壓棧和返回值問題的疑惑,函數返回值

編輯:關於C語言

關於C語言函數調用壓棧和返回值問題的疑惑,函數返回值


按照C編譯器的約定調用函數時壓棧的順序是從右向左,並且返回值是保存在eax寄存器當中。這個命題本該是成立的,下面用一個小程序來反匯編觀察執行過程:

#include<stdio.h>

int add(int x, int y){
	return x+y;
}

int main(){
	int eax=0;
	int z =0;
	int x =6;
	int y =5;

	z=add(x,y);

	__asm__(
					"movl %%eax, %0"
				:"+b"(eax)
				:"m"(x)
					);

	printf("z is %d\n", z);
	printf("eax is %d\n", eax);
	return 0;
}

代碼解釋一下,asm的代碼中movl %%eax, %0的意思是把寄存器eax的值賦值給咱們程序的eax變量當中。但為什麼執行結果卻是:

z is 11
eax is 0

理論上應該是x和y相加返回的結果才對啊。反匯編一下此exe程序:

上面是main函數

所以這裡就解釋了先把y壓棧,再把x壓棧,確實是從右向左壓棧

接下來再看add調用:

先取了y的值再取x的值,相加後結果保存在eax裡。然後再回到main函數

調用完add後把eax的值賦值給了z,這就說明函數的返回值確實是保存在eax中。但為什麼打印出來的eax卻是0呢。

接著往下看,

首先把程序中eax變量的值賦給了eax寄存器,那當然就是0了。所以現在深入理解了C語言嵌入匯編的執行過程,就算指定了"+b"賦給ebx寄存器,但編譯器還是會先把變量的值賦給eax寄存器,再賦值給ebx,返回也是一樣的原理,如下圖:

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved