机器码被锁定封号,为什么封机器码
计算机通过执行指令来处理各种数据。,指令应该指明如何处理数据,以及数据的来源和操作结果的目的地。,指令由两部分组成,即操作码和操作数。
操作码给出了指令应该做什么。
操作数用于描述该指令的操作数。
在一条指令中,操作码是必不可少的,但操作数可以没有,一个操作数或两个操作数。
操作码表示计算机执行什么操作。它由一组二进制代码表示,在汇编语言中由助记符表示。
操作数可以表示参与运算的数本身,或者指定操作数的地址。如何找到操作数,这是指令的寻址方式,也是指令编码格式所指出的。
根据操作数的数量,指令格式可以分为以下几种
没有操作数
类指令,如“HLT”暂停指令。
II单操作数
只给出了一个操作数地址。操作数可以直接在寄存器、存储器或指令中被赋予一个立即数。例如“CX公司”
双操作数指令
指令中有两个操作数,一个是目标操作数,另一个是源操作数。一个操作数在寄存器中,另一个在寄存器或内存中,或者直接在指令中给出立即数。两者都不允许存在于内存中。
IV操作数指令
ADC AX,BX;此指令完成操作数AX、BX和CF位的加法。
,操作数可以分为源操作数和目的操作数。
源操作数只能读取的操作数。
操作数可读写的操作数(存储运算结果)。
操作数也可以分为数据操作数和地址操作数。
指令的长度主要取决于指令操作码的长度、操作数的长度和操作数的个数。通常,一个指令字的位数越多,它所能表示的操作信息就越多,指令功能就越丰富。,位数越大,指令占用的存储空间就越大,读取指令所需的时间也就越长。
字长(一般指CPU的机器字长)是指CPU-times能处理的二进制位数。它是字节长度(8位二进制数)的1、2、4或8倍,即8、16、32或64位。所以指令字长度也是字节的简单倍数,比如一字节指令,二字节指令,三字节指令。
一条指令中的信息按其含义分成若干信息段,每个信息段占用一个或多个字节,按一定顺序排列,便于CPU解释和执行。例如,使用1-6个指令字节的可变字长的8086/8088CPU的指令系统包括
第1字节操作码;
字节2:寻址模式;
字节3-6:操作数;
它由三部分组成。
指令格式如下
其中,第一个字节
高6位是操作码。
w位表示要传输的数据类型是字(w=1)还是字节(w=0)(字);
位D表示数据传输的方向D=0,数据从寄存器传输;D=1,数据传输到寄存器;(目的地).
其中,第二个字节
REG域寄存器号,用3位代码寻址8个不同的寄存器,然后根据第一个字节的W位选择8位或16位寄存器。如下图所示。(对于使用段寄存器的指令,REG字段占用2位)
886指令的二进制代码如此之多,以至于很难在一个表中比较该指令和机器语言。
每种基本指令类型都给出了编码格式,通过填入不同的数字来表示不同的寻址方式和数据类型,可以得到每条指令的机器码。
086指令系统采用变长指令,指令的长度可以由1 ~ 6个字节组成。
机器的长度可变长度,由操作码寻址方式的操作数所需的字节数决定;
汇编指令长度汇编指令对应的机器指令长度。
指令执行过程中应考虑指令长度
CPU从CS: IP组成的地址中读取指令,并将指令存储在指令缓冲区中;
IP=IP读取的指令字节数;
执行指令缓冲区的内容,返回步骤1,重复此过程。
1.寄存器间传输指令的编码
MOV指令从10001000(ox88)开始编码。
该指令的编码格式为100010 dw mod reg r/m .
W=1:表示字数据传输;
REG字段如果选择SP,则REG字段代码=100;
D=1:表示数据传输至所选寄存器(SP);
Mod=11:因为另一个操作数BX也是一个寄存器。
根据w=1和寄存器名BX,从上图可以查到R/M=011。
,该指令的2字节代码是8B E3H。
2.寄存器和存储器之间传输的指令编码
MOV CL,[BX l234H]
该指令的作用是将有效地址为(BX 1234H)的存储单元中的数据字节传送到CL。
指令的编码格式为100010DW MOD REG R/M data。
第1和第2字节可以通过查表得到;第3个字节存储34H的16位位移的低位字节;第4个字节存储12H的高位字节。
,该指令的4字节代码是8A 8F 34 12H。
3位寻址指令的编码
MOV [BX 2100H],0FA50H
该指令的作用是将16位立即数据发送到指定有效地址的字存储单元;
其中低字节50H送列[BX+2100H]单元,高字节FAH送到(BX+2101H)单元。
该指令的编码格式为110011W MOD 000 R/M 数据 数据(若W=1).
指令中不但有16位立即数,还有16位位移量;
所以,该指令的6字节编码为C7 87 00 21 50 FA H。
4 包含段寄存器的指令的编码
MOV DS, AX
指令的功能是将AX寄存器的内容传送到数据段寄存器DS。
该指令的编码格式为10001110 MOD 0 REG R/M .
段寄存器DS的编码为11,即REG字段为11;另一个操作数也是寄存器,所以MOD=11,而R/M字段应填上AX的三位代码000 .
所以,该指令的2字节编码为8E D8H。
5 段超越前缀指令的编码
MOV [BX], DL
指令的功能是将DL寄存器的内容传送到有效地址为(BX)的字节存储单元。
该指令(不带段超越前缀)的编码格式为100010DW MOD 0 REG R/M .
数据从寄存器传出,则D=0;传递数据为字节,则W=0;进而,REG=010;另一个操作数是存储器,所以MOD=00,而R/M=111 .该指令的编码是在不带段超越前缀的指令代码为88 17H.
在指令代码前加一个8位的段超越的缀代码,代码的格式为001××110,其中××位表明段超越寄存器。由于段寄存器CS的代码为01,所以指令的第1个字节的编码为00101110,即 2EH.
所以,该指令的机器码为2E 88 17H。
6 重点汇编指令
7 主要寻址方式
8 机器码汇编指令与ASCII
再来一段机器码、汇编代码、C语言代码对照