当前位置: 首页 > news >正文

指令系统 II(程序的机器级代码表示、CISC 和 RISC)

一、程序的机器级代码表示

1. 常用汇编指令介绍

【总结】:

内存的读写长度:dword ptr —— 双字 (32 bit) ;word ptr —— 单字 (16 bit) ;byte ptr —— 字节 (8 bit)

1)高级语言与机器级代码之间的对应

高级语言 --> 汇编语言 --> 机器语言

2)相关寄存器

x86 处理器中有 8 个 32 位的通用寄存器。

汇编语言:mov 目的操作数 d , 源操作数 s
#mov 指令功能:将源操作数 s 复制到目的操作数 d 所指位置。

为了向后兼容,EAX、EBX 、ECX 和 EDX 的高两位字节和低两位字节可以独立使用, E 为 Extended ,表示 32 位的寄存器。例如 EAX 的低两位字节称为 AX ,而 AX 的高低字节又可分别作为两个 8 位寄存器,分别称为 AH 和 AL 。

除 EBP 和 ESP 外,其他几个寄存器的用途是比较任意的。

注意:若未指明主存读写长度,默认是 32 bit(dword ptr)。

3)常用的 x86 汇编指令

汇编指令通常可以分为数据传送指令、逻辑计算指令和控制流指令。

常见的算数运算指令

常见的逻辑运算指令

其他指令

lea 指令用于将一个内存地址(而不是其所指的内容)加载到目的寄存器。

以下用于操作数的标记分别表示寄存器、内存和常数。

  • < reg >:表示任意寄存器,若其后带有数字,则指定其位数,如 < reg32 > 表示 32 位寄存器(eax 、ebx 、ecx 、edx 、esi 、edi 、esp 或 ebp);< reg 16 > 表示 16 位寄存器(ax 、bx 、ex 或 dx);< reg8 > 表示 8 位寄存器(ah 、al 、bh 、bl 、ch 、cl 、dh 、di)。

  • < mem >:表示内存地址(如 [eax]、[var+4] 或 dword ptr [eax+ebx])。

  • < con >:表示 8 位、16 位或 32 位常数。< con8 > 表示 8 位常数;< con16 > 表示 16 位常数;< con32 > 表示 32 位常数。

4)AT&T 格式和 Intel 格式

  • AT&T 格式的指令只能用小写字母,而 Intel 格式的指令对大小写不敏感。

  • 在 AT&T 格式中,第一个为源操作数,第二个为目的操作数,方向从左到右,合乎自然;在 Intel 格式中,第一个为目的操作数,第二个为源操作数,方向从右向左。

  • 在 AT&T 格式中,寄存器需要加前缀 “%”,立即数需要加前缀 “$”,在 Intel 格式中,寄存器和立即数都不需要加前缀。

  • 在内存寻址方面, AT&T 格式使用 “(” 和 “)”,而 Intel 格式使用 “[” 和 “]” 。

  • 在处理复杂寻址方式时,AT&T 格式的内存操作数为 “偏移量(基址寄存器, 变址寄存器, 比例因子)” ,而 Intel 格式的内存操作数为 “[基址寄存器 +变址寄存器*比例因子 + 偏移量]” 。

  • 在指定数据长度方面, AT&T 格式指令操作码的后面紧跟一个字符,表明操作数大小,“b” 表示 byte(字节)、“w” 表示 word(字)或 “l” 表示 long(双字)。Intel 格式也有类似的语法,它在操作码后面显式地注明 byte ptr、word ptr 或 dword ptr 。

2. 选择语句的机器级表示

1)无条件转移指令 jmp

2)条件转移指令 jxxx

选择语句的机器级表示示例:

3)cmp 指令的底层原理

  • CF:进(借)位标志,最近无符号整数加(减)运算后的进(借)位情况。有进(借)位时,CF = 1 ; 否则 CF = 0 。

  • ZF:零标志。最近的操作的运算结果是否为 0 。若结果为 0 ,ZF = 1 ,否则 ZF = 0 。

  • SF:符号标志,最近的带符号数运算结果的符号。若为负, SF = 1 ,否则 SF = 0 。

  • OF:溢出标志,最近的带符号数运算结果是否溢出。若溢出, OF = 1 ,否则 OF = 0 。

可见,OF 和 SF 对无符号数运算来说没有意义,而 CF 对带符号数运算来说没有意义。

3. 循环语句的机器级表示

1)用条件转移指令实现循环

2)用 loop 指令实现循环

4. 过程调用的机器级表示

【总结】:

1)高级语言的函数调用

2)x86 汇编语言的函数调用(call、ret 指令)

3)函数调用栈在内存中的位置

4)标记栈帧范围

EBP、ESP 寄存器

5)访问栈帧数据

push、pop 指令

  • push eax:将寄存器 eax 的值 211 压入栈中,即 C 的位置,esp 指向 C ;

  • push 985:将立即数 985 压入栈中,即 B 的位置,esp 指向 B ;

  • push [ebp+8]:将主存地址 [ebp+8](G 的位置)里的数据 666 压入栈中,即 A 的位置,esp 指向 A ;

  • pop eax:栈顶元素 666 出栈,并写入寄存器 eax ,即此时寄存器 eax 的值从 211 变为 666 ,位置 A 变空,esp 指向 B ;

  • pop [ebp+8]:栈顶元素 985 出栈,写入主存地址 [ebp+8] ,即此时主存地址 [ebp+8](G 的位置)的值从 666 变为 985 ,位置 B 变空,esp 指向 C 。

mov 指令

  • sub esp, 12:将栈顶指针 -12 ,移至 A 的位置,即 esp 指向 A ;

  • mov [esp+8], eax:将 eax 的值 211 复制到主存 [esp+8] ,即 C 的位置;

  • mov [esp+4], 958:将立即数 985 复制到主存 [esp+4] ,即 B 的位置;

  • mov eax, [ebp+8]:将主存 [ebp+8](G 的位置)的值 666 复制给 eax 寄存器,即此时寄存器 eax 的值从 211 变为 666 ;

  • mov [esp], eax:将 eax 的值 666 复制到主存 [esp] ,即 A 的位置;

  • add esp, 8:将栈顶指针 + 8 ,移至 C 的位置,即 esp 指向 C 。

【总结】:如何访问栈帧?

6)切换栈帧

函数调用时,如何切换栈帧?

call 指令的作用

  • 将 IP 旧值压栈保存(效果相当于 push IP)

  • 设置 IP 新值,无条件转移至被调用函数的第一条指令(效果相当于 jmp add)

函数返回时,如何切换栈帧?

ret 指令的作用:从函数的栈帧顶部找到 IP 旧值,将其出栈并恢复 IP 寄存器。

7)栈帧包含的内容以及参数、返回值传递

一个栈帧内可能包含哪些内容?

【拓展】:

8)总结

假定过程 P(调用者)调用过程 Q(被调用者),过程调用的执行步骤如下:

  • 1)P 将入口参数(实参)放在 Q 能访问到的地方。

  • 2)P 将返回地址存到特定的地方,然后将控制转移到 Q 。

  • 3)Q 保存 P 的现场(通用寄存器的内容),并为自己的非静态局部变量分配空间。

  • 4)执行过程 Q 。

  • 5)Q 恢复 P 的现场,将返回结果放到 P 能访问到的地方,并释放局部变量所占空间。

  • 6)Q 取出返回地址,将控制转移到 P 。

步骤 2)是由 call 指令实现的,步骤 6)通过 ret 指令返回到过程 P 。在上述步骤中,需要为入口参数、返回地址、过程 P 的现场、过程 Q 的局部变量、返回结果找到存放空间。但用户可见寄存器数量有限,为此需要设置一个专门的存储区域来保存这些数据,这个存储区域就是栈。寄存器 EAX、ECX 和 EDX 是调用者保存寄存器,其保存和恢复的任务由过程 P 负责,当 P 调用 Q 时,Q 就可以直接使用这三个寄存器。寄存器 EBX、ESI、EDI 是被调用者保存寄存器, Q 必须先将它们的值保存在栈中才能使用它们,并在返回 P 之前先恢复它们的值。

每个过程都有自己的栈区,称为栈帧,因此, 一个栈由若于栈帧组成。帧指针寄存器 EBP 指示栈帧的起始位置(栈底),栈指针寄存器 ESP 指示栈顶,栈从高地址向低地址增长,因此,当前栈帧的范围在帧指针 EBP 和 ESP 指向的区域之间。

二、CISC 和 RISC 的基本概念

1. 复杂指令系统计算机(CISC)

随着 VLSI 技术的发展,硬件成本不断下降,软件成本不断上升,促使人们在指令系统中增加更多、更复杂的指令,以适应不同的应用领域,这样就构成了复杂指令系统计算机(CISC)。

CISC 的主要特点如下:

  • 指令系统复杂庞大,指令数目一般为 200 条以上。
  • 指令的长度不固定,指令格式多,寻址方式多。
  • 可以访存的指令不受限制。
  • 各种指令使用频度相差很大。
  • 各种指令执行时间相差很大,大多数指令需多个时钟周期才能完成。
  • 控制器大多数采用微程序控制。有些指令非常复杂,以至于无法采用硬连线控制。
  • 难以用优化编译生成高效的目标代码程序。

如此庞大的指令系统,对指令的设计提出了极高的要求,研制周期变得很长。后来人们发现,一味地追求指令系统的复杂和完备程度不是提高计算机性能的唯一途径。对传统 CISC 指令系统的测试表明,各种指令的使用频率相差悬殊,大概只有 20% 的比较简单的指令被反复使用,约占整个程序的 80% ;而 80% 左右的指令则很少使用,约占整个程序的 20% 。从这一事实出发,人们开始了对指令系统合理性的研究,于是 RISC 随之诞生。

2. 精简指令系统计算机(RISC)

精简指令系统计算机(RISC)的中心思想是要求指令系统简化,尽量使用寄存器-寄存器操作指令,指令格式力求一致。

RISC 的主要特点如下:

  • 选取使用频率最高的一些简单指令,复杂指令的功能由简单指令的组合来实现。
  • 指令长度固定,指令格式种类少,寻址方式种类少。
  • 只有 Load/Store(取数/存数)指令访存,其余指令的操作都在寄存器之间进行。
  • CPU 中通用寄存器的数量相当多。
  • RISC 一定采用指令流水线技术,大部分指令在一个时钟周期内完成。
  • 以硬布线控制为主,不用或少用微程序控制。
  • 特别重视编译优化工作,以减少程序执行时间。

值得注意的是,从指令系统兼容性看, CISC 大多能实现软件兼容,即高档机包含了低档机的全部指令,并可加以扩充。但 RISC 简化了指令系统,指令条数少,格式也不同于老机器,因此大多数 RISC 机不能与老机器兼容。由于 RISC 具有更强的实用性,因此应该是未来处理器的发展方向。但事实上,当今时代 Intel 几乎一统江湖,且早期很多软件都是根据 CISC 设计的,单纯的 RISC 将无法兼容。此外,现代 CISC 结构的 CPU 已经融合了很多 RISC 的成分,其性能差距已经越来越小。CISC 可以提供更多的功能,这是程序设计所需要的。

RISC 必然采用流水线技术,这也是由其指令的特点决定的。而 CISC 则无此强制要求,但为了提高指令执行速度,CISC 也往往采用流水线技术,因此流水线技术并非 RISC 的专利。

【思考】装入/存储(Load/Store)型指令有什么特点?

装入/存储型指令是用在规整型指令系统中的一种通用寄存器型指令风格。这种指令风格在 RISC 指令系统中较为常见。为了规整指令格式,使指令具有相同的长度,规定只有 Load/Store 指令才能访问内存。而运算指令不能直接访问内存,只能从寄存器取数进行运算,运算的结果也只能送到寄存器。因为寄存器编号较短,而主存地址位数较长,通过某种方式可使运算指令和访存指令的长度一致。

这种装入/存储型风格的指令系统的最大特点是,指令格式规整,指令长度一致, 一般为 32 位。由于只有 Load/Store 指令才能访问内存,程序中可能会包含许多装入指令和存储指令,与一般通用寄存器型指令风格相比,其程序长度会更长。

3. CISC 和 RISC 的比较

和 CISC 相比, RISC 的优点主要体现在以下几点:

  • RISC 更能充分利用 VLSI 芯片的面积。CISC 的控制器大多采用微程序控制,其控制存储器在 CPU 芯片内所占的面积达 50% 以上,而 RISC 控制器采用组合逻辑控制,其硬布线逻辑只占 CPU 芯片面积的 10% 左右。

  • RISC 更能提高运算速度。RISC 的指令数、寻址方式和指令格式种类少,又设有多个通用寄存器,采用流水线技术,所以运算速度更快,大多数指令在一个时钟周期内完成。

  • RISC 便于设计,可降低成本,提高可靠性。RISC 指令系统简单,因此机器设计周期短;其逻辑简单,因此可靠性高。

  • RISC 有利于编译程序代码优化。RISC 指令类型少,寻址方式少,使编译程序容易选择更有效的指令和寻址方式,并适当地调整指令顺序,使得代码执行更高效化。

CISC 和 RISC 的对比见下表:


http://www.mrgr.cn/news/63518.html

相关文章:

  • 【专用名词的离线语音识别在2024年底的解决方法调查-会议签到的补充】
  • android 逆向破解360加固(MT管理器反编译)
  • 多系统集成与统一管理的实现路径
  • 【SQL实战】——数据查询
  • 阿里云开源 AI 应用开发框架:Spring AI Alibaba
  • HTML的常用标签
  • 写一个小日历
  • 中电金信:GienTech动态|丰收之秋,公司多项目获得荣誉
  • 如何解决docker镜像下载失败问题
  • (9)位运算
  • 用友U8采购入库单与旺店通·企业奇门集成方案解析
  • [CSP篇] CSP2024 游记(下)
  • 机器学习:我们能用机器学习来建立投资模型吗
  • C++模拟实现list
  • 第5章第6章 Servlet技术
  • 【果实种子识别】Python+深度学习+人工智能+CNN卷积神经网络算法+TensorFlow+算法模型训练
  • 【升华】机器学习鸢尾花分类完整代码示例
  • 助力抑郁症初筛!上海交大团队构建Agent心理诊所,论文一作在线展示demo,分享技术亮点
  • Games101笔记-三维Transform变换(三)
  • python--函数详解二
  • ngnix.conf文件配置前后端联调地址
  • 8.FreeRTOS之软件定时器
  • Linux云计算 |【第五阶段】CLOUD-DAY7
  • MYSQL插入或修改,基于唯一联合索引,批量操作
  • CentOS上安装Redis 6.x
  • 还在寻找影像切片方案?免费GIS工具箱满足你的需求