全域性變數和區域性變數

2021-10-08 20:48:00 字數 1287 閱讀 1736

我們來了解一下全域性變數和區域性變數,在函式外部定義的變數稱為全域性變數 ,在函式內部定義的變數稱為區域性變數,全域性變數可以在任意函式中使用,區域性變數只能在函式定義區域性變數的內部使用。下面,我們就通過組合語言來看一下全域性變數和區域性變數的不同之處。下面定義的c語言**分別定義了區域性變數和全域性變數,並且給各變數進行了賦值,我們先看一下源**部分:

上面的**挺暴力的,不過沒關係,能夠便於我們分析其彙編原始碼就好,我們用borland c++編譯後的彙編**如下,編譯完成後的原始碼比較長,這裡我們只拿出來一部分作為分析使用(我們改變了一下段定義順序,刪除了部分注釋)

編譯後的程式,會被歸類到名為段定義的組。

我們在分析上面彙編**之前,先來認識幾個彙編指令

我們首先來看一下_data 段定義的內容。_ al label dword定義了。_a1 這個標籤。 標籤表示的是相對於段定義起始位置的位置。由於_a1 在_data 段定義的開頭位置,所以相對位置是0。

_a1就相當於是全域性變數a1。編譯後的函式名和變數名前面會加乙個( _),這也是borland c++的規定。dd 1指的是,申請分配了4位元組的記憶體空間,儲存著1這個初始值。dd指的是 define double word 表示有兩個長度為2的位元組領域(word),也就是4位元組的意思。

borland c++中,由於int型別的長度是4位元組,因此彙編器就把inta1= 1變換成了_a1 label dword和dd 1。同樣,這裡也定義了相當於全域性變數的a2 - a5的標籤_a2 - _a5,它們各自的初始值2 - 5也被儲存在各自的4位元組中。

接下來,我們來說一說 _bss 段定義的內容。這裡定義了相當於全域性變數b1 - b5的標籤 _b1 - _b5 。其中的db 4dup(?)表示的是申請分配了4位元組的領域,但值尚未確定(這裡用?來表示)的意思。db(define byte)表示有1個長度是1位元組的記憶體空間。 因而,db 4 dup(?)的情況下,就是4位元組的記憶體空間。

全域性變數和區域性變數

全域性變數 可以被不同的函式 類或檔案呼叫的變數,在函式外定義。區域性變數 只能在函式內使用,定義在函式內。區域性變數的使用 class myclass def myfun num 12 print myfun num num 正確 def myfun2 num num 1 print mufun ...

全域性變數和區域性變數

區域性變數 在方法中開闢的變數,只在方法中有效 區域性變數在定義時不會初始化,要顯式的給它乙個值 如未給它乙個初始值,雖然編譯的時候會通過,但是執行的時候會產生為初始化錯誤!方法呼叫 執行完,區域性變數便會自動釋放。在方法內的語句塊中建立的變數在編譯時假如未初始,如若使用,也會報未初始化錯誤!呼叫的...

全域性變數和區域性變數

通常的認為是定義在函式外面的就稱之為全域性變數 函式體內的稱之為區域性變數 在函式中與全域性變數同名的時候 情形1 函式內部的變數名如果第一次出現,且出現在 前面,即被視為定義乙個區域性變數。num 100 定義乙個全域性變數 defdemo num 100 這裡面的實際上是定義了乙個區域性的變數 ...