软硬件接口——ISA


layout: port
title: 软硬件接口——ISA
date: 2022-03-15 19:51:55
tags:
mathjax: true
categories: 计算机系统
description: 软硬件接口——ISA

上一节我们将汇编语言和机器语言抽象出来,引出了软硬件结构——指令集结构 ISA 的概念。今天我们详细地讲述 ISA 的相关概念,并由此过渡到 ARM 汇编,然后从这里进入计算机的世界。

一、图灵机

首先,我们还是从图灵机开始。图灵机是现代计算机的理论模型,也是冯诺依曼结构的起源。现代计算机的很多基本概念都来源于图灵机。

图灵机本来是用来解决希尔伯特的可判定性问题(能够找到一种方法,仅仅通过机械化的计算,就能判定某个数学陈述是对是错?)的,只要纸带无限长,图灵机就可以一直计算下去,就可以证明这个结论。

这个思想无意中启发了计算机领域,高级语言程序转换成一条条机器指令。机器(CPU)不断获取指令、不断执行,而这个工作是由 CPU(中央处理器) 来完成。如同下面所示:

while (1) {
  从PC指示的存储器位置取出指令;
  执行指令;
  更新PC;
}

既然计算机是要不断按照这个流程执行,那么就至少要满足以下几点:

  • 指令格式要规范,不然 CPU 无法认识指令。
  • 明确操作类型,指令是 add 还是 sub,指令是否可以直接访存等。
  • 操作数类型。计算需要数据,那数据是来自寄存器,还是立即数。

而这些指令规范的要求就是由 ISA 定义的。下面我们来了解 ISA。

二、指令集体系结构——ISA

1.1 什么是 ISA

指令集架构 (ISA) 是计算机抽象模型的一部分,它定义了软件如何控制 CPU,并且规定了计算机执行什么操作。ISA 充当硬件和软件之间的接口,提供了用户能够与硬件交互的唯一方式。

ISA 定义了机器语言级虚拟机的属性和功能特性,主要包括以下信息:

  • 可执行的指令集合,包括指令格式操作种类以及每种操作对应的操作数的相应规定;
  • 指令可接收的操作数的类型
  • 操作数或其地址所能存放的寄存器组的结构,包括每个寄存器的名称,编号,长度和用途;
  • 指令获取操作数以及下一条指令的方式,即寻址方式
  • 操作数所能存放的存储空间的大小和编制方式;
  • 操作数在存储空间存放时按照大端方式还是小端方式存放;
  • 指令执行过程的控制方式,包括程序计数器,条件码定义等。

大多数的人看到上面一大段,都会有些不能理解,下面来具体讲一讲关键部分。我们知道,指令系统由若干条指令及其操作对象组成。而每条指令都是对一个操作的描述,其中最重要的是操作类型和操作数,它们共同确定了这条指令的操作。操作类型规定指令功能,例如加减法;操作数指示操作对象,包含数据类型、访存地址、寻址方式等内容的定义。

我们从一个程序案例来看看这些概念

long mult2(long, long);
void multstore(long x, long y, long *dest) {
    long t = mult2(x, y);
    *dest = t;
}

在命令行上使用 “-S” 选项(gcc -S mstore.s mstore.c),就能看到 产生的汇编代码(该指令是 x86):

multstore:
  pushq   %rbx
  movq    %rdx, %rbx
  call    mult2
  movq    %rax, (%rbx)
  popq    %rbx
  ret     

从生成的汇编代码中,我们看到了三行(有些是两行),第一行就是操作类型,第二行是操作数。我们调其中一条来看看。

movq    %rdx, %rbx

movq 是操作类型,表示传送四字(32位的系统中:1字 = 4 字节=32 bit);%rdx、%rbx 是寄存器,操作数是寄存器中的数据;该指令的意思是把寄存器 rdx 的数据传送到 rbx 中。这种方式也叫作寄存器寻址。

我们再来看一条指令:

movq    %rax, (%rbx)

前两项和上一条指令的意思一样。(%rbx)表示寄存器中的数据是地址,数据在该地址指向的内存处。整条指令的意思是:把寄存器 %rax 的数据写入到内存地址为 %rbx 的内存处。这句也是给指针赋值 *dest = t 的含义,也就是说指针本质上就是地址。从这里可以看出,学习 ISA 对于理解高级语言的概念也是有很大的帮助。

(初学者可能不知道寄存器和内存是什么,可以暂时认为,寄存器是 CPU 内部的一小块存储单元,内存是 CPU 外部的一大块存储单元。)

AT&T 和 Intel 汇编风格

我们上面的指令风格被称为 AT&T 风格:第二项是源操作数,第三项是目标操作数。

下面汇编是 Intel 风格:

multstore:
push   rbx
mov    rbx, rbdx
call    mult2
mov    QWORD PTR [rbx], rax
pop    rbx
ret 

我们可以看到 Intel 和 AT&T 格式在如下方面有所不同:

  • Intel 风格省略了操作类型的后缀。我们看到的是 push、mov,而不是 pushq、movq。
  • Intel 风格省略了寄存器名字前面的 %。
  • Intel 风格用不同的方式描述了内存中的位置,“QWORD PTR [rbx]”而不是“(%rbx)”。
  • 操作数的顺序相反,Intel 风格第二项是目标操作数,第三项是源操作数。

我们现在知道了 ISA 的基本概念,下面我们详细的来了解以下 ISA 的概念。这一部分请学过一些汇编后再来看,因为它是对指令系统的一个总结。

1.1.1 指令操作(opcode)

在指令系统中,指令的功能是由指令的操作码决定。现在几乎所有指令都可分为四大类:

  • 运算指令,包括加减乘除、移位、逻辑运算等;
  • 访存指令,负责对存储器的读写;
  • 转移指令,用于控制程序的流向;
  • 特殊指令,用于操作系统的特定用途。

转移指令比较特殊,这里着重介绍一下。

转移指令包括条件转移、无条件转移、过程调用和过程返回等类型。转移条件转移目标地址是转移指令的两个要素,两者的组合构成了不同的转移指令:

  • 条件转移要判断条件再决定是否转移,无条件转移则无须判断条件;
  • 相对转移是程序计数器(PC)加上一个偏移量作为转移目标地址,绝对转移则直接给出转移目标地址;
  • 直接转移的转移目标地址可直接由指令得到,间接转移的转移目标地址则需要由寄存器的内容得到。由于取指译码时不知道目标地址,因此硬件结构设计时处理间接跳转比较麻烦。

条件转移在转移指令中最常用,不同的指令系统有不同的条件判断方法。X86和ARM等指令集采用专用标志位方式,这种通过比较指令或其他运算指令将条件判断结果写入专用标志寄存器中,条件转移指令根据标志寄存器中的结果来决定是否跳转;RISC-V指令集则采用直接比较寄存器方式,直接对来自寄存器的数值进行比较,然后根据比较结果决定是否进行跳转。

1.1.2 操作数

计算机中常见的数据类型包括整数、实数、字符,数据长度包括 1 字节、2 字节、4 字节和 8 字节。X86 指令集中还包括专门的十进制类型 BCD。

在指令中表达数据类型有两种方法:

  • 由指令操作码来区分不同类型。例如加法指令包括定点加法指令、单精度浮点加法指令、双精度浮点加法指令。
  • 将不同类型的标记附在数据上。例如加法使用统一的操作码,用专门的标记来标明加法操作的数据类型。
1.1.2.1 访存地址

在执行访存指令时,有两个必须考虑的问题:

  • 访存地址是否对齐和指令系统是否支持不对齐访问。对齐访问是指对该数据的访问起始地址是其数据长度的整数倍,例如访问一个4字节数,其访存地址的低两位都应为0。若支持不对齐访问,硬件需要完成数据的拆分和拼合;若只支持对齐访问,又会使指令系统丧失一些灵活性。CISC 指令集通常支持不对齐访问,RISC 类指令集在早期只支持对齐访问,近些年也开始支持不对齐访问。
  • 另一个与访存地址相关的问题是尾端(Endian)问题。机器使用大端方式或小端方式,会带来了严重的数据兼容性问题。高字节放在低地址是大尾端,低字节放在低地址的是小尾端。
1.1.2.1 寻址方式

寻址方式是确定本条指令的数据地址以及下一条要执行的指令地址的方法。下表列出了计算机中常用的寻址方式,其中 mem 表示存储器,regs 表示寄存器,mem[regs[Rn]] 表示由寄存器 Rn 的值作为存储器地址所访问的存储器值。

寻址方式格式含义
寄存器寻址(Register)ADD R1,R2regs[R1]=regs[R1]+regs[R2]
立即数寻址(Immediate)ADD R1,#2regs[R1]=regs[R1]+2
偏移量寻址(Displacement)ADD R1,100(R2)regs[R1]=regs[R1]+mem[100+regs[R2]]
寄存器间接寻址(Reg.Indirect)ADD R1,(R2)regs[R1]=regs[R1]+mem[regs[R2]]
变址寻址(Indexed)ADD R1,(R2+R3)regs[R1]=regs[R1]+mem[regs[R2]+regs[R3]]
绝对寻址(Absolute)ADD R1,(100)regs[R1]=regs[R1]+mem[100]
存储器间接寻址(Mem.Indirect)ADD R1,@(R2)regs[R1]=regs[R1]+mem[mem[regs[R2]]]
自增量寻址(Autoincrement)ADD R1,(R2)+regs[R1]=regs[R1]+mem[regs[R2]],regs[R2]=regs[R2]+d
自减量寻址(Autodecrement)ADD R1,-(R2)regs[R2]=regs[R2]-d,regs[R1]=regs[R1]+mem[regs[R2]]
比例变址寻址(Scaled)ADD R1,100(R2)(R3)regs[R1]=regs[R1]+mem[100+regs[R2]+regs[R3]*d]

其中,偏移量寻址、立即数寻址和寄存器间接寻址是最常用的寻址方式。因此,一个指令系统至少应支持寄存器寻址、立即数寻址和偏移量寻址。

1.1.3 指令格式

指令格式就是操作数和操作码在整个指令机器码中的摆放方式。

下图是 RISC-V 的指令格式,其中 r开头的是寄存器,imm开头的时立即数:

下图是 MIPS 的指令格式其中 r开头的是寄存器,imm开头的时立即数:

img

从上面两图就可以明显地看出操作码和操作数摆放顺序的不同。

1.2 CISC 和 RISC

我们可能听说过 x86、ARM、MIPS、RISC-V等名词,但不清楚这些概念的意思。其中这些是四种不同的指令集架构,也就是 ISA 的具体实现。其中 x86 属于 CISC;其他三种属于 RISC。下面我们来看看 CISC 和 RISC 是什么。

CISC(Complex Instruction Set Computer),即“复杂指令系统计算机”,CISC 是最开始的指令风格,目前个人计算机流行的 x86 体系结构也是 CISC 的一种。CISC 指令系统复杂,指令条数多,寻址方式多,指令风格多而复杂,指令长度可变,操作码长度可变。因为过于复杂,导致其实现复杂。不仅增加了研发周期成本,而且难以保证正确性,而且只能使用慢速的微程序控制器,而不能使用硬连线路控制器。

而且 CISC 中各种指令的使用频率悬殊,最常使用的只有指令系统的 20%,但它们占程序代码的 80% 以上。实现这些指令需要大量硬件逻辑支持,其他 80% 的指令使用频率低,但却占据了大量的硬件资源,这是很不划算的。因此在 7、80年代,提出了 RISC 的概念。

RISC(Reduced Instruction Set Computer),即“精简指令集计算机”,是一种执行较少类型计算机指令的微处理器。这种指令风格指令数目少、指令格式整齐,非常适合流水线方式执行。

RISC、CISC风格区别如下:

RISCCISC
以软件为中心的指令集设计以硬件为中心的指令集设计
少量指令数大量指令数
固定大小的指令可变大小指令
需要更多寄存器,频繁使用寄存器和内存需要更少寄存器,高效使用内存和寄存器
指令在单个时钟周期内执行指令需要超过一个时钟周期
只能执行 Register to Register 算术运算可以执行 REG 到 REG 或 REG 到 MEM 或 MEM 到 MEM

从上面看,我们可能会觉得 RISC 会优于 CISC,其实不然。这两种风格只是在用不同方式来提高 CPU 性能 。

我们开看看 CPU 性能公式(只是看看,具体推导可以之后学习):
C P U 时间 = 指令数 × C P I × 时钟周期长度 CPU时间 = 指令数 × CPI × 时钟周期长度 CPU时间=指令数×CPI×时钟周期长度
其中,CPI 是单条指令所需的时钟周期平均数。

时钟周期长度(时钟频率的倒数)从 CPU 产生就是固定的,想要提高 CPU 性能,只能减少指令数或者降低 CPI。CISC 和 RISC 就是在用不同的方式来提高 CPU 性能。

  • RISC:通过降低 CPI 来提高 CPU 性能,代价是一个程序的需要的指令数会增加(因为 RISC 指令数量少)。
  • CISC: 通过减少程序指令数来提高 CPU 性能,代价是 CPI 增加(因为 CISC 指令集丰富,可以使用少量指令来描述程序,但一条指令可能要多个周期完成)

而且根据《Power Struggles: Revisiting the RISC vs. CISC Debate on Contemporary ARM and x86 Architectures》这篇论文的结论发现,ARM 和 x86 之间的功耗差异,并不是来自于 CISC 和 RISC 的指令集差异,而是因为两类芯片的设计。因为芯片设计之初,就是针对不同的性能目标而进行的,和指令集是 CISC 还是 RISC 并没有什么关系。

1.3 为什么ISA很重要?

  • 了解指令集可以做什么以及编译器如何使用这些指令可以帮助开发人员编写更高效的代码。
  • 高级语言抽象层太高,隐藏了许多机器级程序的行为细节。大多数程序员不能很好地利用于机器结构相关的一些优化方法来提升程序的性能,不能很好地预见和防止潜在的安全漏洞。

三、ARM 汇编简述

(待完善)

四、汇编实现排序算法

使用ARM thumb2汇编语言,在flash区定义10个大小不同的数据,对其进行排序并写入到RAM区。

(待完善)

参考资料

  • 袁春风、余子濠《计算机系统基础》
  • 胡伟武、汪文祥等《计算机体系结构基础》
  • https://www.geeksforgeeks.org/computer-organization-risc-and-cisc/
  • https://cs.stanford.edu/people/eroberts/courses/soco/projects/risc/risccisc/
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ISA95和ISA88是国际标准化组织(ISO)的两个标准,它们都与制造执行系统(MES)有关,但关注的方面不同。 ISA88,即“制造执行系统-批生产部分”,是用于管理和控制批量生产过程的标准。它包括了一套定义和规范生产过程中各个阶段的模型和术语,如批次控制、设备控制、配方管理等。ISA88的目标是提供一种标准化的方法来管理和控制批量生产过程,以提高生产效率和质量,并确保生产符合规定的标准和要求。 ISA95,即“制造执行系统-与企业资源规划(ERP)集成部分”,是用于管理和集成企业的生产和业务系统的标准。它定义了一套用于数据交换和集成的模型和方法,包括业务到控制系统的层次结构、数据接口和通信协议等。ISA95的目标是促进信息在企业内部各个层次和不同系统之间的流动,实现生产计划和资源的协调,并提供实时的生产和业务数据,以便进行决策和优化。 ISA88和ISA95在MES领域有着密切的关系。ISA88关注的是生产过程的控制和管理,而ISA95关注的是不同系统之间的集成和数据交换。两个标准可以相互补充,使得生产过程更加协调和高效。ISA88提供了规范和指导,用于定义和管理生产过程中的各个阶段,而ISA95则提供了数据交换和集成的模型和方法,可以确保不同层次的系统可以共享和传递生产相关的数据,在生产运营过程中提供信息的可靠性和实时性。 综上所述,ISA88和ISA95都是与制造执行系统相关的标准,但侧重点不同。ISA88关注批量生产过程的控制和管理,ISA95关注不同系统之间的数据交换和集成。两者相辅相成,可以提高生产效率和质量,实现生产运营的优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值