呼叫堆疊

Multi tool use
呼叫堆疊(英语:Call stack,港台称“呼叫堆叠”,英文直接简称为“栈”(the stack))别称有:执行栈(execution stack)、控制栈(control stack)、运行时栈(run-time stack)与机器栈(machine stack),是電腦科學中存儲有關正在執行的子程式的訊息的堆疊。有時僅稱「堆疊」,但堆疊中不一定僅存儲子程式訊息。幾乎所有電腦程式都依賴於呼叫堆疊,然而高階語言一般將呼叫堆疊的細節隱藏至後台。
呼叫堆疊最經常被用於存放子程式的返回位址。在呼叫任何子程式時,主程式都必須暫存子程式執行完畢後應該返回到的位址。因此,如果被呼叫的子程式還要呼叫其他的子程式,其自身的返回位址就必須存入呼叫堆疊,在其自身執行完畢後再行取回。在遞迴程式中,每一層次遞迴都必須在呼叫堆疊上增加一條位址,因此如果程式出現無限遞迴(或僅僅是過多的遞迴層次),呼叫堆疊就會產生堆疊溢位。
功能
呼叫堆疊的主要功能是存放返回位址。除此之外,呼叫堆疊還用於存放:
本地變數:子程式的變數可以存入呼叫堆疊,這樣可以達到不同子程式間變數分離開的作用。
參數傳遞:如果暫存器不足以容納子程式的參數,可以在呼叫堆疊上存入參數。
- 環境傳遞:有些語言(如Pascal與Ada)支援「多層子程式」,即子程式中可以利用主程式的本地變數。這些變數可以通過呼叫堆疊傳入子程式。
實例
組合語言
以下MIPS組合語言程式計算32+42{displaystyle 3^{2}+4^{2}}
,並將結果存至暫存器s0
。
main:
li $a0, 3
li $a1, 4
jal sumsq
move $s0, $v0
j mainend
sumsq:
addi $sp, $sp, -4 # 在堆疊上分配空間
sw $ra, 0($sp) # 將sumsq的返回位址存入堆疊中
jal square
move $t0, $v0
move $a0, $a1
jal square
add $v0, $v0, $t0
lw $ra, 0($sp) # 從堆疊中取回sumsq的返回位址
addi $sp, $sp, 4 # 釋出堆疊上分配的空間
jr $ra
square:
mult $a0, $a0
mflo $v0
jr $ra
mainend:
這裡,主程式(main)呼叫「sumsq」子程式並將返回位址存入暫存器ra
,但是「sumsq」子程式需要呼叫「square」子程式。為保證sumsq的返回位址不被重寫,這個位址被存儲在堆疊中。在square子程式返回後,sumsq再從堆疊中取回其自身的返回位址。
安全性
在較底層語言(如組合語言與C語言中),程式控制訊息與資料可能一同被存入呼叫堆疊中,因此造成安全隱患,可能允許惡意程式通過栈缓冲区溢出(stack buffer overflow)來獲取程式的控制權。
參見
x86 汇编器与汇编语言
|
|
相关话题 |
- 汇编语言
- 汇编语言与汇编器列表
- 反汇编器
- 指令集架構
- 低级语言
- 机器语言
- 微汇编程序
- x86汇编语言
|
|
汇编器 |
- A86
- FASM
GNU 汇编器(GAS)
高階組合語言(HLA)
微软宏汇编器(MASM)
- NASM
- TASM
- WASM
- Yasm
|
|
使用汇编语言编程 |
- 调用栈
标志寄存器
进位标志 (CF)
方向标志(DF)
中断标志(IF)
溢出标志(OF)
零标志(ZF)
- 操作码
- 程式計數器
寄存器与x86寄存器
- 调用约定
- 指令列表
|
|
RVLk61,dnTHlFuFkg CXpME Z3 WCkFqj,pIO
Popular posts from this blog
提示 :本条目的主题不是 香港中文大學(深圳) 。 body.skin-minerva .mw-parser-output table.infobox caption{text-align:center} 香港中文大學 The Chinese University of Hong Kong 校训 博文約禮 [1] [2] 创建时间 1963年10月17日 学校类型 法定(公立)、研究型 監督 主權移交前:英屬香港總督 主權移交後:香港特別行政區行政長官 校董會主席 梁乃鵬博士 校長 段崇智教授 副校长 華雲生教授(常務副校長) 霍泰輝教授、吳基培教授 張妙清教授、潘偉賢教授 陳偉儀教授、吳樹培先生 教师人數 1,619 [3] 学生人數 25,489 [3] 本科生人數 20,147 [3] 研究生人數 5,342 [3] 校址 香港新界沙田馬料水沙田市地段437號(大埔公路十一至十二咪左右(正門及崇基門) 22°25′10″N 114°12′19″E / 22.41946°N 114.205358°E / 22.41946; 114.205358 坐标: 22°25′10″N 114°12′19″E / 22.41946°N 114.205358°E / 22.41946; 114.205358 科學園路與澤祥街交界(東校門) 澤祥街18號(沙田凱悅酒店及工商管理學院)) 校區 新市鎮 总面积 134.4公頃(1,344,000平方米) [2] 代表色 紫與金 [1] 吉祥物 鳳凰 [1] 隶属 英聯邦大學協會 國際商管學院促進協會(AACSB) 東南亞高等教育協會 ( 英语 : ASAIHL ) 國際大學協會 亚太高校书院联盟 八大公立大學聯盟(譯自:HK8)[3] 网站 http://www.cuhk.edu.hk/ 香港中文大學 ( 英语: The Chinese University of Hong Kong ,縮寫为 CUHK ),簡稱 中文大學 、 中大...
10
1
I have a function that searches a vector of iterators and returns the iterator if its names matches a string passed as an argument. koalaGraph::PVertex lookUpByName(std::string Name, std::vector<koalaGraph::PVertex>& Vertices) { for (size_t i = 0; i < Vertices.size(); i++) { if(Vertices[i]->info.name == Name) return Vertices[i]; } } My question is how can I implement this as a lambda, to use it in connection with std::find_if ? I'm trying this: std::vector<koalaGraph::PVertex> V; std::string Name; std::find_if(V.begin(), V.end(), [&Name]() {return Name == V->info.name;}) But it says that V an enclosing-function local variable cannot be referenced in a lambda body unless it is in the capture list.
...
.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty{ margin-bottom:0;
}
4
1
I am installing hackintosh in virtualbox on ubuntu, but when I try to start, I get above error. Here are some more details, Result Code: NS_ERROR_FAILURE (0x80004005) Component: ConsoleWrap Interface: IConsole {872da645-4a9b-1727-bee2-5585105b9eed} How can I solve this issue?
16.04 virtualbox
share | improve this question
asked Oct 22 '17 at 15:10
luv.preet luv.preet
1,502 4 13 29
...