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

推荐订阅源

让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
V
V2EX
WordPress大学
WordPress大学
U
Unit 42
I
InfoQ
A
About on SuperTechFans
宝玉的分享
宝玉的分享
J
Java Code Geeks
博客园 - 司徒正美
爱范儿
爱范儿
Engineering at Meta
Engineering at Meta
G
Google Developers Blog
人人都是产品经理
人人都是产品经理
小众软件
小众软件
Microsoft Security Blog
Microsoft Security Blog
L
LangChain Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Hugging Face - Blog
Hugging Face - Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
aimingoo的专栏
aimingoo的专栏
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Last Week in AI
Last Week in AI
腾讯CDC
Recent Announcements
Recent Announcements

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)