本文目录
- 处理器架构,指令集和汇编语言,三者有何关系
- 汇编语言指令有哪些
- 汇编语言常用指令
- 机器码、CPU指令集、汇编指令集、操作系统、API接口、C标准库的关系
- 汇编指令集…要具体详细!
- 汇编语言指令大全,要详细的 !!!!
- 求汇编指令大全~
- 汇编指令和汇编语言指令之间的区别是什么
- 汇编指令B,BL,BX,BLX 和 BXJ的区别
- 主要的汇编指令有哪些
处理器架构,指令集和汇编语言,三者有何关系
指令集架构简称指令集,ISA,CPU的执行单元和解码logic基本上由指令集决定。软件硬件之间的一个接口,程序员根据CPU的指令集能编写各种各样的编译器,用高级语言编写程序。汇编语言属于指令集,指令集包括机器指令和汇编指令。一条机器指令对应一条汇编指令,如mips中的000000机器码指令对应汇编指令的add假加法指令。汇编语言是便于人去理解的,记着一条add指令总比000000容易吧。处理器架构就是微架构,学术界称为微结构。主要是CPU的流水线部分的设计。
汇编语言指令有哪些
一、数据位传送指令:
1、MOV C, bit ;bit 可直接寻址位 C←(bit)
2、MOV bit,C ;C 进位位 (bit) ← C 二、位变量修改指令:
1、CLR C ; 将C=0
2、CLR bit
3、CPL C ; 将C求反再存入C
4、CPL bit ; 将bit求反再存入bit
5、SETB C ; 将C=1
6、SETB bit ; (bit) ← 1 三、位变量逻辑指令:
ANL C, bit ANL C, bit ORL C, bit ORL C, bit
延展阅读:
汇编指令是汇编语言中使用的一些操作符和助记符,还包括一些伪指令(如assume,end)。用于告诉汇编程序如何进行汇编的指令,它既不控制机器的操作也不被汇编成机器代码,只能为汇编程序所识别并指导汇编如何进行。
通用数据传送指令:
1、MOV 传送字或字节;
2、MOVSX 先符号扩展,再传送;
3、MOVZX 先零扩展,再传送;
4、PUSH 把字压入堆栈;
5、POP 把字弹出堆栈;
6、PUSHA 把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈;
7、POPA 把DI,SI,BP,SP,BX,DX,CX,AX依次弹出堆栈;
8、PUSHAD 把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压入堆栈;
9、POPAD 把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈;
10、BSWAP 交换32位寄存器里字节的顺序;
11、XCHG 交换字或字节( 至少有一个操作数为寄存器,段寄存器不可作为操作数);
12、CMPXCHG 比较并交换操作数( 第二个操作数必须为累加器AL/AX/EAX );
13、XADD 先交换再累加( 结果在第一个操作数里 );
14、XLAT 字节查表转换;
15、BX 指向一张 256 字节的表的起点, AL 为表的索引值 (0-255,即0-FFH);
16、返回 AL 为查表结果。( [BX+AL]-》AL )
汇编语言常用指令
单片机汇编语言汇编错误原因分析汇编语言的指令格式,目前有两种不同的标准:Windows下的汇编语言基本上都遵循Intel风格的语法,比如:MASM、NASM;而Unix/Linux下的汇编语言基本上都遵循AT&T风格的语法;一、汇编语言语句的通用格式[名称[:]] 指令码 [第一操作数][,第二操作数] ;注释汇编语言的指令码的操作数的个数可以是0、1、2个;当操作数的个数为2的时候,语句还有两种不同的格式:Windows下Intel风格的汇编语言语句格式为:[名称[:]] 指令码 目的操作数DST,源操作数SRC ;注释Unix/Linux下AT&T风格的汇编语言语句格式为:[名称[:]] 指令码 源操作数SRC,目的操作数DST ;注释例如: CYCLE: ADD AX,02H ;(AX)汇编语言语句格式中的“名称“并不是所有语句都必需的,但是,如果语句中带有“名称“,那么,大多数情况下,“名称“都表示的是内存中某一存储单元的地址,也就是“名称“后面各项在内存中存放的第一个存储单元的地址(包括该“名称“所在段的段地址和段内偏移地址);比如上面的指令中,CYCLE就是该语句的名称,CYCLE表示的就是其后面的机器指令码在内存中存放的第一个地址;“名称“与指令码之间的分隔符可以是冒号“:“,也可以是空格字符“ “;当以冒号分割时,该名称代表的是一个标号;当以空格分割时,该名称代表的可能是标号,也可能是变量;当指令码有多个操作数的时候,相邻两个操作数之间要用逗号“,“分割;指令码与操作数之间必须以空格分割;汇编语言语句的注释必须以分号“;“开头;二、组成语句的元素1、常数:汇编语言中的常数有整数、字符串;二进制、八进制、十进制、十六进制;汇编语言采用不同的后缀区分:B:二进制数; O:八进制数; D:十进制数; H:十六进制数;当一个数值后面没有后缀的时候,默认为十进制数;字符串常数是用一对单引号(’’)括起来的一串字符;2、表达式:由操作数和操作符组成;算数运算操作符: +、-、*、/、MOD,等;取模运算MOD是取两数相除的余数;逻辑运算操作符: AND(逻辑与)、OR(逻辑或)、NOT(逻辑非)、XOR(逻辑异或);注意:逻辑运算符同时又可以是逻辑运算指令的指令码,只有当它们出现在指令的操作数部分时,才是操作符;例如:ADD AL,0CH ADD 0FH ;第一个ADD是指令码,第二个ADD是操作符;关系运算操作符: EQ(相等)、NE(不等)、LT(小于)、GT(大于)、LE(小于等于)、GE(大于等于);汇编语言中的表达式不能单独构成语句,只能是语句的组成部分;注意:语句中表达式的求值不是在语句执行时完成的,而是在对源程序进行汇编链接时完成的.所以,语句中各表达式的值必须在汇编或链接时就是确定的,也就是说,表达式中各标识符的值在汇编或链接时就应该是确定的;3、标号:标号是由标识符表示的指令的名称,用于指示对应指令的位置(地址);标号具有三个属性:段地址、偏移地址和类型;标号的段地址和偏移地址属性是指该标号所对应的指令所在段的段地址和段内偏移地址;标号的类型有两种:NEAR和FAR;标号定义成NEAR类型,表示该标号在段内使用,而定义成FAR类型则表示该标号可以在段间使用;标号的定义:在指令码前面加上标识符和冒号“:“;例如:START: PUSH DS这条语句里面,START就是我们定义的标号,它代表指令PUSH的地址,所以,标号可以作为程序转移指令的操作数(即:要转向的地址);标号还可以采用伪指令来定义;例如:用LABEL伪指令和过程定义伪指令来定义;4、变量:与高级语言一样,并不是所有的操作数都是常数,汇编语言也有自己的变量,变量的值在程序运行期间是可以被改变的;A.定义变量:汇编语言中,变量的定义是通过伪指令来完成的;定义变量的伪指令格式如下:变量名 DB 表达式 ;定义字节变量,又称单字节变量(1个连续字节),DB--》BYTE变量名 DW 表达式 ;定义字变量,又称双字节变量(2个连续字节),DW--》WORD变量名 DD 表达式 ;定义双字变量,又称四字节变量(4个连续字节),DD--》DWORD变量名 DF 表达式 ;定义六字节变量,又称六字节变量(6个连续字节),DF--》FWORD变量名 DQ 表达式 ;定义长字变量,又称八字节变量(8个连续字节),DQ--》QWORD变量名 DT 表达式 ;定义十字节变量(10个连续字节),DT--》TBYTE;其中,变量名是一个合法的标识符,变量名后面不能加冒号“:“,只能用空格;变量名不是必要的,可有可无;变量的类型由关键字DB、DW、DD、DQ、DT来定义;变量定义语句中的“表达式“是用于对变量进行初始化的,可有一下几种情况:(1).一个或多个常数或表达式;当为多个常数或表达式时,期间要用逗号隔开;如DATA1--DATA4;(2).带单引号的字符串;对于字节型(DB)变量,每个变量的大小为1个字节,每个变量的值不能超过1个字符,每个字节内存入一个字符的ASCII码值,整个字符串可以在同一对单引号内给出,这相当于是定义了一个字符数组,如DATA5;对于字类型(DW)变量,每个变量的大小为2个字节,每个变量的值不能超过2个字符,若为2个字符时,同样遵循高位存入高字节,低位存入低字节的规则;若为1个字符,则该字符的ASCII码值存入到低字节,高字节为00,如DATA6;对于双字类型(DD)变量,每个变量的大小为4个字节,每个变量的值不能超过2个字符,若为2个字符,同样遵循高位存入高字节,低位存入低字节的规则;但是2个字符的值被存入到双字变量的最低2个字节中,1个字符的值被存入到双字变量的最低1个字节中;对于长字类型(DQ)变量,每个变量的大小为8个字节,每个变量的值不能超过2个字符,若为2个字符,同样遵循高位存入高字节,低位存入低字节的规则;但是2个字符的值被存入到长字变量的最低2个字节中,1个字符的值被存入到长字变量的最低1个字节中;(3).一个问号“?“,表示该变量的值不确定,即:该变量所表示的内存单元中的内容是不确定的,或者说是,当表达式为问号时,变量所对应的内存区中并没有存入新的值,而只是预留出了相应的存储空间;如DATA7、DATA8(4).重复方式;此时的格式为: 重复次数 DUP(表达式);重复方式指出表达式的值可以重复地存储到变量对应的内存区中,重复的次数由伪指令给出,相当于定义数组;如DATA9、DATA10定义变量的例子:DATA1 DB 20H ;1字节变量DATA2 DW 0204H,1000H ;2字节变量DATA3 DB (-1*3),(15/3) ;1字节变量DATA4 DD 123456H ;4字节变量DATA5 DB ’0123’ ;字符串变量,相当于一个字符数组DATA6 DW ’AB’,’C’,’D’ ;字符串变量,相当于一个字符串数组;DATA7 DB ? ;1字节变量,未初始化DATA8 DD ? ;4字节变量,未初始化DATA9 DB 5 DUP(0) ;1字节变量,用5个0初始化,相当于是一个具有5个DB型元素的数组DATA10 DW 3 DUP(?) ;2字节变量,未初始化,相当于是一个具有3个DW型元素的数组变量定义语句中伪指令的功能是在变量名所对应的地址开始的内存区依次存入表达式中的各项值,表达式中的每项值所占用内存字节数与变量的类型对应;总结:一个变量的变量名实际上就代表了该变量所对应的内存区在内存段中的有效地址(偏移地址);高地址是指地址值相对较大,低地址是指地址值相对较小,高地址与低地址是相对而言的;5、变量的属性:(1).属性介绍一个变量具有一下属性:A.段地址(SEG):变量所在段的段地址;B.偏移地址(OFFSET):变量所在段内的偏移地址;C.类型(TYPE):变量的类型定义了每个变量所占用的内存字节数,对于DB、DW、DD、DQ、DT类型定义的变量所占用的内存字节数分别是1、2、4、8、10;通常又将DB、DW、DD类型所定义的变量分别成为BYTE类型、WORD类型、DWORD类型变量;常用标识符的类型值列表:标识符种类 字节变量 字变量 双字变量 近标号NEAR 远标号FARTYPE的值 1 2 4 -1 -2D.长度(LENGTH):变量定义时,一个变量名所定义的变量个数;在含有DUP操作符的变量定义中,变量名所定义的变量个数为定义格式中的重复次数;在其它各种变量定义中,每个变量名所定义的变量个数均为1个;E.大小(SIZE):变量定义语句中,分配给同一个变量名的所有变量的总的字节数,其值为该变量的类型与长度的成绩;其中,段地址、偏移地址和类型属性是变量的主属性,而长度和大小属性是变量的辅助属性;(2).属性操作符:操作符 表达式 含义SEG SEG 变量名或标号 取出变量名或标号所在段的段地址OFFSET OFFSET 变量名或标号 取出变量名或标号所在段内的偏移地址TYPE TYPE 变量名或标号 取出变量名或标号的类型(变量所占用的字节数)LENGTH LENGTH 变量名 取出变量的长度SIZE SIZE 变量名 取出变量的大小这些操作符不能单独构成语句,只能作为表达式的组成部分,并且表达式的求值也是在汇编过程中完成的;6.强制类型转换操作符PTR格式:数据类型 PTR 地址表达式格式中的“数据类型“可以是BYTE、WORD、DWORD、NEAR、FAR;前三种类型是变量的类型,后两种类型是标号的类型;格式中的表达式可以是变量、标号、其它地址表达式;PTR操作符的功能是用来重新定义已定义的变量或标号的类型,其作用域只在当前语句中; 例如:DATA1 DW 02HMOV BYTE PTR DATA1,AL这条指令中,是把DATA1的类型转换为BYTE类型,然后把AL中的内容存放到DATA1的最低一个字节中;作用域只在这条MOV语句中,过了这条语句,DATA1仍然是DW类型,即:DATA1原来的类型并没有被修改;
机器码、CPU指令集、汇编指令集、操作系统、API接口、C标准库的关系
你好,我来初步解释你所提的问题,仅供参考。1、不同的CPU肯定对应不同的机器码,其实这种说法不规范,应该是不同的机器码集,或机器指令集,因为汇编指令和机器指令是一一对应的,也可以说成是汇编指令集。我们编写的程序最后都是处理(这里的处理根据不同的高级语言,可能是解释、预编译、编译、链接等等)成由汇编指令集里面的指令构成的指令序列,然后调入内存,再一条条由知道这每条指令干什么用的CPU来执行的。你说的“+”号,其实就是加法指令,当然不可能是“010101”,因为没有6位的指令,只可能是4位、8位、16位、32位、64位。位数相同不同型号的CPU,指令集略有不同的,但绝大多数指令应该是相同的。比如类似你说的“+”等算术运算,当然还有更多的其它指令,都是相同的二进制编码。这就是你的同一台电脑可以使用INTEL的CPU,也可以使用AMD的CPU的原因,并不会因为你换了CPU,电脑就不能运行了。那么32位的CPU还能执行16位的指令吗?那么64位的CPU还能执行32位、16位的指令吗?这就看CPU是否向下兼容了。如果你的程序(exe文件)很老,一运行就出错,或者蓝屏了,呵呵,就不兼容了。CPU不再认识你的程序里的那些“老”指令了。2、这个问题在回答1里已经说的很清楚了,机器码就是CPU的指令,CPU的指令集就是机器码的集合,说白了,就是CPU的API(应用程序编程接口),只不过这里的应用指的是汇编语言。3、和2是同一个问题,汇编指令集当然和CPU指令集是一一对应的。一种新的CPU生产出来后,它的指令集就是固定的。生产厂家就会推出对应的新的汇编系统,与其指令集相配套。然后那些编译系统开发商们也会对他们的系统进行升级,增加新的特性。4、C标准库也是机器指令构成的程序,当然和CPU指令集有关系。所谓的标准,不是针对机器语言来说的,而是针对C语言的编码来说的。比如sin(x);这个函数,在不同的电脑(PC机、苹果机甚至手机、单片机等),用C语言编写代码时,都是sin(x),不会是别的(比如sn(x))。诸如此类的所有函数形成的集合就是一个标准库。所以我们编写的标准C程序,可以再PC机上编译成PC机能运行的机器指令,也可以再苹果机上编译成苹果机能运行的机器指令,PC机上有PC机的“翻译“,苹果机上有苹果机的“翻译”,他们将这个你编写的这个相同的C程序翻译成不同的机器指令,但最终程序的运行结果是一样的。这就是可移植性,因为遵循了标准。标准不光指的标准库,还包括数据类型、关键字、运算符、语法等。标准库的实现当然和你所使用的计算机的CPU的指令集是紧密相关的。C的编译器的实现可以是机器语言、汇编语言,也可以是C语言实现。呵呵,这个好像不太好理解。所谓的编译,就是将你的由字符构成的源程序转化成机器能理解的二进制,二进制无非是0、1构成的一串符号,先存在硬盘,再调入内存运行。机器语言、汇编语言、C语言都能处理二进制,都能生成那个最终的二进制文件,明白了吧。C库函数和windows api基本没有关系。windows有自己的一套库函数,就是API,事实上,C的标准库已经没有多大意义了。如果我们编写没有图形界面的某些应用程序,如控制台应用程序,可能还会用到标准库。5、windows如果不知道CPU的指令集,如何发挥windows的最佳效率?而汇编语言、C语言和CPU联系的最紧密,当然要用它们来写。所谓封装,就是隐藏其实现,暴露其接口。正如CPU一样,我们知道ADD A,B是计算A加B,怎么计算的,不用知道。CPU指令集就是这台裸机(无操作系统)给我们的一个API。一台安装了windows系统的计算机,其实是一台建立在裸机基础上的“虚拟机”。这就好比一个初生儿和一个成人一样,初生儿其实具备了一个人的所有特征,但你无法和他交流(即使是机器语言也不行,呵呵),但他的确什么都会,你能说一个初生儿不会说英语吗,他会的,他已经具备了说英语的所有条件,因为他有嘴巴、会发音,有嘴巴就会说。但是让初生儿说英语实在是太难了,也就是这个API不好弄。一个成人就是安装了操作系统的长大了的初生儿,他的功能更多了。比如肌肉发达了(相当于外设增加了),能很看懂英语和说英语了(高级语言有了)。但最终还是要和初生儿一样用嘴巴说英语!只不过说的更好听而已,也就是API更丰富罢了。但不论你吃的是什么山珍海味,还是五谷杂粮,最终都转换成氨基酸、葡萄糖、微量元素和水供肠胃吸收。不论你用什么语言编写的程序,最终都是CPU执行的二进制机器指令。API本质上一个windows系统调用的集合,调用windows给我们提供的所有功能,比如创建一个窗口。如果windows没有提供这个集合,那么windows还有用吗?至于windows是怎么提供这个API的,API是怎么实现的,这个就要问microsoft了。
汇编指令集…要具体详细!
1. 通用数据传送指令. MOV 传送字或字节. MOVSX 先符号扩展,再传送. MOVZX 先零扩展,再传送. MOVSX reg16,r/m8 ; o16 0F BE /r MOVSX reg32,r/m8 ; o32 0F BE /r MOVSX reg32,r/m16 ; o32 0F BF /r MOVZX reg16,r/m8 ; o16 0F B6 /r MOVZX reg32,r/m8 ; o32 0F B6 /r MOVZX reg32,r/m16 ; o32 0F B7 /r PUSH 把字压入堆栈. POP 把字弹出堆栈. PUSHA 把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈. POPA 把DI,SI,BP,SP,BX,DX,CX,AX依次弹出堆栈. PUSHAD 把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压入堆栈. POPAD 把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈. BSWAP 交换32位寄存器里字节的顺序 XCHG 交换字或字节.( 至少有一个操作数为寄存器,段寄存器不可作为操作数) CMPXCHG 比较并交换操作数.( 第二个操作数必须为累加器AL/AX/EAX ) XADD 先交换再累加.( 结果在第一个操作数里 ) XLAT 字节查表转换. ── BX 指向一张 256 字节的表的起点, AL 为表的索引值 (0-255,即 0-FFH); 返回 AL 为查表结果. ( [BX+AL]-》AL ) 2. 输入输出端口传送指令. IN I/O端口输入. ( 语法: IN 累加器, {端口号│DX} ) OUT I/O端口输出. ( 语法: OUT {端口号│DX},累加器 ) 输入输出端口由立即方式指定时, 其范围是 0-255; 由寄存器 DX 指定时, 其范围是 0-65535. 3. 目的地址传送指令. LEA 装入有效地址. 例: LEA DX,string ;把偏移地址存到DX. LDS 传送目标指针,把指针内容装入DS. 例: LDS SI,string ;把段地址:偏移地址存到DS:SI. LES 传送目标指针,把指针内容装入ES. 例: LES DI,string ;把段地址:偏移地址存到ES:DI. LFS 传送目标指针,把指针内容装入FS. 例: LFS DI,string ;把段地址:偏移地址存到FS:DI. LGS 传送目标指针,把指针内容装入GS. 例: LGS DI,string ;把段地址:偏移地址存到GS:DI. LSS 传送目标指针,把指针内容装入SS. 例: LSS DI,string ;把段地址:偏移地址存到SS:DI. 4. 标志传送指令. LAHF 标志寄存器传送,把标志装入AH. SAHF 标志寄存器传送,把AH内容装入标志寄存器. PUSHF 标志入栈. POPF 标志出栈. PUSHD 32位标志入栈. POPD 32位标志出栈. 二、算术运算指令 ADD 加法. ADC 带进位加法. INC 加 1. AAA 加法的ASCII码调整. DAA 加法的十进制调整. SUB 减法. SBB 带借位减法. DEC 减 1. NEC 求反(以 0 减之). CMP 比较.(两操作数作减法,仅修改标志位,不回送结果). AAS 减法的ASCII码调整. DAS 减法的十进制调整. MUL 无符号乘法. IMUL 整数乘法. 以上两条,结果回送AH和AL(字节运算),或DX和AX(字运算), AAM 乘法的ASCII码调整. DIV 无符号除法. IDIV 整数除法. 以上两条,结果回送: 商回送AL,余数回送AH, (字节运算); 或 商回送AX,余数回送DX, (字运算). AAD 除法的ASCII码调整. CBW 字节转换为字. (把AL中字节的符号扩展到AH中去) CWD 字转换为双字. (把AX中的字的符号扩展到DX中去) CWDE 字转换为双字. (把AX中的字符号扩展到EAX中去) CDQ 双字扩展. (把EAX中的字的符号扩展到EDX中去) 三、逻辑运算指令 AND 与运算. OR 或运算. XOR 异或运算. NOT 取反. TEST 测试.(两操作数作与运算,仅修改标志位,不回送结果). SHL 逻辑左移. SAL 算术左移.(=SHL) SHR 逻辑右移. SAR 算术右移.(=SHR) ROL 循环左移. ROR 循环右移. RCL 通过进位的循环左移. RCR 通过进位的循环右移. 以上八种移位指令,其移位次数可达255次. 移位一次时, 可直接用操作码. 如 SHL AX,1. 移位》1次时, 则由寄存器CL给出移位次数. 如 MOV CL,04 SHL AX,CL 四、串指令 DS:SI 源串段寄存器 :源串变址. ES:DI 目标串段寄存器:目标串变址. CX 重复次数计数器. AL/AX 扫描值. D标志 0表示重复操作中SI和DI应自动增量; 1表示应自动减量. Z标志 用来控制扫描或比较操作的结束. MOVS 串传送. ( MOVSB 传送字符. MOVSW 传送字. MOVSD 传送双字. ) CMPS 串比较. ( CMPSB 比较字符. CMPSW 比较字. ) SCAS 串扫描. 把AL或AX的内容与目标串作比较,比较结果反映在标志位. LODS 装入串. 把源串中的元素(字或字节)逐一装入AL或AX中. ( LODSB 传送字符. LODSW 传送字. LODSD 传送双字. ) STOS 保存串. 是LODS的逆过程. REP 当CX/ECX《》0时重复. REPE/REPZ 当ZF=1或比较结果相等,且CX/ECX《》0时重复. REPNE/REPNZ 当ZF=0或比较结果不相等,且CX/ECX《》0时重复. REPC 当CF=1且CX/ECX《》0时重复. REPNC 当CF=0且CX/ECX《》0时重复. 五、程序转移指令 1》无条件转移指令 (长转移) JMP 无条件转移指令 CALL 过程调用 RET/RETF过程返回. 2》条件转移指令 (短转移,-128到+127的距离内) ( 当且仅当(SF XOR OF)=1时,OP1 JA/JNBE 不小于或不等于时转移. JAE/JNB 大于或等于转移. JB/JNAE 小于转移. JBE/JNA 小于或等于转移. 以上四条,测试无符号整数运算的结果(标志C和Z). JG/JNLE 大于转移. JGE/JNL 大于或等于转移. JL/JNGE 小于转移. JLE/JNG 小于或等于转移. 以上四条,测试带符号整数运算的结果(标志S,O和Z). JE/JZ 等于转移. JNE/JNZ 不等于时转移. JC 有进位时转移. JNC 无进位时转移. JNO 不溢出时转移. JNP/JPO 奇偶性为奇数时转移. JNS 符号位为 “0“ 时转移. JO 溢出转移. JP/JPE 奇偶性为偶数时转移. JS 符号位为 “1“ 时转移. 3》循环控制指令(短转移) LOOP CX不为零时循环. LOOPE/LOOPZ CX不为零且标志Z=1时循环. LOOPNE/LOOPNZ CX不为零且标志Z=0时循环. JCXZ CX为零时转移. JECXZ ECX为零时转移. 4》中断指令 INT 中断指令 INTO 溢出中断 IRET 中断返回 5》处理器控制指令 HLT 处理器暂停, 直到出现中断或复位信号才继续. WAIT 当芯片引线TEST为高电平时使CPU进入等待状态. ESC 转换到外处理器. LOCK 封锁总线. NOP 空操作. STC 置进位标志位. CLC 清进位标志位. CMC 进位标志取反. STD 置方向标志位. CLD 清方向标志位. STI 置中断允许位. CLI 清中断允许位. 六、伪指令 DW 定义字(2字节). PROC 定义过程. ENDP 过程结束. SEGMENT 定义段. ASSUME 建立段寄存器寻址. ENDS 段结束. END 程序结束. 七、位操作指令,处理器控制指令1.位操作指令,8086新增的一组指令,包括位测试,位扫描。BT,BTC,BTR,BTS,BSF,BSR1.1 BT(Bit Test),位测试指令,指令格式: BT OPRD1,OPRD2,规则:操作作OPRD1可以是16位或32位的通用寄存器或者存储单元。操作数OPRD2必须是8位立即数或者是与OPRD1操作数长度相等的通用寄存器。如果用OPRD2除以OPRD1,假设商存放在Divd中,余数存放在Mod中,那么对OPRD1操作数要进行测试的位号就是Mod,它的主要功能就是把要测试位的值送往CF,看几个简单的例子:1.2 BTC(Bit Test And Complement),测试并取反用法和规则与BT是一样,但在功能有些不同,它不但将要测试位的值送往CF,并且还将该位取反。1.3 BTR(Bit Test And Reset),测试并复位,用法和规则与BT是一样,但在功能有些不同,它不但将要测试位的值送往CF,并且还将该位复位(即清0)。1.4 BTS(Bit Test And Set),测试并置位,用法和规则与BT是一样,但在功能有些不同,它不但将要测试位的值送往CF,并且还将该位置位(即置1)。1.5 BSF(Bit Scan Forward),顺向位扫描,指令格式:BSF OPRD1,OPRD2,功能:将从右向左(从最低位到最高位)对OPRD2操作数进行扫描,并将第一个为1的位号送给操作数OPRD1。操作数OPRD1,OPRD2可以是16位或32位通用寄存器或者存储单元,但OPRD1和OPRD2操作数的长度必须相等。1.6 BSR(Bit Scan Reverse),逆向位扫描,指令格式:BSR OPRD1,OPRD2,功能:将从左向右(从最高位到最低位)对OPRD2操作数进行扫描,并将第一个为1的位号送给操作数OPRD1。操作数OPRD1,OPRD2可以是16位或32位通用寄存器或存储单元,但OPRD1和OPRD2操作数的长度必须相等。1.7 举个简单的例子来说明这6条指令:AA DW 1234H,5678HBB DW 9999H,7777HMOV EAX,12345678HMOV BX,9999HBT EAX,8;CF=0,EAX保持不变BTC EAX,8;CF=0,EAX=12345778HBTR EAX,8;CF=0,EAX=12345678HBTS EAX,8;CF=0,EAX=12345778H BSF AX,BX;AX=0BSR AX,BX;AX=15BT WORD PTR [AA],4;CF=1,[AA]的内容不变BTC WORD PTR [AA],4;CF=1,[AA]=1223HBTR WORD PTR [AA],4;CF=1,[AA]=1223HBTS WORD PTR [AA],4;CF=1,[AA]=1234HBSF WORD PTR [AA],BX;[AA]=0;BSR WORD PTR [AA],BX;[AA]=15(十进制) BT DWORD PTR [BB],12;CF=1,[BB]的内容保持不变BTC DWORD PTR [BB],12;CF=1,[BB]=76779999HBTR DWORD PTR [BB],12;CF=1,[BB]=76779999HBTS DWORD PTR [BB],12;CF=1,[BB]=77779999HBSF DWORD PTR [BB],12;[BB]=0BSR DWORD PTR [BB],12;[BB]=31(十进制) 2.处理器控制指令处理器控制指令主要是用来设置/清除标志,空操作以及与外部事件同步等。2.1 CLC,将CF标志位清0。2.2 STC,将CF标志位置1。2.3 CLI,关中断。2.4 STI,开中断。2.5 CLD,清DF=0。2.6 STD,置DF=1。2.7 NOP,空操作,填补程序中的空白区,空操作本身不执行任何操作,主要是为了保持程序的连续性。2.8 WAIT,等待BUSY引脚为高。2.9 LOCK,封锁前缀可以锁定其后指令的操作数的存储单元,该指令在指令执行期间一直有效。在多任务环境中,可以用它来保证独占其享内存,只有以下指令才可以用LOCK前缀:
汇编语言指令大全,要详细的 !!!!
最佳答案IBM-PC汇编语言指令集数据传送指令集 MOV功能: 把源操作数送给目的操作数语法: MOV 目的操作数,源操作数格式: MOV r1,r2MOV r,mMOV m,rMOV r,dataXCHG功能: 交换两个操作数的数据语法: XCHG格式: XCHG r1,r2 XCHG m,r XCHG r,mPUSH,POP功能: 把操作数压入或取出堆栈语法: PUSH 操作数 POP 操作数格式: PUSH r PUSH M PUSH data POP r POP m PUSHF,POPF,PUSHA,POPA功能: 堆栈指令群格式: PUSHF POPF PUSHA POPALEA,LDS,LES功能: 取地址至寄存器语法: LEA r,m LDS r,m LES r,mXLAT(XLATB)功能: 查表指令语法: XLAT XLAT m算数运算指令ADD,ADC功能: 加法指令语法: ADD OP1,OP2 ADC OP1,OP2格式: ADD r1,r2 ADD r,m ADD m,r ADD r,data影响标志: C,P,A,Z,S,OSUB,SBB功能:减法指令语法: SUB OP1,OP2 SBB OP1,OP2格式: SUB r1,r2 SUB r,m SUB m,r SUB r,data SUB m,data影响标志: C,P,A,Z,S,OINC,DEC功能: 把OP的值加一或减一语法: INC OP DEC OP格式: INC r/m DEC r/m影响标志: P,A,Z,S,ONEG功能: 将OP的符号反相(取二进制补码)语法: NEG OP格式: NEG r/m影响标志: C,P,A,Z,S,OMUL,IMUL功能: 乘法指令语法: MUL OP IMUL OP格式: MUL r/m IMUL r/m 影响标志: C,P,A,Z,S,O(仅IMUL会影响S标志)DIV,IDIV 功能:除法指令语法: DIV OP IDIV OP格式: DIV r/m IDIV r/mCBW,CWD功能: 有符号数扩展指令语法: CBW CWDAAA,AAS,AAM,AAD功能: 非压BCD码运算调整指令语法: AAA AAS AAM AAD影响标志: A,C(AAA,AAS) S,Z,P(AAM,AAD)DAA,DAS功能: 压缩BCD码调整指令语法: DAA DAS影响标志: C,P,A,Z,S位运算指令集 AND,OR,XOR,NOT,TEST功能: 执行BIT与BIT之间的逻辑运算语法: AND r/m,r/m/data OR r/m,r/m/data XOR r/m,r/m/data TEST r/m,r/m/data NOT r/m影响标志: C,O,P,Z,S(其中C与O两个标志会被设为0) NOT指令不影响任何标志位SHR,SHL,SAR,SAL功能: 移位指令 语法: SHR r/m,data/CL SHL r/m,data/CL SAR r/m,data/CL SAL r/m,data/CL影响标志: C,P,Z,S,OROR,ROL,RCR,RCL功能: 循环移位指令语法: ROR r/m,data/CL ROL r/m,data/CL RCR r/m,data/CL RCL r/m,data/CL影响标志: C,P,Z,S,O程序流程控制指令集CLC,STC,CMC功能: 设定进位标志语法: CLC STC CMC标志位: C CLD,STD功能: 设定方向标志语法: CLD STD标志位: D CLI,STI功能: 设定中断标志语法: CLI STI标志位: ICMP功能: 比较OP1与OP2的值语法: CMP r/m,r/m/data标志位: C,P,A,Z,OJMP功能: 跳往指定地址执行语法: JMP 地址JXX功能: 当特定条件成立则跳往指定地址执行语法: JXX 地址 注: A: ABOVE,当C=0,Z=0时成立 B: BELOW,当C=1时成立 C: CARRY,当弁时成立 CXZ: CX寄存器的值为0(ZERO)时成立 E: EQUAL,当Z=1时成立 G: GREATER(大于),当Z=0且S=0时成立 L: LESS(小于),当S不为零时成立 N: NOT(相反条件),需和其它符号配合使用 O: OVERFLOW,O=1时成立 P: PARITY,P=1时成立 PE: PARITY EVEN,P=1时成立 PO: PARITY ODD,P=0时成立 S: SIGN,S=1时成立 Z: ZERO,Z=1时成立LOOP功能: 循环指令集语法: LOOP 地址LOOPE(Z)地址 LOOPNE(Z) 地址标志位: 无CALL,RET功能: 子程序调用,返回指令语法: CALL 地址 RET RET n标志位: 无INT,IRET功能: 中断调用及返回指令语法: INT n IRET标志位: 在执行INT时,CPU会自动将标志寄存器的值入栈,在执行IRET时则会将堆栈中的标志值弹回寄存器 字符串操作指令集MOVSB,MOVSW,MOVSD功能: 字符串传送指令语法: MOVSB MOVSW MOVSD标志位: 无CMPSB,CMPSW,CMPSD功能: 字符串比较指令语法: CMPSB CMPSW CMPSD标志位: C,P,Z,S,OSCASB,SCASW功能: 字符串搜索指令语法: SCASB SCASW标志位: C,P,Z,S,OLODSB,LODSW,STOSB,STOSW功能: 字符串载入或存贮指令语法: LODSB LODSW STOSB STOSW标志位: 无REP,REPE,REPNE功能: 重复前缀指令集语法: REP 指令S REPE 指令S REPNE 指令S标志位: 依指令S而定 对于IBM PC机它有它的指令系统,其中包括:数据传送指令、串处理指令、算术指令、控制移动指令、逻辑指令、处理机控制指令。 这里将简单介绍其指令类型及指令说明,如有要求给具体的指令格式及应用,请与amay联系,amay加以更新。 1)数据传送指令:负责把数据、地址或立即数传送到寄存器或存储单元中。数据传送指令类型 指 令 说 明通用数据传送指令 MOV(传送)、PUSH(进栈)、POP(出栈)、XCHG(交换)累加器专用传送指令 IN(输入指令) 、OUT(输入指令)地址传送指令 LEA(有效地址送寄存器)、LDS(指针送寄存器和DS)、LES(指针送寄存器和ES)标志寄存器传送指令 LAHF(标志送AH)、SAHF(AH送标志寄存器)、PUSHF(标志进栈)、POPF(标志出栈)2)算术指令:用来执行算术运算。 算术指令类型 指 令 说 明加法指令 ADD(加法)、ADC(带进位加法)、INC(加1)减法指令 SUB(减法)、SBB(带借位减法)、DEC(减1)、NEG(求补)、CMP(比较)乘法指令 MUL(无符号数乘法)、IMUL(带符号数乘法)除法指令 DIV(无符号数除法)、IDIV(带符号数除法)、CBW(字节转换为字)、CWD(字转换为双字)3)逻辑指令:对字或字节执行逻辑运算。 逻辑指令类型 指 令 说 明逻辑运算指令 AND(逻辑与)、OR(逻辑或)、NOT(逻辑非)、XOR(异或)、TEST(测试)移动指令 SHL(逻辑左移)、SAL(算术左移)、SHR(逻辑右移)、SAR(算术右移)、ROL(循环左移)、ROR(循环右移)、RCL(带进位循环左移)、RCR(带进位右移)4)串处理指令:处理存放存储器里的数据串。 串处理指令类型 指 令 说 明指 令 MOVS(串传送)、CMPS(串比较)、SCAS(串扫描)、LODS(从串取)、STOS(存入串)5)控制转移指令:用来控制程序的执行流程。 控制转移指令类型 指 令 说 明无条件转移指令 JMP(段间和段内转移)条件转移指令 JZ(结果为0(或相等)则转移)、JS(结果为负则转移)、JNS(结果为正则转移)、JO(溢出则转移)、JNO(不溢出则转移)、JP(奇偶位为1则转移)、JNP(奇偶位为0则转移)循环指令 LOOP(循环指令)、LOOPPZ/LOOPE(当为0或相等时循环指令)、LOOPNZ/LOOPNE(当不为0或不相等时循环指令)子程序指令 CALL(调用指令)、RET(返回指令)中断指令 INT(中断)、INTO(如溢出则中断)、RIET(从中断返回)
求汇编指令大全~
8086/8088指令系统一、数据传送指令1.通用数据传送指令MOV(Move)传送PUSH(Push onto the stack)进栈POP(Pop from the stack)出栈XCHG(Exchange)交换.MOV 指令格式为: MOV DST,SRC执行的操作:(DST)《-(SRC).PUSH 进栈指令格式为:PUSH SRC执行的操作:(SP)《-(SP)-2((SP)+1,(SP))《-(SRC).POP 出栈指令格式为:POP DST执行的操作:(DST)《-((SP+1),(SP))(SP)《-(SP)+2.XCHG 交换指令格式为:XCHG OPR1,OPR2执行的操作:(OPR1)《--》(OPR2)2.累加器专用传送指令IN(Input) 输入OUT(Output) 输出XLAT(Translate) 换码这组指令只限于使用累加器AX 或AL 传送信息..IN 输入指令长格式为: IN AL,PORT(字节)IN AX,PORT(字)执行的操作: (AL)《-(PORT)(字节)(AX)《-(PORT+1,PORT)(字)短格式为: IN AL,DX(字节)IN AX,DX(字)执行的操作: AL《-((DX))(字节)AX《-((DX)+1,DX)(字).OUT 输出指令长格式为: OUT PORT,AL(字节)OUT PORT,AX(字)执行的操作: (PORT)《-(AL)(字节)(PORT+1,PORT)《-(AX)(字)短格式为: OUT DX,AL(字节)OUT DX,AX(字)执行的操作: ((DX))《-(AL)(字节)((DX)+1,(DX))《-AX(字)在IBM-PC 机里,外部设备最多可有65536个I/O 端口,端口(即外设的端口地址)为0000~FFFFH.其中前256个端口(0~FFH)可以直接在指令中指定,这就是长格式中的PORT,此时机器指令用二个字节表示,第二个字节就是端口号.所以用长格式时可以在指定中直接指定端口号,但只限于前256个端口.当端口号》=256时,只能使用短格式,此时,必须先把端口号放到DX 寄存器中(端口号可以从0000到0FFFFH),然后再用IN 或OUT 指令来传送信息..XLAT 换码指令格式为: XLAT OPR或: XLAT执行的操作:(AL)《-((BX)+(AL))3.有效地址送寄存器指令LEA(Load effective address)有效地址送寄存器LDS(Load DS with Pointer)指针送寄存器和DSLES(Load ES with Pointer)指针送寄存器和ES.LEA 有效地址送寄存器格式为: LEA REG,SRC执行的操作:(REG)《-SRC指令把源操作数的有效地址送到指定的寄存器中..LDS 指针送寄存器和DS 指令格式为: LDS REG,SRC执行的操作:(REG)《-(SRC)(DS)《-(SRC+2)把源操作数指定的4个相继字节送到由指令指定的寄存器及DS 寄存器中.该指令常指定SI 寄存器..LES 指针送寄存器和ES 指令格式为: LES REG,SRC执行的操作: (REG)《-(SRC)(ES)《-(SRC+2)把源操作数指定的4个相继字节送到由指令指定的寄存器及ES 寄存器中.该指令常指定DI 寄存器.4.标志寄存器传送指令LAHF(Load AH with flags)标志送AHSAHF(store AH into flags)AH 送标志寄存器PUSHF(push the flags) 标志进栈POPF(pop the flags) 标志出栈.LAHF 标志送AH格式为: LAHF执行的操作:(AH)《-(PWS 的低字节).SAHF AH 送标志寄存器格式为: SAHF执行的操作:(PWS 的低字节)《-(AH).PUSHF 标志进栈格式为: PUSHF执行的操作:(SP)《-(SP)-2((SP)+1,(SP))《-(PSW).POPF 标志出栈格式为: POPF执行的操作:(PWS)《-((SP)+1,(SP))(SP)《-(SP+2)二、算术指令1.加法指令ADD(add)加法ADC(add with carry)带进位加法INC(increment)加1.ADD 加法指令格式: ADD DST,SRC执行的操作:(DST)《-(SRC)+(DST).ADC 带进位加法指令格式: ADC DST,SRC执行的操作:(DST)《-(SRC)+(DST)+CF.ADD 加1指令格式: INC OPR执行的操作:(OPR)《-(OPR)+12.减法指令SUB(subtract)减法SBB(subtract with borrow)带借位减法DEC(Decrement)减1NEG(Negate)求补CMP(Compare)比较.SUB 减法指令格式: SUB DST,SRC执行的操作:(DST)《-(DST)-(SRC).SBB 带借位减法指令格式: SBB DST,SRC执行的操作:(DST)《-(DST)-(SRC)-CF.DEC 减1指令格式: DEC OPR执行的操作:(OPR)《-(OPR)-1.NEG 求补指令格式: NEG OPR执行的操作:(OPR)《- -(OPR).CMP 比较指令格式: CMP OPR1,OPR2执行的操作:(OPR1)-(OPR2)该指令与SUB 指令一样执行减法操作,但不保存结果,只是根据结果设置条件标志西半球.3.乘法指令MUL(Unsigned Multiple)无符号数乘法IMUL(Signed Multiple)带符号数乘法.MUL 无符号数乘法指令格式: MUL SRC执行的操作:字节操作数:(AX)《-(AL)*(SRC)字操作数:(DX,AX)《-(AX)*(SRC).IMUL 带符号数乘法指令格式: IMUL SRC执行的操作:与MUL 相同,但必须是带符号数,而MUL 是无符号数.4.除法指令DIV(Unsigned divide)无符号数除法IDIV(Signed divide)带符号数除法CBW(Convert byte to word)字节转换为字CWD(Contert word to double word)字转换为双字.DIV 无符号数除法指令格式: DIV SRC执行的操作:字节操作:(AL)《-(AX)/(SRC)的商(AH)《-(AX)/(SRC)的余数字操作: (AX)《-(DX,AX)/(SRC)的商(AX)《-(DX,AX)/(SRC)的余数.IDIV 带符号数除法指令格式: DIV SRC执行的操作:与DIV 相同,但操作数必须是带符号数,商和余数也均为带符号数,且余数的符号与被除数的符号相同..CBW 字节转换为字指令格式: CBW执行的操作:AL 的内容符号扩展到AH.即如果(AL)的最高有效位为0,则(AH)=00;如(AL)的最高有效位为1,则(AH)=0FFH.CWD 字转换为双字指令格式: CWD执行的操作:AX 的内容符号扩展到DX.即如(AX) 的最高有效位为0, 则(DX)=0;否则(DX)=0FFFFH.这两条指令都不影响条件码.三、逻辑指令1.逻辑运算指令AND(and) 逻辑与OR(or) 逻辑或NOT(not) 逻辑非XOR(exclusive or)异或TEST(test) 测试.AND 逻辑与指令格式: AND DST,SRC执行的操作:(DST)《-(DST)^(SRC).OR 逻辑或指令格式: OR DST,SRC执行的操作:(DST)《-(DST)V(SRC).NOT 逻辑非指令格式: NOT OPR执行的操作:(OPR)《-(OPR).XOR 异或指令格式: XOR DST,SRC执行的操作:(DST)《-(DST)V(SRC).TEST 测试指令格式: TEST OPR1,OPR2执行的操作:(DST)^(SRC)两个操作数相与的结果不保存,只根据其特征置条件码2.移位指令SHL(shift logical left) 逻辑左移SAL(shift arithmetic left) 算术左移SHR(shift logical right) 逻辑右移SAR(shift arithmetic right) 算术右移ROL(Rotate left) 循环左移ROR(Rotate right) 循环右移RCL(Rotate left through carry) 带进位循环左移RCR(Rotate right through carry) 带进位循环右移格式: SHL OPR,CNT(其余的类似)其中OPR 可以是除立即数以外的任何寻址方式.移位次数由CNT 决定,CNT 可以是1或CL.循环移位指令可以改变操作数中所有位的位置;移位指令则常常用来做乘以2除以2操作.其中算术移位指令适用于带符号数运算,SAL 用来乘2,SAR 用来除以2;而逻辑移位指令则用来无符号数运算,SHL 用来乘2,SHR 用来除以2.四、串处理指令1.与REP 相配合工作的MOVS,STOS 和LODS 指令.REP 重复串操作直到(CX)=0为上格式: REP string primitive其中String Primitive 可为MOVS,LODS 或STOS 指令执行的操作:1)如(CX)=0则退出REP,否则往下执行.2)(CX)《-(CX)-13)执行其中的串操作4)重复1)~3).MOVS 串传送指令格式:可有三种MOVS DST,SRCMOVSB(字节)MOVSW(字)其中第二、三种格式明确地注明是传送字节或字,第一种格式则应在操作数中表明是字还是字节操作,例如:MOVS ES:BYTE PTR[DI],DS:[SI]执行的操作:1)((DI))《-((SI))2)字节操作:(SI)《-(SI)+(或-)1,(DI)《-(DI)+(或-)1当方向标志DF=0时用+,当方向标志DF=1时用-3)字操作:(SI)《-(SI)+(或-)2,(DI)《-(DI)+(或-)2当方向标志DF=0时用+,当方向标志DF=1时用-该指令不影响条件码..CLD(Clear direction flag)该指令使DF=0,在执行串操作指令时可使地址自动增量;.STD(Set direction flag)该指令使DF=1,在执行串操作指令时可使地址自动减量..STOS 存入串指令格式: STOS DSTSTOSB(字节)STOSW(字)执行的操作:字节操作:((DI))《-(AL),(DI)《-(DI)+-1字操作: ((DI))《-(AX),(DI)《-(DI)+-2该指令把AL 或AX 的内容存入由(DI)指定的附加段的某单元中,并根据DF 的值及数据类型修改DI 的内容,当它与REP 联用时,可把AL 或AX 的内容存入一个长度为(CX)的缓冲区中..LODS 从串取指令格式: LODS SRCLODSBLODSW执行的操作:字节操作:(AL)《-((SI)),(SI)《-(SI)+-1字操作: (AX)《-((SI)),(SI)《-(SI)+-2该指令把由(SI)指定的数据段中某单元的内容送到AL 或AX 中,并根据方向标志及数据类型修改SI 的内容.指令允许使用段跨越前缀来指定非数据段的存储区.该指令也不影响条件码.一般说来,该指令不和REP 联用.有时缓冲区中的一串字符需要逐次取出来测试时,可使用本指令.2.与REPE/REPZ 和REPNZ/REPNE 联合工作的CMPS 和SCAS 指令.REPE/REPZ 当相等/为零时重复串操作格式: REPE(或REPZ) String Primitive其中String Primitive 可为CMPS 或SCAS 指令.执行的操作:1)如(CX)=0或ZF=0(即某次比较的结果两个操作数不等)时退出,否则往下执行2)(CX)《-(CX)-13)执行其后的串指令4)重复1)~3).REPNE/REPNZ 当不相等/不为零时重复串操作格式: REPNE(或REPNZ) String Primitive其中String Primitive 可为CMPS 或SCAS 指令执行的操作:除退出条件(CX=0)或ZF=1外,其他操作与REPE 完全相同..CMPS 串比较指令格式: CMP SRC,DSTCMPSBCMPSW执行的操作:1)((SI))-((DI))2)字节操作:(SI)《-(SI)+-1,(DI)《-(DI)+-1字操作: (SI)《-(SI)+-2,(DI)《-(DI)+-2指令把由(SI)指向的数据段中的一个字(或字节)与由(DI)指向的附加段中的一个字(或字节)相减,但不保存结果,只根据结果设置条件码,指令的其它特性和MOVS 指令的规定相同..SCAS 串扫描指令格式: SCAS DSTSCASBSCASW执行的操作:字节操作:(AL)-((DI)),(DI)《-(DI)+-1字操作: (AL)-((DI)),(DI)《-(DI)+-2该指令把AL(或AX)的内容与由(DI)指定的在附加段中的一个字节(或字)进行比较,并不保存结果,只根据结果置条件码.指令的其他特性和MOVS 的规定相同.五、控制转移指令1.无条件转移指令.JMP(jmp) 跳转指令1)段内直接短转移格式:JMP SHORT OPR执行的操作:(IP)《-(IP)+8位位移量2)段内直接近转移格式:JMP NEAR PTR OPR执行的操作:(IP)《-(IP)+16位位移量3)段内间接转移格式:JMP WORD PTR OPR执行的操作:(IP)《-(EA)4)段间直接(远)转移格式:JMP FAR PTR OPR执行的操作:(IP)《-OPR 的段内偏移地址(CS)《-OPR 所在段的段地址5)段间间接转移格式:JMP DWORD PTR OPR执行的操作:(IP)《-(EA)(CS)《-(EA+2)2.条件转移指令1)根据单个条件标志的设置情况转移.JZ(或JE)(Jump if zero,or equal) 结果为零(或相等)则转移格式:JE(或JZ) OPR测试条件:ZF=1.JNZ(或JNE)(Jump if not zero,or not equal) 结果不为零(或不相等)则转移格式:JNZ(或JNE) OPR测试条件:ZF=0.JS(Jump if sign) 结果为负则转移格式: JS OPR测试条件:SF=1.JNS(Jump if not sign) 结果为正则转移格式:JNS OPR测试条件:SF=0.JO(Jump if overflow) 溢出则转移格式: JO OPR测试条件:OF=1.JNO(Jump if not overflow) 不溢出则转移格式: JNO OPR测试条件:OF=0.JP(或JPE)(Jump if parity,or parity even) 奇偶位为1则转移格式: JP OPR测试条件:PF=1.JNP(或JPO)(Jump if not parity,or parity odd) 奇偶位为0则转移格式: JNP(或JPO) OPR测试条件:PF=0.JB(或JNAE,JC)(Jump if below,or not above or equal,or carry) 低于,或者不高于或等于,或进位位为1则转移格式:JB(或JNAE,JC) OPR测试条件:CF=1.JNB(或JAE,JNC)(Jump if not below,or above or equal,or not carry) 不低于,或者高于或者等于,或进位位为0则转移格式:JNB(或JAE,JNC) OPR测试条件:CF=02)比较两个无符号数,并根据比较的结果转移.JB(或JNAE,JC)格式:同上.JNB(或JAE,JNC)格式:同上.JBE(或JNA)(Jump if below or equal,or not above) 低于或等于,或不高于则转移格式:JBE(或JNA) OPR测试条件:CFVZF=1.JNBE(或JA)(Jump if not below or equal,or above) 不低于或等于,或者高于则转移格式:JNBE(或JA) OPR测试条件:CFVZF=03)比较两个带符号数,并根据比较的结果转移.JL(或LNGE)(Jump if less,or not greater or equal) 小于,或者不大于或者等于则转移格式:JL(或JNGE) OPR测试条件:SFVOF=1.JNL(或JGE)(Jump if not less,or greater or equal)不小于,或者大于或者等于则转移格式:JNL(或JGE) OPR测试条件:SFVOF=0.JLE(或JNG)(Jump if less or equal,or not greater) 小于或等于,或者不大于则转移格式:JLE(或JNG) OPR测试条件:(SFVOF)VZF=1.JNLE(或JG)(Jump if not less or equal,or greater) 不小于或等于,或者大于则转移格式:JNLE(或JG) OPR测试条件:(SFVOF)VZF=04)测试CX 的值为0则转移指令.JCXZ(Jump if CX register is zero) CX 寄存器的内容为零则转移格式:JCXZ OPR测试条件:(CX)=0注:条件转移全为8位短跳!3.循环指令.LOOP 循环指令格式: LOOP OPR测试条件:(CX)《》0.LOOPZ/LOOPE 当为零或相等时循环指令格式: LOOPZ(或LOOPE) OPR测试条件:(CX)《》0且ZF=1.LOOPNZ/LOOPNE 当不为零或不相等时循环指令格式: LOOPNZ(或LOOPNE) OPR测试条件:(CX)《》0且ZF=0这三条指令的步骤是:1)(CX)《-(CX)-12)检查是否满足测试条件,如满足则(IP)《-(IP)+D8的符号扩充.4.子程序.CALL 调用指令.RET 返回指令5.中断.INT 指令格式: INT TYPE或INT执行的操作:(SP)《-(SP)-2((SP)+1,(SP))《-(PSW)(SP)《-(SP)-2((SP)+1,(SP))《-(CS)(SP)《-(SP)-2((SP)+1,(SP))《-(IP)(IP)《-(TYPE*4)(CS)《-(TYPE*4+2).INTO 若溢出则中断执行的操作:若OF=1则:(SP)《-(SP)-2((SP)+1,(SP))《-(PSW)(SP)《-(SP)-2((SP)+1,(SP))《-(CS)(SP)《-(SP)-2((SP)+1,(SP))《-(IP)(IP)《-(10H)(CS)《-(12H).IRET 从中断返回指令格式: IRET执行的操作:(IP)《-((SP)+1,(SP))(SP)《-(SP)+2(CS)《-((SP)+1,(SP))(SP)《-(SP)+2(PSW)《-((SP)+1,(SP))(SP)《-(SP)+2六、处理机控制指令1.标志处理指令.CLC 进位位置0指令(Clear carry)CF《-0.CMC 进位位求反指令(Complement carry)CF《-CF.STC 进位位置1指令(Set carry)CF《-1.CLD 方向标志置0指令(Clear direction)DF《-0.STD 方向标志置1指令(Set direction)DF《-1.CLI 中断标志置0指令(Clear interrupt)IF《-0.STI 中断标志置1指令(Set interrupt)IF《-02.其他处理机控制指令NOP(No Opreation) 无操作HLT(Halt) 停机WAIT(Wait) 等待ESC(Escape) 换码LOCK(Lock) 封锁这些指令可以控制处理机状态.这们都不影响条件码..NOP 无操作指令该指令不执行任何操作,其机器码占有一个字节,在调试程序时往往用这条指令占有一定的存储单元,以便在正式运行时用其他指令取代..HLT 停机指令该指令可使机器暂停工作,使处理机处于停机状态以便等待一次外部中断到来,中断结束后可继续执行下面的程序..WAIT 等待指令该指令使处理机处于空转状态,它也可以用来等待外部中断的发生,但中断结束后仍返回WAIT 指令继续德行..ESC 换码指令格式ESC mem其中mem 指出一个存储单元,ESC 指令把该存储单元的内容送到数据总线去.当然ESC 指令不允许使用立即数和寄存器寻址方式.这条指令在使用协处理机(Coprocessor)执行某些操作时,可从存储器指得指令或操作数.协处理机(如8087)则是为了提高速度而可以选配的硬件..LOCK 封锁指令该指令是一种前缀,它可与其他指令联合,用来维持总线的锁存信号直到与其联合的指令执行完为止.当CPU 与其他处理机协同工作时,该指令可避免破坏有用信息.
汇编指令和汇编语言指令之间的区别是什么
汇编指令,assembler directives,亦称伪指令,用于指示汇编程序如何汇编源程序,不参与汇编代码生成。汇编语言指令,assembly language instructions,可供执行的程序代码。记住directives和instructions二者区别就明晰了。
汇编指令B,BL,BX,BLX 和 BXJ的区别
ARM架构下B,根据标签分支执行指令BL,根据标签分支且在LR链接寄存器下记录BX,根据寄存器中的地址分支,并切换处理器ARM和Thumb状态BLX ,综合以上3个,分支、存链接、根据标签或寄存器中地址分支、交换状态。BXJ,同BX,根据寄存器中的地址分支,但切换到Jazelle(Java)处理器状态. ARM v8后Java产品取消等同于BX...
主要的汇编指令有哪些
LDR 和STR——用于字和无符号字节指令格式:LDR/STR{cond}{T} Rd,《地址》LDR/STR{cond}B{T} Rd,《地址》 LDR{cond}{T} Rd,《地址》 加载指定地址的字数据到Rd中;STR{cond}{T} Rd,《地址》 存储Rd中的字数据到指定的地址单元中;LDR{cond}B{T} Rd,《地址》 指令加载指定地址的字节数据到Rd的的最低字节中(Rd的高24位清零);STR{cond}B{T} Rd, 《地址》 指令存储Rd中的最低字节数据到指定的地址单元中。 T为可选后缀,若有T,那么即使处理器是在特权模式下,存储系统也将访问看成处理器是在用户模式下,T 在用户模式下无效,不能与前索引偏移一起使用T。地址部分可用的形式有4种: 零偏移(zero offset) [Rn] ,Rn的值作为传送数据的地址。如: LDR R0,[R1]; 前索引偏移(pre-indexed offset) [Rn,Flexoffset]{!} 在数据传送之前,将偏移量Flexoffset加到Rn 中。其结果作为传送数据的存储器地址。若使用后缀“!”,则结果写回到Rn 中,且Rn 不允许是R15,如: LDRB R0,[R1,#8]LDR R0,[R1,#8]! 程序相对偏移(program relative) label(label 必须是在当前指令的土4KB 范围内) 。 程序相对偏移是前索引形式的另一种版本。从PC 计算偏移量,并将PC 作为Rn 生成前索引指令,不能使用后缀“!”,如: LDR R0,place ;place地址装入R0 后索引偏移(post-indexed offset) [Rn],Flexoffset。在数据传送后,将偏移量Flexoffset 加到Rn 中,结果写回到Rn,Rn 不允许是R15,如: LDR R0,[R1],R2,LSL#2 ;将存储器地址为R1 的字数据读入寄存器R0,并将新地址R1+R2×4写入R1。偏移量Flexoffset可以是下两种形式之:1) 取值范围是-4095 到+4095 的整数的表达式,经常是数字常量,如:STR R5,[R7],#--8 2) 一个寄存器再加上移位(移位由立即数指定),如:{-}Rm{,shift} 其中: - :可选负号。若带符号“一”,则从Rn 中减去偏移量。否则,将偏移量加到Rn 中。Rm :内含偏移量的寄存器。Rm 不允许是R15。 Shift:Rm 的可选移位方法。可以是下列形式的任何一种: ASR n :算术右移n 位(1《=n《=32) LSL n :逻辑左移n 位(1《=n《=31) LSR n :逻辑右移n 位(1《=n《=32) ROR n :循环右移n 位(1《=n《=31) RRX :循环右移1 位,带扩展。AND―――――逻辑”与”操作指令指令格式:AND{cond}{S} Rd,Rn,operand2 AND指令将操作数operand2 与Rn 的值按位逻辑”与”,结果存放到目的寄存器Rd 中。若设置S,则根据运算结果影响N、Z位,在计算第二操作数时,更新C位,不影响V位(指令ORR、EOR、BIC 对标志位的影响同AND 指令)。指令示例:ANDS R1,R1,R2 ;R1=R1&R2,并根据运算的结果更新标志位AND R0,R0,#0x0F ;R0=R0&0x0F,取出R0最低4位数据。ORR―――――逻辑”或”操作指令指令格式:ORR{cond}{S} Rd,Rn,operand2 ORR指令将操作数operand2 与Rn 的值按位逻辑”或”,结果存放到目的寄存器Rd 中。指令示例: ORRS R1,R1,R2 ;R1=R1|R2,并根据运算的结果更新标志位ORR R0,R0,#0x0F ;R0=R0|0x0F,将R0最低4位置1,其余位不变。 BIC―――――位清除指令指令格式:BIC{cond}{S} Rd,Rn,operand2 BIC指令将Rn 的值与操作数operand2 的反码按位逻辑”与”,结果存放到目的寄存器Rd 中。指令示例:BIC R0,R0,#0x0F ;将R0最低4位清零,其余位不变。CMP―――――比较指令 指令格式:CMP{cond} Rn,operand2 CMP指令用Rn的值减去操作数operand2 ,并将结果的状态(Rn 与operand2比较是大、小、相等)反映在CPSR中,以便后面的指令根据条件标志决定程序的走向。CMP指令与SUBS指令完成的操作一样,只是CMP指令只减,不存结果。 指令示例: cmp R0,R1 ;比较R0,R1 beq stop ;R0=R1跳到stopblt less ;R0《R1跳到Less . . . Less:. . . Stop: ...SUB―――――减法运算指令指令格式:SUB{cond}{S} Rd,Rn,operand2 SUB指令用Rn 的值减去操作数operand2 ,并将结果存放到目的寄存器Rd 中。 指令示例: SUBS R1,R1,R2 ;R1=R1-R2,并并根据运算的结果更新标志位SUBGT R3,3,#1 ;大于则 R3=R3-1 SUB R0,R2,R3,LSL#2; R0=R2-(R3《《2)ARM分支指令助记符 说明 操作B{cond} lable 分支指令 PC← lable BL{cond} lable 带链接的分支指令 LR← PC-4 ,PC←lable BX{cond} Rm 带状态切换的分支指令 PC← Rm,切换处理器状态指令的条件码条件码 助记符后缀 标志 含义 0000 EQ Z置位(Z=1) 相等 0001 NE Z清零(Z=0) 不相等 0010 CS C置位 无符号数大于等于 0011 CC C清零 无符号数小于 0100 MI N置位 负数 0101 PL N清零 整数或0 0110 VS V置位 溢出 0111 VC V清零 未溢出 1000 HI C置位且Z清零 无符号数大于 1001 LS Z置位且C清零 无符号数小于等于 1010 GE N等于V(N=V=1或N=V=0) 带符号数大于或等于 1011 LT N不等于V 带符号数小于 1100 GT Z清零且N等于V 带符号数大于 1101 LE Z置位或N不等于V 带符号数小于或等于 1110 AL 忽略 无条件执行 ;GPIO寄存器宏定义GPFCON EQU 0x56000050 GPFDAT EQU 0x56000054GPFUP EQU 0x56000058 EXPORT LEDTESTAREA LEDTESTASM,CODE,READONLY ;该伪指令定义了一个代码段,段名为LEDTESTASM,属性只读LEDTEST;设置GPF4-GPF7为outputldr r0,=GPFCON ldr r1,[r0]bic r1,r1,#0xff00orr r1,r1,#0x5500str r1,[r0];禁止GPF4-GPF7端口的上拉电阻ldr r0,=GPFUPldr r1,[r0]orr r1,r1,#0xf0str r1,[r0]looptest;将数据端口F的数据寄存器的地址附给寄存器r2ldr r2,=GPFDATldr r3,[r2]bic r3,r3,#0xf0orr r3,r3,#0xb0str r3,[r2] ;GPF6 output 0ldr r0,=0x2fffffbl delay ;调用延迟子程序ldr r3,[r2]bic r3,r3,#0xf0orr r3,r3,#0x70str r3,[r2] ;GPF7 output 0ldr r0,=0x2fffff ;初始计数值bl delay ;调用延迟子程序 ldr r3,[r2]bic r3,r3,#0xf0orr r3,r3,#0xd0str r3,[r2] ;GPF5 output 0ldr r0,=0x2fffffbl delay ;调用延迟子程序ldr r3,[r2]bic r3,r3,#0xf0orr r3,r3,#0xe0str r3,[r2] ;GPF4 output 0ldr r0,=0x2fffffbl delay ;调用延迟子程序b looptestdelaysub r0,r0,#1 ;r0=r0-1 cmp r0,#0x0 ;将r0的值与0相比较bne delay ;比较的结果不为0(r0不为0),继续调用delay,否则执行下一条语句mov pc,lr ;返回END ;程序结束符