精华内容
下载资源
问答
  • 微指令代码

    2014-04-08 20:30:35
    求五个有符号整数中正数的平方和; 微指令代码表;
  • 微指令编码方法(组原)

    千次阅读 2021-01-06 16:12:11
    微程序控制器–微指令编码方式 水平型微指令 微指令的字长比较长 在一条微指令中可以产生较多的微命令 操作的并行性较高 垂直型微指令 微指令的字长比较短 操作的并行性不高 微程序比水平型的要长 微程序控制器...

    微程序控制器–微指令编码方式

    水平型微指令

    • 微指令的字长比较长
    • 在一条微指令中可以产生较多的微命令
    • 操作的并行性较高

    垂直型微指令

    • 微指令的字长比较短
    • 操作的并行性不高
    • 微程序比水平型的要长

    微程序控制器–常用的微指令编码方法

    1.直接控制法(不译法
    微指令操作控制字段的每一位都直接表示一个微命令,该位为“1”,表示执行这个微命令。
    在这里插入图片描述
    优点:结构简单,并行性强,无需译码,速度快。
    缺点:微指令字太长,信息效率低。
    特点:直观、硬件实现简单,执行速度快,具有高度的并行操作能力。
    编码效率低,微指令字长很长,对控存容量的需求较大,不经济,缺乏实用价值。
    ***典型的水平型微指令***
    2.最短编码法
    所有的微命令进行统一编码,每条微指令只定义一个微命令。若微命令总数为N,则最短编码法中操作控制字段的长度L,应满足:L≥log2N
    在这里插入图片描述
    优点:使微指令字长大大缩短
    缺点:需译码,各微命令不能并行,使微程序很长
    ***典型的垂直型微指令***
    3. 字段直接编码法
    将微指令操作控制字段划分为若干个子字段,每个子字段内的所有微命令进行统一编码。
    在这里插入图片描述

    子字段划分的主要原则
    ① 把互斥的微命令划分在同一字段内,如存储器的读和写。相容的微命令划分在不同字段内,如ALU和存储器之间的微命令。
    ② 一般每个子字段应留出一个编码状态,表示本字段不发任何微命令。(参考计算机操作系统的控制信号)
    ③每个子字段所定义的微命令数不宜太多,否则将使微命令译码复杂。
    4.字段间接编码方式
    微命令的产生并不是直接从一个字段译码得到,而是需要另一个字段的编码加以解释 。
    有效地压缩了微指令字长,不仅组内的微命令是相斥的,组与组之间也成为互斥的,降低了微指令的并行操作能力,接近于垂直型微指令格式。 (类似计算机操作系统的多生产着,多消费者问题
    在这里插入图片描述

    展开全文
  • CPU微指令相关概念

    2021-02-20 12:49:05
    第1章 程序控制器 程序控制器是一种控制器,同组合逻辑控制器相比较,具有规整性、灵活性、可维护性等一系列优点,因而在计算机设计中逐渐取代了早期采用的组合逻辑控制器,并已被广泛地应用。在计算机系统中,...

    第1章 微程序控制器

    微程序控制器是一种控制器,同组合逻辑控制器相比较,具有规整性、灵活性、可维护性等一系列优点,因而在计算机设计中逐渐取代了早期采用的组合逻辑控制器,并已被广泛地应用。在计算机系统中,微程序设计技术是利用软件方法来设计硬件的一门技术 。

    中文名 微程序控制器
    外文名 Microprogram controller
    基本思想 按照通常的解题程序的方法
    优 点 规整性、灵活性、可维护性
    设计技术 利用软件方法来设计硬件
    定 义 采用微程序控制方式的控制器

    1.1 定义

    采用微程序控制方式的控制器称为微程序控制器。所谓微程序控制方式是指微命令不是由组合逻辑电路产生的,而是由微指令译码产生。一条机器指令往往分成几步执行,将每一步操作所需的若干位命令以代码形式编写在一条微指令中,若干条微指令组成一段微程序,对应一条机器指令。在设计CPU时,根据指令系统的需要,事先编制好各段微程序 ,且将它们存入一个专用存储器(称为控制存储器)中。微程序控制器由指令寄存器IR、程序计数器PC、程序状态字寄存器PSW、时序系统、控制存储器CM、微指令寄存器以及微地址形成电路、微地址寄存器等部件组成。执行指令时,从控制存储器中找到相应的微程序段,逐次取出微指令,送入微指令寄存器,译码后产生所需微命令,控制各步操作完成。

    1.2 基本概念

    微命令和微操作
    微命令:控制部件通过控制线向执行部件发出的各种控制命令。它构成控制信号的最小单元 [1] 。
    微操作:执行部件接受微命令后所进行的操作。它是由微命令实现的最基本操作 [1] 。
    控制部件与执行部件通过控制线和反馈信息进行联系。
    微指令和微程序
    微指令,在机器的一个CPU周期中,一组实现一定操作功能的微命令的组合。
    微程序,实现一条机器指令功能的许多条微指令组成的序列。
    控制部件与执行部件通过控制线和反馈信息进行联系。
    CPU周期与微指令周期的关系
    在串行方式的微程序控制器中:微指令周期 = 读出微指令的时间 + 执行该条微指令的时间
    一个CPU周期为0.8μs,它包含四个等间隔的节拍脉冲T1—T4,每个脉冲宽度为200ns。用T4作为读取微指令的时间,用T1+T2+T3时间作为执行微指令的时间。例如,在前600ns时间内运算器进行运算,在600ns时间的末尾运算器已经运算完毕,可用T4上升沿将运算结果打入某个寄存器。与此同时可用T4间隔读取下条微指令,经200ns时间延迟,下条微指令又从只读存储器读出,并用T1上升沿打入到微指令寄存器。如忽略触发器的翻转延迟,那么下条微指令的微命令信号就从T1上升沿起就开始有效,直到下一条微指令读出后打入微指令寄存器为止。因此一条微指令的保持时间恰好是0.8μs,也就是一个CPU周期的时间。 [2]

    1.3 组成

    微程序控制器主要由控制存储器、微指令寄存器和地址转移逻辑三大部分组成。
    控制存储器
    控制存储器用来存放实现全部指令系统的微程序,它是一种只读存储器。若指令系统中有多少条机器指令,就有多少微程序。一旦微程序固化,机器运行时则只读不写。其工作过程是:每读出一条微指令,则执行这条微指令;接着又读出下一条微指令,又执行这一条微指令……。读出一条微指令并执 行微指令的时间总和称为一个微指令周期。通常,在串行方式的微程序控制器中,微指令周期就是只读存储器的工作周期。控制存储器的字长就是微指令字的长度,其存储容量视机器指令系统而定,即取决于微程序的数量。对控制存储器的要求是速度快,读出周期要短。 [3]
    微指令寄存器
    微指令寄存器用来存放由控制存储器读出的一条微指令信息。其中微地址寄存器决定将要访问的下一条微指令的地址,而微命令寄存器则保存一条微指令的操作控制字段和判别测试字段的信息。 [3]
    地址转移逻辑
    在一般情况下,微指令由控制存储器读出后直接给出下一条微指令的地址,通常我们简称微地址,这个微地址信息就存放在微地址寄存器中。如果微程序不出现分支,那么下一条微指令的地址就直接由微地址寄存器给出。当微程序出现分支时,意味着微程序出现条件转移。在这种情况下,通过判别测试字段P和执行部件的“状态条件”反馈信息,去修改微地址寄存器的内容,并按改好的内容去读下一条微指令。地址转移逻辑就承担自动完成修改微地址的任务。 [3]

    1.4 控制原理

    微程序控制的基本思想,就是仿照通常的解题程序的方法,把操作控制信号编成所谓的“微指令”,存放到一个只读存储器里.当机器运行时,一条又一条地读出这些微指令,从而产生全机所需要的各种操作控制信号,使相应部件执行所规定的操作 。
    微程序控制的基本原理是:
    (1)将机器指令分解为基本的微命令序列,在制造CPU时固化在控制存储器CM中,执行一条机器指令时,CPU依次从CM中取出微指令产生微命令。
    (2)一条微指令包含的微命令控制实现一步(一个节拍)操作,若干条微指令组成一小段微程序解释执行一条机器指令。 [1]

    1.5 执行过程

    (1)根据计算机给出的第一条微指令的地址,从控制存储器中取出第一条微指令。
    (2)微指令由操作控制部分和顺序控制部分组成。操作控制部分产生微操作控制信号,控制执行部分完成规定的操作。顺序控制部分中的直接顺序控制部分放入微地址寄存器,顺序控制部分的P字段和执行部件反馈的状态条件信息决定修改微地址寄存器中的值。
    (3)按地址寄存器中的值从控制存储器中取出下一条微指令,继续第二步,如此循环,直到全部指令执行完毕。

    1.6 设计步骤

    微程序控制器的设计步骤如下:
    (1)根据CPU的结构图描述出每条指令的微操作流程图并综合成总的流程图;
    (2)用混合控制法对微命令进行编码;
    (3)选择合适的控制和时序;
    (4)选用微程序的顺序控制方式为微指令安排微地址;
    (5)画出微程序控制器组成框图。 [4]

    1.7 组合逻辑控制器和微程序控制器的比较

    组合逻辑控制器和微程序控制器,除了操作控制信号的形成方法和原理有差别外,其余的组成部分上没有本质的区别。最显著的差别可归纳为如下两点:
    实现方式
    微程序控制器的控制功能是在存放微程序的控制存储器和存放当前正在执行的微指令的寄存器直接控制下实现的,而组合逻辑控制器由逻辑电路实现。前者电路比较规整,各条指令控制信号的差别反映在控制存储器的内容上,因此无论是增加或修改(包括纠正设计中的错误或升级)指令,只要增加或者修改内容即可。组合逻辑控制器先用逻辑表达式列出,精简化后用逻辑门电路实现,因而显得零乱复杂,当需要增加或修改指令时很麻烦甚至不可能,因此微程序控制器得到了广泛应用,尤其是指令系统复杂的计算机,一般都采用微程序控制器。 [1]
    性能
    在同样的工艺条件下,微程序控制的速度比组合逻辑电路速度低,因为执行每条微指令都要从控制存储器(CM)中读取一次,影响了速度,而组合逻辑电路的速度主要取决于电路延迟,因而在高速或超高速计算机中,对影响速度的关键部分如CPU,往往采用组合逻辑电路。近年来,一些新的计算机系统如RISC(精简指令计算机),选用了组合逻辑控制器。 [1]

    1.8 参考资料

    1. 李捍东主编 .微机原理与接口技术.重庆:重庆大学出版社,2004:49-51
    2. 微程序控制器 .湖南学院网[引用日期2012-10-12]
    3. 宋红主编.计算机组成原理 .北京:中国铁道出版社,2008:102-103
    4. 陈琳琳编著.计算机组成原理答疑解惑与典型题解.北京:北京邮电大学出版社,2015:190-190

    第2章 微指令

    本词条由“科普中国”科学百科词条编写与应用工作项目 审核 。
    微指令是指在微程序控制的计算机中,同时发出的控制信号所执行的一组微操作。微指令是由同时发出的控制信号的有关信息汇集起来形成的。将一条指令分成若干条微指令,按次序执行就可以实现指令的功能。若干条微指令可以构成一个微程序,而一个微程序就对应了一条机器指令。
    中文名 微指令
    外文名 microinstruction
    作 用微程序控制
    定 义 实现一定操作功能的微命令的组合
    领 域 计算机
    格 式 水平型微指令和垂直型微指令

    2.1 定义编辑

    微指令是指在机器的一个CPU周期中,一组实现一定操作功能的微命令的组合 [1] ,描述微操作的语句。微命令是指控制部件通过控制线向执行部件发出各种控制命令。操作微指令是描述受控电路的操作语句 , 分支微指令是描述控制电路的分支语句。
    一条机器指令的功能是若干条微指令组成的序列来实现的,即一条机器指令所完成的操作分成若干条微指令来完成,由微指令进行解释和执行,这个微指令序列通常叫做微程序。微指令的编译方法是决定微指令格式的主要因素。考虑到速度,成本等原因,在设计计算机时采用不同的编译法 。因此微指令的格式大体分成两类:水平型微指令和垂直型微指令。

    2.2 类型

    水平型微指令
    一次能定义并执行多个并行操作微命令的微指令,叫做水平型微指令。水平型微指令的一般格式如下:控制字段,判别测试字段和下地址字段。按照控制字段的编码方法不同,水平型微指令又分为三种:一种是全水平型(不译法)微指令,第二种是字段译码法水平型微指令,第三种是直接和译码相混合的水平型微指令。
    垂直型微指令
    微指令中设置微操作码字段,采用微操作码编译法,由微操作码规定微指令的功能,称为垂直型微指令。垂直型微指令的结构类似于机器指令的结构.它有操作码,在一条微指令中只有l-2个微操作命令,每条微指令的功能简单,因此,实现一条机器指令的微程序要比水平型微指令编写的微程序长得多 .它是采用较长的微程序结构去换取较短的微指令结构。
    水平型微指令与垂直型微指令的比较
    (1)水平型微指令并行操作能力强,指令高效,快速,灵活,垂直型微指令则较差。
    (2)水平型微指令执行一条指令时间短,垂直型微指令执行时间长。
    (3)由水平型微指令解释指令的微程序,有微指令字较长而微程序短的特点。垂直型微指令则相反。
    (4)水平型微指令用户难以掌握,而垂直型微指令与指令比较相似,相对来说,比较容易掌握。

    2.3 规范化描述

    规范化描述就是在指令系统的微指令描述中尽量减小语句使用的随意性,使整个指令系统的描述具有较强的规律性,并使微操作集中的元素最少。事实上只要微指令描述合理规范,从微程序设计角度来看,所描述的功能都是可以通过ASIC技术实现的。在一条指令的描述中, 指令的微操作步数必须与指令所需的时钟周期数相吻合,分配好各微指令序列所占的时钟数,安排好各微指令组和各微指令序列在整个控制序列中的位置,这是指令系统规范化描述的基础。在同类指令的描述中, 完成相同微功能的微指令序列所占的时钟周期数必须相同, 在控制序列中的分配位置必须合理。例如字除法指令比字节除法指令多8个状态周期,因此每位除法只能占用一个状态周期。再例如操作数长度相同的有符号数除法指令和无符号数除法指令相比多增加 4个状态周期,因此有符号除法中被除数和除数、商和余数的符号化处理,只能分别在2个状态周期中实现,且删除这4个状态周期中的所有微指令 [2] 。

    2.4 相关指令

    机器指令和微指令的关系
    一台数字计算机基本上可以划分为两大部分——控制部件和执行部件。控制器就是控制部件,而运算器、存储器、外围设备相对控制器来说就是执行部件。控制部件与执行部件的一种联系就是通过控制线。控制部件通过控制线向执行部件发出各种控制命令,通常这种控制命令叫做微命令,而执行部件接受微命令后所执行的操作就叫做微操作。控制部件与执行部件之间的另一种联系就是反馈信息。执行部件通过反馈线向控制部件反映操作情况,以便使得控制部件根据执行部件的状态来下达新的微命令,这也叫做“状态测试”。微操作在执行部件中是组基本的操作。由于数据通路的结构关系,微操作可分为相容性和相斥性两种。在机器的一个CPU周期中,一组实现一定操作功能的微命令的组合,构成一条微指令。一般的微指令格式由操作控制和顺序控制两部分构成。操作控制部分用来发出管理和指挥全机工作的控制信号。其顺序控制部分用来决定产生下一个微指令的地址。事实上一条机器指令的功能是由许多条微指令组成的序列来实现的。这个微指令序列通常叫做微程序。既然微程序是由微指令组成的,那么当执行当前的一条微指令的时候。必须指出后继微指令的地址,以便当前一条微指令执行完毕以后,取下一条微指令执行。机器指令和微指令的关系归纳如下:

    1. 一条机器指令对应一个微程序,这个微程序是由若干条微指令构成的。因此,一条机器指令的功能是若干条微指令组成的序列来实现的。简而言之,一条机器指令所完成的操作划分成若干条微指令来完成,由微指令进行解释和执行。
      2.从指令与微指令,程序与微程序,地址与微地址的一一对应关系上看,前者与内存储器有关,而后者与控制存储器(它是微程序控制器的一部分。微程序控制器主要由控制存储器、微指令寄存器和地址转移逻辑三部分组成。其中,微指令寄存器又分为微地址寄存器和微命令寄存器两部分)有关,与此相关也有相对应的硬设备。
      3.一条机器指令对应4个CPU周期,每个CPU周期就对于一条微指令。
      参考资料
    2. 白中英-.计算机组成原理:科学出版社,2012
    3. 宋琦,龚茂康. 微处理器功能的微指令描述[J]. 江苏农学院学报,1997,(01):86-90. .中国知网[引用日期2017-12-14]

    第3章 微命令

    微命令即控制部件通过控制线向执行部件发出各种控制命令 。在微指令的控制字段中,每一位代表一个微命令。
    中文名 微命令
    属 性 控制命令

    3.1 简介

    在微指令的控制字段中,每一位代表一个微命令,在设计微指令时,是否发出某个微命令,只要将控制字段中相应位置成"1"或"0",这样就可打开或关闭某个控制门,这就是直接控制法.
    在6.3节中所讲的就是这种方法.但在某些复杂的计算机中,微命令甚至可多达三四百个,这使微指令字长达到难以接受的地步,并要求机器有大容量控制存储器,为了改进设计出现了以下各种编译法.

    3.2 方法

    字段直接编译法
    在计算机中的各个控制门,在任一微周期内,不可能同时被打开,而且大部分是关闭的(相应的控制位为"0").所谓微周期,指的是一条微指令所需的执行时间.如果有若干个(一组)微命令,在每次选择使用它们的微周期内,只有一个微命令起作用,那么这若干个微命令是互斥的.
    例如,向主存储器发出的读命令和写命令是互斥的;又如在ALU部件中,送往ALU两个输入端的数据来源往往不是唯一的,而每个输入端在任一微周期中只能输入一个数据,因此控制该输人门的微命令是互斥的.
    选出互斥的微命令,并将这些微命令编成一组,成为微指令字的一个字段,用二进制编码来表示, 就是字段直接编译法.
    例如,将7个互斥的微命令编成一组,用三位二进制码分别表示每个微命令,那么在微指令中,该字段就从7位减成3位,缩短了微指令长度.而在微指令寄存器的输出端,为该字段增加一个译码器,该译码器的输出即为原来的微命令.
    字段长度与所能表示的微命令数的关系如下:
    字段长度 微命令数
    2位 2~3
    3位 4~7
    4位 8~15
    一般每个字段要留出一个代码,表示本段不发出任何微命令,因此当字段长度为3位时,最多只能表示7个互斥的微命令,通常代码000表示不发微命令.
    字段间接编译法
    字段间接编译法是在字段直接编译法的基础上,进一步缩短微指令字长的一种编译法.
    如果在字段直接编译法中,还规定一个字段的某些微命令,要兼由另一字段中的某些微命令来解释,称为字段间接编译法.
    本方法进一步减少了指令长度,但很可能会削弱微指令的并行控制能力,因此通常只作为直接编译法的一种辅助手段.
    字段A(3位)的微命令还受字段B控制,当字段B发出b1微命令时,字段A发出a1,1,a1,2,…,a1,7中的一个微命令;而当字段B发出b2微命令时,字段A发出a2,1,a2,2,…,a2,7中的一个微命令,仅当A为000时例外,此时什么控制命令都不产生.
    4.常数源字段E
    在微指令中,一般设有一个常数源字段E就如指令中的直接操作数一样.E字段一般仅有几位,用来给某些部件发送常数,故有时称为发射字段.
    该常数有时作为操作数送入ALU运算;有时作为计算器初值,用来控制微程序的循环次数等.
    当前正在执行的微指令,称为现行微指令,现行微指令所在的控制存储器单元的地址称现行微地址,现行微指令执行完毕后,下一条要执行的微指令称为后继微指令,后继微指令所在的控存单元地址称为后继微地址.
    所谓微程序流的控制是指当前微指令执行完毕后,怎样控制产生后继微指令的微地址.
    与程序设计相似,在微程序设计中除了顺序执行微程序外还存在转移功能和微循环程序和微子程序等,这将影响下址的形成.
    下面介绍几种常见的产生后继微指令地址的方法.
    (1)以增量方式产生后继微地址.
    在顺序执行微指令时,后继微地址由现行微地址加上一个增量(通常为1)形成的;而在非顺序执行时则要产生一个转移微地址.
    机器加电后执行的第一条微指令地址(微程序入口)来自专门的硬件电路,控制实现取令操作,然后由指令操作码产生后继微地址.接下去,若顺序执行微指令,则将现行微地址主微程序计数器( PC中)+1产生后继微地址;若遇到转移类微指令,则由 PC与形成转移微地址的逻辑电路组合成后继微地址.
    (2)增量与下址字段结合产生后继微地址
    将微指令的下址字段分成两部分:转移控制字段BCF和转移地址字段BAF,当微程序实现转移时,将BAF送 PC,否则顺序执行下一条微指令( PC+1).
    执行微程序条件转移时,决定转移与否的硬件条件有好几种.例如,“运算结果为零”,“溢出”,“已完成指定的循环次数"等.
    我们假设有八种转移情况,定义了八个微命令(BCF取3位),在图中设置计数器CT用来控制循环次数.如在执行乘(或除)法指令时,经常采用循环执行"加,移位”(或减,移位)的方法,指令开始执行时,在CT中置循环次数)每执行一次循环,计数器减1,当计数器为零时结束循环.又考虑到执行微子程序时,要保留返回微地址,因此图中设置了一个返回寄存器RR.

    展开全文
  • 计算机组成原理(微机原理)是计算机专业学生必修的一门课程,也是考研的专业课,这是一门研究计算机工作原理的课程,但理论知识掌握的再好,不能用到实际中也只是文字而已,因此,课程设计就是理论结合实际的很好...

    前排提示:由于本人当年太水,写的博客质量低下,随着CSDN推出MarkDown编辑器,让楼主让这样的手残党也可以正常排版,这篇文章的重编版在这(点我去最新版


          计算机组成原理(微机原理)是计算机专业学生必修的一门课程,也是考研的专业课,这是一门研究计算机工作原理的课程,但理论知识掌握的再好,不能用到实际中也只是文字而已,因此,课程设计就是将理论结合实际的很好的一种方式(全是废话)

          好的,说说本次的课程设计,首先,我所做的课程设计是在Dais CMX16 的16位模型机基础上实现的,地点是烟台大学,各个大学的课程设计可能稍有差别,但大体思路应该是一样的。


    设计目的:

    1、计算机组成原理课程设计的主要任务是让学生通过动脑和动手解决计算机设计中的实际问题。

    2、综合运用所学计算机组成原理知识,在掌握部件单元电路实验的基础上,进一步将其组成系统构造一台基本的模型计算机,掌握整机概念,并设计机器指令系统,编写程序,在所设计的模型计算机上调试运行。

    3、通过一台模型机的设计过程,明确计算机的控制原理与控制过程,巩固和灵活应用所学的理论知识,掌握计算机组成的一般设计方法,提高学生设计能力和实践操作技能,为从事计算机研制与设计打下基础



    设计分析:

    、实验原理

    本实验将能在微程序控制下自动产生各部件单元的控制信号,实现特定指令的功能。这里,计算机数据通路的控制将由微程序控制器来完成,CPU从EM主存中取出一条机器指令到指令执行结束的一个指令周期全部由微指令组成的序列来完成,即一条机器指令对应一个微程序。

    、机器指令格式


    系统体系结构图

    7 6 5

    4

    3 2

    1 0

    OP-CODE

    0

    Rs

    Rd

    Addr

    其中OP-CODE为操作码段,位于指令字节高三位(IR7~IR5);第四位IR4是保留位,指定为零;低四位为源与目的寄存器地址,它们的编码见下表;Addr定义操作数或操作地址。

    Rs或Rd

    选定的寄存器

    00

    01

    10

    11

    R0

    R1

    R2

    R3

    、微指令格式

    按照系统建议的微指令格式,参照微指令流程图,将每条微指令代码化,译成二进制代码表,并将二进制代码表转换成十六进制格式文件。

     

     

    M23

    M22

    M21

    M20

    M19

    M18

    M17

    M16

    M15

    M14

    M13

    M12

    M11

    M10

    M9

    M8

    M7

    M6

    M5

    M4

    M3

    M2

    M1

    M0

    E/M

    IP

    MWR

    R/M

    目的编码

    OP

    M

    CN

    S2

    S1

    S0

    源编码

    XP

    W

    ALU

    Iu

    IE

    IR

    Icz

    Ids

     

     

    源编码

     

    目的编码

    M10

    M9

    M8

    功能

     

    M19

    M18

    M17

    功能

    X2

    X1

    X0

    O2

    O1

    O0

    1

    1

    1

    禁止

    1

    1

    1

    禁止

    1

    1

    0

    ALU

    1

    1

    0

    MAR

    1

    0

    1

    SP

    1

    0

    1

    BX

    1

    0

    0

    IOR

    1

    0

    0

    AX

    0

    1

    1

    MRD

    0

    1

    1

    SP

    0

    1

    0

    XRD

    0

    1

    0

    IOW

    0

    0

    1

    RRD

    0

    0

    1

    XWR

    0

    0

    0

    PC

    0

    0

    0

    RWR

     


    指令(程序)设计:

    、指令系统

    设计八条机器指令:IN(输入)、ADD(十六进制加法)、SUB(减法)、MUL(乘法)、DIV(除法)、STA(置数)、OUT(输出)、JMP(无条件转移)。

     

     

     

     

    助记符

    机器指令码

    说明

    IN R0,IOL

    00100000

    i/o(数据开关)偶字节→r0

    ADD R0,[addr]

    01000000 XXXXXXXX XXXXXXXX

    R0+[addr]→R0

    SUB R0,[addr]

    00000000 XXXXXXXX XXXXXXXX

    R0-[addr] →R0

    MUL [num1,2]

    11000101 XXXX XXXX

    num1*num2→R1

    DIV [num1,2]

    11101010 XXXX XXXX

    num2/num1→R2

    STA [num],IOH

    01100000 XXXXXXXX XXXXXXXX

    [num] →i/o

    OUT [addr],IOH

    10000000 XXXXXXXX XXXXXXXX

    RAM→i/o(奇字节)

    JMP addr

    10100000 XXXXXXXX XXXXXXXX

    addr→PC

     

    其中IN为单字节(8位)指令,其余为三字节指令,XXXXXXXX XXXXXXXX为addr对应的二进制地址码,XXXX XXXX为立即数。

     



    、指令流程图



    、实验所用的机器指令

    地址

    指令代码

    助记符

    功能

    000

    20

    in  r0,ioL

    i/o(数据开关)偶字节→r0

    001

    40 60 02

    add r0,[addr]

    r0+RAM→r0

    004

    00 60 02

    SUB R0,[ADDR]

    R0-RAM→R0

    007

    C5 03 02

    MUL [num1,2],r0

    num1*num2→r0

    00A

    60 ff 01

    sta [num],ioh

    num→ioh

    00d

    ea 04 02

    div [num1,2],r0

    num2/num1→r0

    010

    80 61 02

    out [addr],ioH

    RAM→i/o(奇字节)

    013

    a0 00 00

    jmp 0000h

    0000h→pc

    、指令系统

    ;基本模型机指令系统

     

    ;助记符 操作数              指令码 长度

    ;-----------------------------------------------------

    SUB     R0,*               00     3 ;(600)寄存器内容减去内存单元内容

    IN      R0,IOL             20     1 ;(640)将IOL数据读出到寄存器R0

    ADD     R0,*               40     3 ;(680)直接字节加到寄存器R0

    STA     *,IOH              60     3 ;(6C0)寄存器R0写入直接内存

    OUT     IOH,*               80     3 ;(700)直接字节输出到IOH

    JMP     *                  A0     3 ;(740)无条件转移

    MUL     *                  C5     3 ;(780)寄存器数据与内存单元数据相乘后存入内存

    DIV     *                  EA     3 ;(7C0)将两个内存单元的数相除


    、源程序

    ;基本模型机程序

    #LOAD"InstructionSys.IS"         ;预调入指令系统/微程序

    #SETRAM 0260H = 1100h;数据区0260H单元预置数据1100h

     

    data    segment        ;将程序装载到数据存储器

            assume ds:data

     

            org  0

    start:

            in   r0, iol   ;将IO低位送到R0

            add  r0, 0260h ;将R0的内容与内存0260单元的内容相加,送回R0

            sub  r0,0260h  ;将R0的内容与内存0260单元的内容相减,送回R0

            mul  0203h     ;立即数02和03,将02和03相乘送到R1

            sta  01ffh,ioh ;将FF00送到IO

            div  0204h     ;将立即数04除以立即数02送到R2

    out   ioh, 0260h;将内存0260单元的内容输出到IO

            jmp  0000h     ;将PC的内容置零,返回第一条机器指令

    data    ends

            end star



    最后,如果有不懂得地方,可以留言,也可以加我的QQ1451574179,附上我的设计报告以及程序





    展开全文
  • 介绍代码虚拟[译]

    千次阅读 2015-10-21 10:35:17
    介绍代码虚拟[译]标签(空格分隔): 代码虚拟介绍代码虚拟By Nooby翻译:FadeTrack本文描述了如何通过“虚拟机”保护代码 并且 这种技术运用在流行的虚拟机上。带着你从入门到精通。 :) 翻译不当之处多多...

    介绍代码虚拟化[译]

    标签(空格分隔): 代码虚拟化


    介绍代码虚拟化

    By Nooby

    本文描述了如何通过“虚拟机”保护代码 并且 将这种技术运用在流行的虚拟机上。

    带着你从入门到精通。 :)

    翻译不当之处多多见谅,遇到疑惑或者有问题的地方,请以原文为准。

    为什么称为虚拟机?

    早期的软件保护,比较成熟的办法都是基于 模糊 和 变化(混淆、膨胀),这种方法将垃圾代码插入到原始代码流,或是改变原来的指令为意义相似的指令,又或是替换一些常量计算。插入有条件的和无条件的分支 以及 在关键的执行代码上随机的插入一些字节(使得这个流程不可逆)。
    例子 example_obfuscated.exe 就是这样处理的。

    随着时间的推移,程序员的水平上升和调试器的增强。一些成熟的逆向工程工具和手段使得原本被保护的代码变得 可读/可逆。使用膨胀的方法确实能有效阻止逆向,但是会增大软件的体积。于是,人们开始追求一个新的保护代码的方法,这种方法不用增长大小。

    这样的循环代码就像一个原始代码的“模拟器”(或者称为解释器)。
    接收的数据流 ( 又称为Pesudo-code or P-code),做微操作(处理程序),就像一个“虚拟机”执行指令集那样。最终这个过程演变为了: code virtialization。(指令虚拟化)

    虚拟机是如何工作的呢?

    我们知道真实的处理器 拥有 寄存器,翻译解码器 以及 逻辑处理器。虚拟级也是一样的。
    虚拟机的入口代码实际上是在收集实体处理器的上下文信息,执行循环将读取 P-Code 并派发到相应的处理程序(handler),当虚拟机退出时,它将通过之前保存的上下文信息来更新真实的处理器的寄存器信息。

    这里做一个简单例子,来假设一个函数将通过虚拟机执行。

    最初的指令:
    add eax, ebx
    Retn
    
    通过将其转换为虚拟代码:
    push address_of_pcode                    ==> 将 p-code 的地址入栈
    jmp VMEntry
    
    VMEntry:
    push all register values                 ==> 将所有的寄存器信息入栈
    jmp VMLoop
    
    VMLoop:
    从 VMEIP 处 获取 p-code
    调度处理程序 [Add_EAX_EBX_]
    VMInit:
    pop all register values into VMContext   ==> 将所有寄存器的值弹出到 VMContext  
    pop address_of_pcode into VMEIP          ==> 将 p-code 弹出到 VMEIP
    jmp VMLoop
    
    Add_EAX_EBX_Hander:
    do “add eax, ebx” on VMContext           ==> 在 VMContext 里面完成 操作
    jmp VMLoop
    
    VMRetn:
    restore register values from VMContext   ==> 通过VMContext恢复寄存器信息  
    do “retn”                                ==> 返回

    注意,虚拟机最好不要效仿x86指令,因为如果指令也能被真正的处理器执行的话,可能会在某些特定的地方导致虚拟机退出,之后就会卡死在这里或则出现一些不可预料的情况( Ps: 这一句不太好翻译)。
    实际的虚拟机的处理程序通常用更通用的设计思想,而不是上面的示例中的处理程序。
    通常 p - code也决定了操作数。
    “Add_EAX_EBX_Handler”可以被定义为“Add_Handler”,它需要两个参数,产生一个结果。
    也会 加载/存储 寄存器,处理过程/保存参数和结果。
    这样会提高处理程序的可重用性,以便跟踪处理程序而不需要去理解虚拟机的原始构造代码。

    现在我们来看看 一个基于堆栈(stack-based)的虚拟机是如何工作的:

    Add_Hander:
    pop REG                  ; REG = parameter2
    add [STACK], REG         ; [STACK] points to parameter1
    GetREG_Handler:
    fetch P-Code for operand
    push VMCONTEXT[operand]  ; push value of REG on stack
    SetREG_Handler:
    fetch P-Code for operand
    pop VMCONTEXT[operand]   ; pop value of REG from stack
    The P-Code of above function will be:
    Init
    GetREG EBX
    GetREG EAX
    Add
    SetREG EAX
    Retn

    现代虚拟机针对逆向工程做了些什么?

    对于虚拟机来说,代码混淆和变形是非常重要的,因为直接将虚拟机的解释器暴露在外的话,逆向者就可以通过一些自动化的工具对虚拟机的底层构架进行分析。
    由于处理器上的一些寄存器并没有被使用(VMContext和 虚拟机解释器可能使用的少量寄存器 是 分开存储),所以它们可以被用作额外的混淆。
    虚拟机的处理程序可以设计成尽可能少的操作数/上下文依赖性。
    此外,真正的处于 VMContext 的 堆栈指针可能被追踪,堆栈可以被抛弃在解释器循环内。

    通过以上说明,不难看出代码混淆和变形可以是非常有效的。

    混淆虚拟机的例子可以在example_virtualized.exe中找到。

    现在我们知道如何保护虚拟机的执行部分,让我们继续看看将指令转换为p-Code 的方法,这是虚拟化的精彩的一部分代码。

    指令分解

    逻辑指令

    这里有一个增加可用性和复杂性的方法。

    逻辑处理可以根据下面的公式分解成类似 NAND/NOR 的操作:

    NOT(X) = NAND(X, X) = NOR(X, X)
    AND(X, Y) = NOT(NAND(X, Y)) = NOR(NOT(X), NOT(Y)) 
    OR(X, Y) = NAND(NOT(X), NOT(Y)) = NOT(NOR(X, Y))
    XOR(X, Y) = NAND(NAND(NOT(X), Y), NAND(X, NOT(Y))) = NOR(AND(X, Y), NOR(X, Y))

    算术指令

    减法可被转换成带EFlags进位计算的加法。

    SUB(X, Y) = NOT(ADD(NOT(X), Y))

    将 EFLAGES 之前的最后一个 NOT 作为 A, EFLAGES 之后的最后一个 NOT 最为B,那么计算如下:
    EFLAGS = OR(AND(A, 0x815), AND(B, NOT(0x815))) ; 0x815 masks OF, AF, PF and CF

    寄存器抽象

    由于虚拟机可以比一个实际的x86处理器有更多的寄存器,真正的处理器寄存器可以动态地映射到虚拟机寄存器,可以使用额外的寄存器来存储中间值或用来做混淆。使得指令通过下文所述的内容得到进一步的模糊和优化。

    上下文轮循

    由于寄存器的抽象,不同的 p-code可以有不同的寄存器映射,这样就可以不时的去改变设计,使得逆向更加困难。

    当下一块 P-Code 具有不同的寄存器映射时,虚拟机仅仅交换处于上下文的值。

    当像XCHG这一类的转换指令时,它可以简单地改变寄存器而不产生任何P- code的映射。看下面的例子:

    原来的指令:

    xchg ebx, ecx
    add eax, ecx

    不具备上下文轮循的P-Code:

    当前寄存器映射

    Real Registers  Virtual Registers
    EAX     R0
    EBX     R1
    ECX     R2
    GetREG R2 ; R2 = ECX
    GetREG R1 ; R1 = EBX
    SetREG R2 ; ECX = value of EBX
    SetREG R1 ; EBX = value of ECX
    GetREG R2
    GetREG R0 ; R0 = EAX
    Add
    SetREG R0

    具备上下文轮循的P-Code(在p-code生成完成时交换):

    Before Exchange
    Real Registers  Virtual Registers
    EAX     R0
    EBX     R1
    ECX     R2
    After Exchange
    Real Registers  Virtual Registers
    EAX     R0
    EBX     R2
    ECX     R1
    [Map R1 = ECX, R2 = EBX] ; exchange
    GetREG R1        ; R1 = ECX
    GetREG R0        ; R0 = EAX
    Add
    SetREG R0        ; R0 = EAX

    这样的轮循也可以应用到最后SetREG操作, 这样的结果还将写入另一个未使用的虚拟机寄存器(即 R3), 舍弃拥有无效数据的R0。这一块 P-Code 的操作将在3个寄存器上,所以它很难被还原。

    P-Code With Context Rotation 2:
    [Map R1 = ECX, R2 = EBX]     ; exchange
    GetREG R1   ; R1 = ECX
    GetREG R0   ; R0 = EAX
    Add
    [Map R0 = Unused, R3 = EAX]     ; rotation
    SetREG R3   ; R3 = EAX

    寄存器别名:

    当处理一条指令时,尤其是在寄存器之间赋值时,可能会出现 源寄存器 和 目标寄存器 之间的映射。除非源寄存器将被改变(强制重新映射或GetREG & SetREG操作)。
    这种映射可以读访问权目标寄存器,将其重定向到它没有实际执行任务的来源。

    采取以下的代码为例:

    Original Instructions:
    mov eax, ecx
    add eax, ebx
    mov ecx, eax
    mov eax, ebx
    P-Code:
    Current Register Mappings
    Real Registers  Virtual Registers
    EAX     R0
    EBX     R1
    ECX     R2
    [Make alias R0 = R2]
    GetREG R1               ; R1 = EBX
    GetREG R2               ; reading of R0 redirects to R2
    Add
    [R0(EAX) is being changed, since R0 is destination of an alias, just clear its alias]
    [Map R0 = Unused, R3 = EAX]     ; rotation
    SetREG R3               ; R3 = EAX
    [Make alias R2 = R3]
    GetREG R1
    [R3(EAX) is being changed, since R3 is source of an alias, we need to do the assignment]
    [Map R3 = ECX, R2 = EAX]    ; we can simplify the R2 = R3 assignment by rotation
    [Map R0 = EAX, R3 = Unused] ; another rotation
    SetREG R0               ; R0 = EAX

    寄存器用法分析:

    给定上下文的一组指令,它可以确定,在某些时候某些寄存器的值改变的而不影响程序逻辑,以及一些EFLAGS计算的开销可以忽略。

    例如,在0 x4069A8 example.exe 的一段代码:

    PUSH EBP
    MOV EBP, ESP                          ; EAX|ECX|EBP|OF|SF|ZF|PF|CF
    SUB ESP, 0x10                         ; EAX|ECX|OF|SF|ZF|PF|CF
    MOV ECX, DWORD PTR [EBP+0x8]          ; EAX|ECX|OF|SF|ZF|PF|CF
    MOV EAX, DWORD PTR [ECX+0x10]         ; EAX|OF|SF|ZF|PF|CF
    PUSH ESI                              ; OF|SF|ZF|PF|CF
    MOV ESI, DWORD PTR [EBP+0xC]          ; ESI|OF|SF|ZF|PF|CF
    PUSH EDI                              ; OF|SF|ZF|PF|CF
    MOV EDI, ESI                          ; EDI|OF|SF|ZF|PF|CF
    SUB EDI, DWORD PTR [ECX+0xC]          ; OF|SF|ZF|PF|CF
    ADD ESI, -0x4                         ; ECX|OF|SF|ZF|PF|CF
    SHR EDI, 0xF                          ; ECX|OF|SF|ZF|PF|CF
    MOV ECX, EDI                          ; ECX|OF|SF|ZF|PF|CF
    IMUL ECX, ECX,0x204                   ; OF|SF|ZF|PF|CF
    LEA ECX, DWORD PTR [ECX+EAX+0x144]    ; OF|SF|ZF|PF|CF
    MOV DWORD PTR [EBP-0x10], ECX         ; OF|SF|ZF|PF|CF
    MOV ECX, DWORD PTR [ESI]              ; ECX|OF|SF|ZF|PF|CF
    DEC ECX                               ; OF|SF|ZF|PF|CF
    TEST CL, 0x1                          ; OF|SF|ZF|PF|CF
    MOV DWORD PTR [EBP-0x4],  ECX
    JNZ 0x406CB8

    注释展示了在指令执行之前的违背使用的 寄存器/flag 的状态。 这些被用作生成寄存器轮循。
    EFLAGS计算冗长并且夹杂垃圾指令,这使得逆向更加复杂。

    其他的 P- code陷阱和优化

    常量加密

    将原本指令内的常量给转换成算式计算,这样常量出现在运行时,可以避免直接暴露。

    堆栈混淆

    虚拟机可以通过pushing/writing随机值来混淆的堆栈,而真正的ESP可以从VMContext 计算/跟踪得到。

    用多个虚拟机解释

    It is possible to use multiple virtual machines to execute one series of P-Code. On certain points, a
    special handler leading to another interpreter loop is executed. The P-Code data after such points
    are processed in a different virtual machine. These virtual machines need only to share the
    intermediate run-time information such as register mappings on switch points. Tracing such P-Code
    will need to analyze all virtual machine instances, which is considerably much more work.

    References

    VMProtect
    http://vmpsoft.com/
    Code Virtualizer
    http://www.oreans.com/
    Safengine
    http://www.safengine.com/
    ReWolf’s x86 Virtualizer
    http://rewolf.pl/stuff/x86.virt.pdf
    OllyDBG
    http://www.ollydbg.de/
    VMSweeper
    http://forum.tuts4you.com/topic/25077-vmsweeper/

    展开全文
  • 虚拟技术-指令集虚拟

    千次阅读 2009-03-17 12:50:00
    在上篇,我们已经知道计算机系统的虚拟可以在硬件,指令集,操作系统,库以及高级语言等5个不同层次上实现。目前流行的许多虚拟技术,如XEN的半虚拟,VMware的全虚拟,以及Interl VT-x和AMD Pacifica的硬件...
  • AStyle格式化代码插件的TrueSTUDIO配置

    千次阅读 2019-04-19 15:01:54
    TrueSTUDIO、Keil的代码格式神器AStyle废话不多说直接上干货 废话不多说直接上干货 1.AStyle下载 AStyle 代码格式工具 下载地址:link 下载好了之后,解压到一个你认为方便你的地方,最好没有英文,推荐放在True...
  • ARM 嵌入式处理器指令集(上)

    千次阅读 2017-12-08 11:23:17
    ARM 嵌入式处理器指令集ARM 处理器实现的指令集 32 位的 ARM 指令集和 16 位的 Thumb 指令集 ARM 处理器允许在 ARM 状态和 Thumb 状态之间进行切换和互操作,保证用户在运算性能和代码密度之间的选择的灵活性 采用...
  • 指令系统

    千次阅读 2015-04-24 10:33:51
    计算机的操作和控制是由计算机的指令完成的。在计算机中有两种信息流,一种是... 从计算机组成的层次结构来说,计算机的指令有微指令、机器指令和宏指令之分。 微指令:微程序级的命令,它属于硬件; 宏指令:由若干
  • 云编排式物联APP开发平台可通过云端可视编排开发,边端远程自动部署,云边协同管理运维的方式,实现物联网APP快速开发,海量边端应用管理。
  • CPU的功能和基本结构CPU的功能运算器控制器CPU的基本结构指令执行过程三个...微指令格式微指令编码方式硬布线和微程序控制器的特点指令流水线基本概念指令流水的定义流水线的表示方法性能指标吞吐率加速比效率影响因素...
  • ARM处理器的指令系统

    千次阅读 2008-10-13 15:20:00
    第3章 ARM处理器的指令系统 本章介绍ARM指令集、Thumb指令集,以及各类指令对应的寻址方式,通过对本章的阅读,希望读者能了解ARM处理器所支持的指令集及具体的使用方法。本章的主要内容有:- ARM指令集、...
  • 5.4.3程序控制器

    千次阅读 2016-10-08 17:17:55
    微程序设计思想就是每一条机器指令编写成一个微程序,每一个微程序包含若干条微指令,每一条微指令对应一个或几个微操作命令。这些微程序可以存到一个控制存储器中,用寻址用户程序机器指令的办法寻址每个微程序中...
  • LPC2220芯片初始化代码研究(转)

    千次阅读 2009-12-29 22:14:00
    一般来讲,在32位ARM应用系统中,软件大多数采用...因此,在编写应用程序时必须在程序的入口处加入一些必要的初始化代码(启动代码),使系统在执行C语言程序之前先完成对自身的初始,从而才能正确地执行用户代码。1
  • ARM指令

    千次阅读 2015-08-05 15:47:02
    ARM指令的基本格式 ARM指令的基本格式为:  {} {S} , { , } 其中,内的项是必需的,{ }内的项是可选的。 (1)Opcode项 Opcode是指令助记符,即操作码,说明指令需要执行的操作,在指令中是必需的。 (2)Cond...
  • ClickHouse之所以会像闪电一样快("blazing fast"),是多方面优化的结果,包括且不限于:高效且磁盘友好的列式存储,高效的数据压缩,精心设计的各类索引,并行分布式查询,运行时代码生成等。 另外,ClickHouse...
  • Angular4 - 指令

    万次阅读 2018-03-03 23:59:41
    1. 指令分类 组件(Component directive):用于构建UI组件,继承于 Directive 类 属性指令(Attribute directive): 用于改变组件的外观或行为 结构指令(Structural directive): 用于动态添加或删除DOM元素来改变DOM...
  • 谷歌开源内部代码评审规范

    千次阅读 2019-10-08 15:33:58
    近日,谷歌开源了其内部一直在使用的代码评审规范,InfoQ 对其进行了翻译和整理,分享给广大开发者,看看谷歌工程师是如何评审代码的。 代码评审标准 代码评审的主要目的是确保代码库的整体质量随时间...
  • AT91初始化代码手册中文翻译版

    千次阅读 2007-01-18 16:39:00
    然而,启动顺序要求初始ARM处理器和严重依赖于寄存器结构的关键设备和内存映射处理机,和存储器重映射操作。由于这个原因,C启动序列必须用汇编编写。这个应用笔记描述了一个AT91的C代码启动序列示例。他是使用ARM...
  • RISC(全称Reduced Instruction Set Computer,精简指令系统计算机)则是一套优化过的指令架构 更像是 指令集架构标准,并不是实现。 指令集架构实现 体系结构 汇编指令集 x86 x86_64 51 arm mips powerpc avr pic...
  • KVM虚拟机代码揭秘——QEMU代码结构分析

    万次阅读 热门讨论 2011-07-13 16:06:14
    如我们所知,QEMU是一个模拟器,它能够动态...QEMU模拟的架构叫目标架构,运行QEMU的系统架构叫主机架构,QEMU中有一个模块叫做微型代码生成器(TCG),它用来目标代码翻译成主机代码。如下图所示。 我们也可以
  • ARM 处理器的指令集可以分为 跳转指令、数据处理指令、程序状态寄存器(PSR)处理指令、加载/存储指令、协处理器指令和异常产生指令 六大指令,这里把其它几个指令一起发了出来,可以查看具体的目录,请点击头部左上...
  • MIPS 指令

    万次阅读 2017-05-10 14:53:27
    MIPS 指令   指令 功能 应用实例 LB 从存储器中读取一个字节的数据到寄存器中 LB R1, 0(R2) LH 从存储器中读取半个字的数据到寄存器中 ...
  • ARM指令集和X86指令集的比较

    千次阅读 2012-11-24 00:00:40
    一、背景知识: ...相应的,微处理随着微指令的复杂度也可分为CISC及RISC这两类。 CISC 是一种为了便于编程和提高记忆体访问效率的晶片设计体系。在20世纪90年代中期之前,大多数的微处理器都采用CISC体系
  • 汇编伪指令总结

    千次阅读 2012-08-14 11:25:40
    汇编伪指令总结 段定义伪指令    段定义伪指令是表示一个段开始和结束的命令,80x86有两种段定义的方式:完整段定义和简化段定义,分别使用不同的段定义伪指令来表示各种段。  1 完整的段定义伪指令  ...
  • 深度理解“指令集”

    万次阅读 多人点赞 2017-07-29 01:33:58
    指令顾名思义就是用来引导某一硬件工作的方式的... 可以这样说指令集是软件与CPU之间的一个接口而CPU就是接口的实列。 其实指令集就是一组汇编指令的集合,不同的CPU使用的指令集不同。 过去比较常用的是lntel的X86C
  • 3.1 ARM处理器的指令集概述3.1.1 ARM处理器的指令的分类与格式ARM处理器的指令集是加载/存储型的,也即指令集仅能处理寄存器中的数据,而且处理结果都要放回寄存器中,而对系统存储器的访问则需要通过专门的...
  • 这就是精简指令集和复杂指令集的一个简单背景,我们能看到,在反汇编下来的x86指令集和鲲鹏指令集的汇编代码上,操作指令是完全不同的,寄存器的命名也是完全不同的,在x86的平台上,有16个通用寄存器, x86 64模式...
  • MDK下ARM伪指令

    2018-06-06 21:46:22
    这里指的是MDK下的伪指令与GNU下的微指令不一样。 一、常见伪指令【area】定义一个代码段或者数据段格式:area 段名 属性1,属性2……段名:code:代码段、data:数据段属性:readonly:只读、readwrite、align[4]...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 33,385
精华内容 13,354
关键字:

如何将微指令代码化