亚洲一级电影在线观看,九九精品无码专区免费,亚洲AV无码资源在线观看 ,欧美国产高清

華為面試題:怎樣判斷棧的增長方向

時間:2024-08-07 18:32:14 華為認證 我要投稿
  • 相關(guān)推薦

華為面試題:怎樣判斷棧的增長方向

  在華為面試中有這么一道考試,請給出棧增長方向的判斷方法。下面一起來看看這道題的參考答案,僅供大家參考!

華為面試題:怎樣判斷棧的增長方向

  該題目屬于考查計算機組成原理中棧結(jié)構(gòu)知識的題目。其參考答案如下:

  可以編寫一個帶有過程(函數(shù))調(diào)用的C程序,然后按照以下方法進行判斷(采用類似思想,還可以寫出許多答案)。

  方法一:通過比較被調(diào)用過程中的入口參數(shù)所在地址和局部變量所在地址之間的大小來判斷。若入口參數(shù)所在地址大于局部變量所在地址,則棧是向低地址增長的。

  方法二:直接閱讀匯編指令來判斷。例如,在IA-32中,如果在一個過程的開始階段(準備段)出現(xiàn)類似“sub $0x10,%esp”指令,說明棧頂指針(%esp)是變小的,因此棧是向低地址增長的。

  方法三:顯示棧頂指針寄存器的內(nèi)容。在某個過程的開始階段和結(jié)束階段分別顯示棧頂指針寄存器的內(nèi)容,比較它們的大小。若開始處的值比結(jié)束處的大,則說明棧是向低地址增長的。

  后面兩種方法,需要對程序的機器級代碼(匯編指令)進行調(diào)試,例如,利用Linux系統(tǒng)中的程序調(diào)試工具軟件GDB進行調(diào)試。

  該題是開放題目,答案應(yīng)該沒有唯一性。通過這個題目的回答可以考查出學生對計算機系統(tǒng)中棧結(jié)構(gòu)的掌握情況。

  棧是存儲空間中的一個區(qū)域,分用戶棧和內(nèi)核棧兩種類型。用戶棧主要用來存放用戶進程每次過程(函數(shù))調(diào)用時,在被調(diào)用過程中使用的局部信息,每次過程調(diào)用都在棧中生長出一個新的棧幀,因此,棧幀是通過執(zhí)行相應(yīng)的指令動態(tài)生長出來的;內(nèi)核棧是操作系統(tǒng)內(nèi)核中的動態(tài)存儲區(qū)域,用于保存操作系統(tǒng)內(nèi)核和硬件所需要的動態(tài)信息。

  在采用虛擬存儲管理機制的系統(tǒng)中,內(nèi)核棧和用戶棧都是虛擬地址空間中的一個存儲區(qū)。每個源程序經(jīng)編譯、匯編、鏈接等處理生成可執(zhí)行的二進制機器目標代碼時,每個程序的目標代碼都被映射到同樣的虛擬地址空間,所有用戶進程的虛擬地址空間是一致的。例如,圖1給出了在IA32/Linux操作系統(tǒng)下hello程序的一個進程對應(yīng)的虛擬地址空間映像。它分為兩大部分:內(nèi)核區(qū)(kernelarea)和用戶區(qū)(userarea)。

  從圖1可以看出,內(nèi)核區(qū)在0xC0000000以上的高端地址上,用來存放操作系統(tǒng)內(nèi)核代碼和數(shù)據(jù)以及與每個進程相關(guān)的數(shù)據(jù)結(jié)構(gòu)(如進程標識信息、進程現(xiàn)場信息、頁表等進程控制信息以及內(nèi)核棧等),其中內(nèi)核代碼和數(shù)據(jù)區(qū)在每個進程的地址空間中都相同。用戶程序沒有權(quán)限訪問內(nèi)核區(qū)。

  用戶區(qū)用來存放用戶進程的代碼和數(shù)據(jù),它被分為以下幾個區(qū)域。

  (1) 用戶棧。用來存放程序運行時過程調(diào)用的參數(shù)、返回值、返回地址、過程局部變量等,隨著程序的執(zhí)行,該區(qū)會不斷動態(tài)地從高地址向低地址增長或向反方向減退。

  (2) 共享庫。用來存放公共的共享函數(shù)庫代碼,如hello中的printf( )函數(shù)等。

  (3) 堆。用于動態(tài)申請存儲區(qū),例如,C語言中用malloc()函數(shù)分配的存儲區(qū),或C++中用new操作符分配的存儲區(qū)。申請一塊內(nèi)存時,動態(tài)地從低地址向高地址增長,用free( )函數(shù)或delete操作符釋放一塊內(nèi)存時,動態(tài)地從高地址向低地址減退。

  (4) 可讀寫數(shù)據(jù)區(qū)。存放用戶進程中的靜態(tài)全局變量,堆區(qū)從該區(qū)域的結(jié)尾處開始向高地址增長。

  (5) 只讀數(shù)據(jù)和代碼區(qū)。存放用戶進程中的代碼和只讀數(shù)據(jù),如hello進程中的程序代碼和字符串“hello,world\n”。

  每個區(qū)域都有相應(yīng)的起始位置,堆區(qū)和棧區(qū)相向生長,棧區(qū)從內(nèi)核起始位置0xC0000000開始向低地址增長,堆棧中的共享庫代碼區(qū)從0x40000000開始向高地址增長。代碼和只讀數(shù)據(jù)區(qū)從0x08048000開始向高地址增長。

  對于棧的訪問操作,有些指令集系統(tǒng)結(jié)構(gòu)提供了專門的入棧和出棧指令,例如Intel架構(gòu)中的push指令和pop指令分別用于入棧和出棧操作;有些架構(gòu)則不提供專門的入棧和出棧指令,而是通過訪存指令和加/減指令來實現(xiàn)入棧和出棧操作,例如,MIPS架構(gòu)中用sw指令和add或sub指令實現(xiàn)入棧操作,用lw指令和add或sub指令實現(xiàn)出棧操作。

  對于像Intel這樣提供專門入棧和出棧指令的情況,棧的增長方向可以根據(jù)入棧、出棧指令的功能來確定,例如,IA-31架構(gòu)中的push指令自動將棧頂指針減4,而pop指令則自動將棧頂指針加4。因而,棧總是從高地址向低地址增長。

  對于像MIPS架構(gòu)這種沒有專門入棧和出棧指令的情況,棧的增長方向就不一定,可能是高地址向低地址增長,或是相反。

  因為棧是通過執(zhí)行指令動態(tài)增長的,所以,最直接的判斷辦法就是在機器級代碼層面(通常是匯編指令)來閱讀或調(diào)試程序。

  當一個過程P調(diào)用一個被調(diào)用過程Q,則P中傳遞給Q的參數(shù)會先入棧,然后執(zhí)行調(diào)用指令(如IA-32中的call指令),跳轉(zhuǎn)到Q執(zhí)行,在被調(diào)用過程Q中,再將Q的局部變量入棧,因此,通過比較Q過程的入口參數(shù)所在地址和局部變量所在地址之間的大小,可以判斷出棧的增長方向。


相關(guān)文章推薦:

1.2016年華為筆試面試題及答案

2.華為c語言筆試面試題題庫

3.2016年華為筆試題及及答案

4.華為面試題:怎樣判斷棧的增長方向

5.華為測試面試題匯總

6.2016年華為機試練習題及答案

7.2016年華為嵌入式筆試題

8.2016年華為認證認證試題(筆試)

9.2016年華為認證C/C++筆試題目

10.2016年華為上機考試題

【華為面試題:怎樣判斷棧的增長方向】相關(guān)文章:

華為Java面試題精選10-13

華為測試面試題匯總09-19

經(jīng)典華為面試題及回答思路201709-08

怎樣打方向06-18

2017華為筆試面試題庫09-03

華為c語言筆試面試題題庫08-22

健身期間怎樣飲食增長肌肉10-26

如何判斷方向盤回正 方向盤回正技巧06-19

2016年華為筆試面試題及答案07-03

怎樣判斷電腦電源壞了08-15

主站蜘蛛池模板: 久久精品国产精品亚洲38| 嗯~进去~好大~好满视频| 日本高清www无色夜在线视频| 国产免费不卡午夜福利在线| 波多野av一区二区无码| 国产精品手机在线观看你懂的 | 日本欧美中文字幕精品亚洲| 成年网站未满十八禁视频天堂| av天堂中av世界中文在线播放| 欧美人与动牲交大全免费| 高清无码一区| 欧美激情性xxxxx高清真| 在线视频 亚太 国产 欧美 一区二区 | 无码中文字幕在线播放2| 欧美一区二区三区久久综合| 国产日韩另类综合11页 | 国产日韩一区二区三区免费高清| 成年午夜性影院| 国产精品免费麻豆入口| 丝袜足控一区二区三区| 欧美性大战久久久久久久| 亚国产亚洲亚洲精品视频| 亚洲国产精品av在线播放| 日韩a∨精品日韩在线观看 | 国产精品一二三区久久狼| 无码中文av有码中文a| 日本精品高清一区二区| 在线无码午夜福利高潮视频| 亚洲乱码日产精品m| 国产精品天天看特色大片| 乱色欧美激惰| 久久精品av国产一区二区| 久久99久久99精品免观看| 国产精品乱子伦xxxx裸| 蜜臀少妇人妻在线| 国产成人精品午夜福利在线观看| 换脸国产av一区二区三区| 陆丰市| 婷婷综合缴情亚洲五月伊| 亚洲自偷自偷偷色无码中文| 国产午夜精品一区理论片|