惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

T
Tailwind CSS Blog
人人都是产品经理
人人都是产品经理
博客园 - 叶小钗
大猫的无限游戏
大猫的无限游戏
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 【当耐特】
The Cloudflare Blog
博客园 - 聂微东
博客园 - 司徒正美
量子位
博客园 - 三生石上(FineUI控件)
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
G
Google Developers Blog
Apple Machine Learning Research
Apple Machine Learning Research
罗磊的独立博客
酷 壳 – CoolShell
酷 壳 – CoolShell
Y
Y Combinator Blog
S
SegmentFault 最新的问题
T
The Blog of Author Tim Ferriss
P
Proofpoint News Feed
Google DeepMind News
Google DeepMind News
Blog — PlanetScale
Blog — PlanetScale
有赞技术团队
有赞技术团队
A
About on SuperTechFans

faryou的博客

faryou的博客 faryou的博客 faryou的博客 faryou的博客 faryou的博客 faryou的博客-福建行小记 faryou的博客 faryou的博客 faryou的博客 faryou的博客 faryou的博客-夏令营小记 faryou的博客 faryou的博客 faryou的博客 faryou的博客-暑假阶段总结与展望 faryou的博客 faryou的博客 faryou的博客 faryou的博客 台风进行时 faryou的博客 limbo虚拟机初体验&安装Windows NT 4.0 faryou的博客 台风将来时 faryou的博客 faryou的博客 faryou的博客 faryou的博客 出租车上的对话 faryou的博客
【汇编基础教程】来写个“函数”
作者: faryou · 2026-01-30 · via faryou的博客

前言

我们在使用高级语言编程的时候都用过函数(有些语言叫“方法”),函数能够帮助我们将程序分块,实现结构化,从而让代码更为清晰可懂。而在汇编语言中,由于我们是直接对硬件编程,CPU提供了一套指令帮助我们快速实现程序的结构化。

基本思路

首先,我们要回想一下函数中有哪些要素:参数、执行代码和返回值(可看我写的C++函数教程)。高级语言中的数据存在变量中,但是我们使用的汇编并没有这一抽象出来的概念。我们可以使用寄存器或内存单元来存放参数及返回值,至于程序编写,在程序的主体实现部分,我们已经有了相当多的经验。而在调用函数时,应使用CPU提供的call和ret/retf指令。

call和ret/retf

我们先看这两条指令的执行过程。
call 标号 指令执行时,步骤如下:
将IP压栈
转移到标号处(原理同jmp near ptr)
call far ptr 标号指令:
将CS:IP压栈
转移到标号处(原理同jmp far ptr)
call 16位寄存器 指令:
将IP压栈
转移到指定的地址(原理同jmp 16位寄存器)
call word ptr 指令:
将IP入栈
jmp word ptr 内存单元
call dword ptr 指令:
将CS:IP入栈
jmp dword ptr 内存单元
ret指令:将IP出栈(从而实现近转移)
retf指令:将CS:IP出栈(从而实现段间转移)
可以看出,call和ret/retf配合使用,即可完成函数的调用与返回。

代码过程

在执行函数代码时,我们不希望丢失主程序的数据,因此,在使用主程序占用的寄存器之前,应将其先入栈。由此,我们得到了函数的代码过程:
主程序数据入栈
函数实现过程
主程序数据出栈
返回主程序(ret/retf)