程序的机器级代码表示是计算机组成原理的核心内容,其综合第四章指令与第五章CPU,并常常结合第三章存储系统进行考察,可以说是把计算机组成原理最核心的内容都汇集在了一起。本文着重讨论程序的机器级代码表示,并辅以历年真题进行讲解。关于存储、指令、CPU组成请详见:【408精华知识】关于存储系统,看这一篇就够了!、【408精华知识】指令的寻址方式、【408精华知识】指令周期的数据流、【408精华知识】计算机系统结构等文章。
文章目录
一、考试要求
- 只需关注x86汇编语言,若考察其他汇编语言题目会详细注释;
- 题目给出某段简单程序的C语言、汇编语言、机器语言表示,能结合C语言看懂汇编语言的关键语句(看懂常见指令、选择结构、循环结构、函数调用);
- 汇编语言、机器语言 一 一对应,要能结合汇编语言分析机器语言指令的格式、寻址方式;
二、汇编语言基础
(一)指令格式
(二)寄存器
- 通用寄存器:E*X(X = 未知);
- 变址寄存器(用于线性表、字符串处理等):E*I (I = Index);
- 堆栈指针(用于实现函数调用等):E*P(P = Pointer);
注意:每个寄存器大小都是32bit,通用寄存器要根据取数大小使用部分寄存器而不是整个寄存器。
(三)例子
- 寄存器:见(三);
- 立即数:常量;
- 主存中:给出地址与读写长度;
(四)总结
三、常用的x86汇编指令
(一)指令类型
(二)选择语句(jmp/jxxx)
-
jmp:无条件转移指令
-
jxxx:条件转移指令
注意:关于这几个标志位,详见:【408精华知识】计组中关于数据的考察
⭐举个栗子:
(三)循环语句(loop)
-
用条件转移指令实现:
-
用loop指令实现:
(四)函数调用(call/ret)
- 函数调用指令: call <函数名>
①将PC旧值压栈保存(保存在函数的栈帧顶部)
②设置PC新值,无条件转移至被调用函数的第一条指令 - 函数返回指令: ret
从函数的栈帧顶部找到PC旧值,将其出栈并恢复PC寄存器
1.函数调用栈的位置
注意:栈底在高地址,栈顶在低地址
2.如何访问栈帧
3.栈桢包含的内容
- gcc 编译器将每个栈帧大小设置为 16B 的整数倍(当前函数的栈帧除外),因此栈帧内可能出现空闲未使用的区域
- 通常将局部变量集中存储在栈帧底部区域
- 通常将调用参数集中存储在栈帧顶部区域
- 栈帧最底部一定是上一层栈帧基址(ebp旧值)
- 栈帧最顶部一定是返回地址(当前函数的栈帧除外)
4.总结
四、历年真题
(一)2014-44、45
(二)2015-43、44
(三)2019-45、46
(四)2020-43、44
写在后面
这个专栏主要是我在学习408真题的过程中总结的一些笔记,因为我学的也很一般,如果有错误和不足之处,还望大家在评论区指出。希望能给大家的学习带来一点帮助,共同进步!!!
参考资料
[1]王道408教材(2025版)
[2]王道课程资料