8086_8088_汇编_指令_手册

8086_8088_汇编_指令_手册
8086_8088_汇编_指令_手册

8086 8088 汇编指令手册

通用寄存器

(1)数据寄存器

数据寄存器共有4个寄存器AX、BX、CX、DX,用来保存操作数或运算结果等信息。

AX寄存器称为累加器。使用频度最高,用于算术、逻辑运算以及与外设传送信息等。

BX寄存器称为基址寄存器。常用于存放存储器地址。

CX寄存器称为计数器。一般作为循环或串操作等指令中的隐含计数器。

DX寄存器称为数据寄存器。常用来存放双字数据的高16位,或存放外设端口地址。(2)变址和指针寄存器

变址和指针寄存器包括SI、DI、SP、BP 4个16位寄存器,主要用于存放某个存储单元的偏移地址。

SI是源变址寄存器。

DI是目的变址寄存器,在字符串操作中,SI和DI都具有自动增量或减量的功能。

SP为堆栈指针寄存器,用于存放当前堆栈段中栈顶的偏移地址。

BP为基址指针寄存器,用于存放堆栈段中某一存储单元的偏移地址。

2.段寄存器

8086 CPU的4个16位的段寄存器分别称为代码段寄存器CS,数据段寄存器DS,堆栈段寄存器SS,附加数据段寄存器ES。

段寄存器用来确定该段在内存中的起始地址。

代码段用来存放程序的指令序列。

CS存放代码段的段首址,指令指针寄存器IP指示代码段中指令的偏移地址。

3.指令指针

8086 CPU中的指令指针IP,它总是保存下一次将要从主存中取出指令的偏移地址,偏移地址的值为该指令到所在段段首址的字节距离。在目标程序运行时,IP的内容由微处理器硬件自动设置,程序不能直接访问IP,但一些指令却可改变IP的值,如转移指令、子程序调用指令等。

3.1 标志寄存器

8086 CPU中有一个很重要的16位标志寄存器,它包含9个标志位,主要用于保存一条指令执行后,CPU所处状态信息及运算结果的特征。

条件标志(1)进位标志CF (2)零标志ZF (3)符号标志SF (4)溢出标志 OF

(5)奇偶标志 PF (6)辅助进位标志AF

状态控制标志(1)方向标志DF (2)中断允许标志IF (3)追踪标志TF

运算结果标志位

1、进位标志CF(Carry Flag)

进位标志CF主要用来反映运算是否产生进位或借位。如果运算结果的最高位产生了一个进位或借位,那么,其值为1,否则其值为0。

使用该标志位的情况有:多字(字节)数的加减运算,无符号数的大小比较运算,移位操作,字(字节)之间移位,专门改变CF值的指令等。

2、奇偶标志PF(Parity Flag)

奇偶标志PF用于反映运算结果中“1”的个数的奇偶性。如果“1”的个数为偶数,则PF的值为1,否则其值为0。

利用PF可进行奇偶校验检查,或产生奇偶校验位。在数据传送过程中,为了提供传送的可

靠性,如果采用奇偶校验的方法,就可使用该标志位。

3、辅助进位标志AF(Auxiliary Carry Flag)

在发生下列情况时,辅助进位标志AF的值被置为1,否则其值为0:

(1)在字操作时,发生低字节向高字节进位或借位时;

(2)在字节操作时,发生低4位向高4位进位或借位时。

对以上6个运算结果标志位,在一般编程情况下,标志位CF、ZF、SF和OF的使用频率较高,而标志位PF和AF的使用频率较低。

4、零标志ZF(Zero Flag)

零标志ZF用来反映运算结果是否为0。如果运算结果为0,则其值为1,否则其值为0。在判断运算结果是否为0时,可使用此标志位。

5、符号标志SF(Sign Flag)

符号标志SF用来反映运算结果的符号位,它与运算结果的最高位相同。在微机系统中,有符号数采用码表示法,所以,SF也就反映运算结果的

正负号。运算结果为正数时,SF的值为0,否则其值为1。

6、溢出标志OF(Overflow Flag)

溢出标志OF用于反映有符号数加减运算所得结果是否溢出。如果运算结果超过当前运算位数所能表示的范围,则称为溢出,OF的值被置为1,否

则,OF的值被清为0。

常用指令

通用数据传送指令.

MOV 传送字或字节MOV OPRD1,OPRD2

功能: 本指令将一个源操作数

送到目的操作数中,即

OPRD1<--OPRD21. OPRD1 为目的操作数,可以是寄存器、存储器、累加器. OPRD2 为源操作数,可以是寄存器、存储器、累加器和立即数.

2. MOV 指令以分为以下四种情况:

<1> 寄存器与寄存器之间的数据传送指令

<2> 立即数到通用寄存器数据传送指令

<3> 寄存器与存储器之间的数据传送指令

<4> 立即数到存储器的数据传送

3. 本指令不影响状态标志位

PUSH 把字压入堆栈PUSH OPRD

功能: 实现压入操作的指令是

PUSH指令;1. OPRD为16位(字)操作数,可以是寄存器或存储器操作数.

2. PUSH的操作过程是:

(SP)<--(SP)-2,((sp))<--OPR D 即先修改堆栈指针SP(压入时为自动减2),然后,将指定的操作数送入新的栈顶位置. 此处的((SP))<--OPRD,也可以理解为:

[(SS)*16+(SP)]<--OPRD 或[SS:SP]<--OPRD

POP 把字弹出堆栈POP OPRD

实现弹出操作的指令是POP

指令1. OPRD为16位(字)操作数,

可以是寄存器或存储器操作数.

2. POP指令的操作过程是: POP OPRD:OPRD<--((SP)),(SP)<--(SP)+2

它与压入操作相反,是先弹出

栈顶的数顶,然后再修改指针SP的内容.

3. 示例: POP AX

POP DS

POP DATA1 POP ALFA[BX][DI] 4. PUSH和POP指令对状态标

志位没有影响

XCHG 交换字或字节XCHG OPRD1,OPRD2 其中的

OPRD1为目的操作数,OPRD2为

源操作数

功能: 将两个操作数相互交换

位置,该指令把源操作数OPRD2

与目的操数OPRD1交换.至少有一个操作数为寄存器,段寄存器不可作为操作数1. OPRD1及OPRD2可为通用寄存器或存储器,但是两个存储器之间是不能用XCHG指令实现的.

2. 段寄存器内容不能用XCHG 指令来交换.

3. 若要实现两个存储器操作数DATA1及DATA2的交换,可用以下指令实现:

示例: PUSH DATA1

PUSH DATA2

POP DATA1

POP DATA2

4. 本指令不影响状态标志位

输入输出端口传送指令.

IN I/O端口输入IN AL,n ;(AL)<--(n)

IN AX,n ;(AX)<--(n+1),(n)

IN AL,DX ;(AL)<--[(DX)]

IN 1. 其中n为8位的端口地址,当字节输入时,将端口地址n+1的内容送至AH中,端口地址n 的内容送AL中.

AX,DX ;(AX)<--[(DX)+1],[(D X)]

功能: 输入指令2. 端口地址也可以是16位的,但必须将16位的端口地址送入DX中.当字节寻址时,由DX内容作端口地址的内容送至AL中;

当输入数据字时,[(DX)+1]送AH,[(DX)]送AL中,用符

号:(AX)<--[(DX)+1],[(DX)]表示

OUT I/O端口输出OUT n,AL ;(n)<--(AL)

功能: 输出指令1. OUT

n,AX ;(n+1),(n)<--(AX) OUT DX,AL ;[(DX)]<--(AL) OUT

DX,AX ;[(DX)+1],[(DX)]<--( AX)

2. 输入指令及输出指令对标志位都不影响.

输入输出端口由立即方式指定时, 其范围是0-255; 由寄存器DX 指定时,其范围是0-65535.

目的地址传送指令.

LEA 装入有效地址.

例: LEA DX,string ;把偏移地址存到DX.

LDS 传送目标指针,把指针内容装入DS.

例: LDS SI,string ;把段地址:偏移地址存到DS:SI.

LES 传送目标指针,把指针内容装入ES.

例: LES DI,string ;把段地址:偏移地址存到ESDI.

LFS 传送目标指针,把指针内容装入FS.

例: LFS DI,string ;把段地址:偏移地址存到FSD.

LGS 传送目标指针,把指针内容装入GS.

例: LGS DI,string ;把段地址:偏移地址存到GSDI.

LSS 传送目标指针,把指针内容装入SS.

例: LSS DI,string ;把段地址:偏移地址存到SSDI.

算术运算指令

ADD 加法ADD OPRD1,OPRD2

功能: OPRD1<-OPRD1 + OPRD2

CF、SF、OF、PF、ZF、AF

1.两个操作数类型匹配

2. OPRD1和OPRD2均为寄存器是允许的,一个

为寄存器而另一个为存储器也是允许的, 但不

允许两个都是存储器操作数.

ADC 带进ADC OPRD1,OPRD2 该语句在ADD语句后才会有意义

位加法功能: OPRD1<-OPRD1 + OPRD2 + CF

INC 加1 INC OPRD

功能: OPRD<--OPRD+1

影响AF、OF、PF、SF、ZF标志位,

但不影响CF标志位

1.OPRD 为寄存器或存储器操作数.

2.3. 示例:

INC SI;(SI)<--(SI)+1

INC WORD PTR[BX]

INC BYTE PTR[BX+DI]

INC CL;(CL)<--(CL)+1

注意: 上述第二,三两条指令,是对存储字及存

储字节的内容加1以替代原来的内容.

AAA 加法的ASCII 码调整. AAA

功能: 调整AL值,该值由两个

ASCII码相加而得

CF、SF、PF、ZF、AF

OF无定义

1.把结果转换成直观的十进制,默认操作数AL

2. AAA的调整操作

(1)若(AL)低四位>9 或 AF=1, 则

(AL)<--(AL)+6,(AH)<--(AH)+1,AF=1,置AF和

CF=1,否则只置AF、CF=0;

(2)清除AL高四位

DAA 加法的十进制调整. DAA

功能: 将AL值调整为压缩BCD码

AF、CF、PF、SF、ZF

(OF无定义)

1.调整操作如下

(1) 若低四位>9 或 AF=1,则

(AL)<--(AL)+6,AF<--1

(2) 若(AL)高四位>9 或 CF=1,则

(AL)<--(AL)+60H,CF<--1.

(3)如果以上两点都不成立,清除AF、CF

2. 示例: (AL)=18H,(BL)=06H

ADD AL,BL ; (AL)<--(AL)+(BL) ; (AL)=1EH

DAA ; (AL)

SUB 减法. SUB OPRD1,OPRD2

功能: 两个操作数的相减,即从

OPRD1中减去OPRD2,其结果放在

OPDR1中

CF、SF、OF、PF、ZF、AF

SBB 带借位减法. SBB OPRD1,OPRD2

功能: 是进行两个操作数的相减

再减去CF进位标志位,即从

OPRD1<--OPRD1-OPRD2-CF,其结

果放在OPDR1中.

CF、SF、OF、PF、ZF、AF

DEC 减1 DEC OPRD

功能: OPRD<--OPRD-1

1. OPRD 为寄存器或存储器操作数.

2. 这条指令执行结果影响AF、OF、PF、SF、

ZF标志位,但不影响CF标志位.

AAS 减法的ASCII 码调整AAS

功能: 调整AL值,该值由两个

AXCII字节相减所得。

影响标志位CF及AF(其他未定

义)

1.若(AL)低四位> 9 或 AF=1 则

(AL)<--(AL)-6,(AH)<--(AH)-1,AF=1,CF=1,

否则AF=0,CF=0

2.清除AL高四位

DAS 减法的十进制调整DAS

功能:将AL值调整为压缩BCD码

若(AL)低四位 > 9 或 AF=1,则

(AL)<--(AL)-6,AF=1

若(AL) 高四位 >9或 CF=1,则

(AL)<--(AL)-60h,CF=1

如果以上都不成立,清除AF、CF

MUL 无符号乘法MUL OPRD

功能: 乘法操作

结果回送AH和AL(字节运算),

或DX和AX(字运算)

1. OPRD为通用寄存器或存储器操作数.

2. OPRD为源操作数,即作乘数.目的操作数是

隐含的,即被乘数总是指定为累加器AX或AL的

内容.

3. 16位乘法时,AX中为被乘数.8位乘法时,AL

为被乘数.当16位乘法时,32位的乘积存于DX

及AX中;8位乘法的16位乘积存于AX中.

4. 操作过程: 字节相乘:(AX)<--(AL)*OPRD,

当结果的高位字节(AH)不等于0时,则CF=1、

OF=1

IMUL 整数乘法 IMUL OPRD

功能: 完成两个带符号数的相乘

结果回送AH和AL(字节运算),

或DX和AX(字运算)

1. 其中OPRD为任一通用寄存器或存储器操作

数.

2. MUL指令对带符号相乘时,不能得到正确的

结果.

例如: (AL)=255

(CL)=255

MUL CL

(AX)=65025

注意: 这对无符号数讲,结果是正确的,但对带

符号数讲,相当于(-1)*(-1)结果应为+1,而

65025对应的带符号数为-511,显然是不正确

的.

AAM

乘法的ASCII码调整AAM

功能: 调整AL值,该值由两个

BCD码用无符号乘法指令MUL所

得。

PF、SF、ZF(其他无定义)

(AH)<--(AL)/10 (AL)<--(AL)%10

若AL低四位>9或AF=1,

AH<--AH-1,AL<--AL-6,AF=1,CF=1;

否则,AF=0,CF=0

DIV 无符号除法DIV OPRD

功能: 实现两个无符号二进制数

除法运算.

商回送AL,余数回送AH, (字节

运算);

或商回送AX,余数回送DX,

(字运算)

被除数必须是除数长度的两倍

IDIV 整数除法DIV OPRD

功能: 这实现两个带符号数的二

进制除法运算.

商回送AL,余数回送AH, (字节

运算);

1. 其中OPRD为任一通用寄存器或存储器操作

数.

2. 理由与IMUL相同,只有IDIV指令,才能得到

符号数相除的正确结果.

3. 被除数必须是除数长度的两倍

或商回送AX,余数回送DX, (字运算)

AAD 除法的ASCII 码调整格式: AAD

功能: 在作除法前用于调整AH、

AL的值,把两个寄存器中单BCD

码组成一个十进制数值

PF、SF、ZF(其他无定义)

AL<--(AH)×10+(AL),AH=0

CBW

字节转换为字. CBW

功能: 将字节扩展为字,即把AL

寄存器的符号位扩展到AH中.

1. 两个字节相除时,先使用本指令形成一个双

字节长的被除数.

2. 本指令不影响标志位.

CWD

字转换为双字CWD

功能: 将字扩展为双字长,即把

AX寄存器的符号位扩展到DX中

1. 两个字或字节相除时,先用本指令形成一个

双字长的的被除数.

2. 本指令不影响标志位.

NEG 求反(以0 减之) NEG OPRD

功能: 对操作数OPRD进行取补操

作,然后将结果送回OPRD.取补操

作也叫作求补操作,就是求一个

数的相反数的补码

1. OPRD为任意通用寄存器或存储器操作数.

2. 示例: (AL)=44H,取补,(AL)=0BCH(-44H).

3. 本指令影响标志位CF、OF、SF、PF、ZF及

AF

逻辑运算指令

AND 与运算AND OPRD1,OPRD2

功能: 对两个操作数实现按位逻辑与

运算,结果送至目的操作数.本指令可

以进行字节或字的‘与’运算

1. 目的操作数OPRD1为任一通用寄存

器或存储器操作数.源操作数OPRD2为

立即数,任一通用寄存器或存储器操作

数.

2. 示例: AND AL,0FH ;(AL)<--(AL) AND

0FH

OR

或运算 OR OPRD1,OPRD2

功能: OR指令完成对两个操作数按位

的‘或’运算,结果送至目的操作数中,

本指令可以进行字节或字的‘或’运

算. OPRD1<--OPRD1 OR OPRD2

1.其中OPRD1,OPRD2含义与AND指令相

同,对标志位的影响也与AND指令相同.

2. 两数相或,有一个数为真则值为真.

CF、OF、PF、ZF、SF(AF无定义)

NOT 取反NOT OPRD

功能: 完成对操作数按位求反运算

(即0变1,1变0),结果关回原操作数

1. 其中OPRD可为任一通用寄存器或存

储器操作数.

2. 本指令可以进行字或字节‘非’运算.

3. 本指令不影响标志位.

XOR

异或运算XOR OPRD1,OPRD2

功能: 实现两个操作数按位‘异或’

运算,结果送至目的操作数中.

OPRD1<--OPRD1 XOR OPRD2

1. 其在OPRD1、OPRD2的含义与AND指

令相同,对标志位的影响与与AND指令

相同.

2. 相异为真,相同为假.

TEST EST OPRD1,OPRD2 TEST与AND指令的关系,有点类似于CMP

测试功能: 其中OPRD1、OPRD2的含义同

AND指令一样,也是对两个操作数进行

按位的'与'运算,唯一不同之处是不

将'与'的结果送目的操作数,即本指

令对两个操作数的内容均不进行修

改,仅是在逻辑与操作后,对标志位重

新置位.

与SUB指令之间的关系.

SHL 逻辑左移SHL OPRD1,COUNT

功能: 对给定的目的操作数左移

COUNT次,每次移位时最高位移入标志

位CF中,最低位补零.

OF,PF,SF,ZF,CF

1. 其中OPRD1为目的操作数,可以是通

用寄存器或存储器操作数.

2. COUNT代表移位的次数(或位数).移

位一次,COUNT=1;移位多于1次

时,COUNT=(CL),(CL)中为移位的次数.

SAL 算术左移.(=SHL)

SHR 逻辑右移SHR OPRD1,COUNT

功能: 本指令实现由COUNT决定次数

的逻辑右移操作,每次移位时,最高位

补0,最低位移至标志位CF中

1. 其中OPRD1为目的操作数,可以是通

用寄存器或存储器操作数.

2. COUNT代表移位的次数(或位数).移

位一次,COUNT=1;移位多于1次

时,COUNT=(CL),(CL)中为移位的次数.

3. 影响标志位OF,PF,SF,ZF,CF.

SAR 算术右移.(=SHR)

ROL 循环左移ROL OPRD1,COUNT ;不含进位标志位CF

在循环中的左循环移位指令.

影响标志位OF,PF,SF,ZF,CF.

1. 本指令组只影响标志CF、OF.OF由移

入CF的内容决定,OF取决于移位一次后

符号位是否改变,如改变,则OF=1.

2. 由于是循环移位,所以对字节移位8

次; 对字移位16次,就可恢复为原操作

数.由于带CF的循环移位,可以将CF的

内容移入,

所以可以利用它实现多字节的循环.

ROR 循环右移ROR OPRD1,COUNT ;不含进位示志位CF 在循环中的右循环移位指令.

影响标志位OF,PF,SF,ZF,CF.

RCL 通过进位的循环左移.

RCR 通过进位的循环右移.

以上八种移位指令,其移位次数可达255次.

移位一次时, 可直接用操作码. 如SHL AX,1.

移位>1次时, 则由寄存器CL给出移位次数. 如MOV CL,04

SHL AX,CL

串指令

MOVS 串传送MOVS OPRD1,OPRD2

MOVSB

MOVSW

功能: OPRD1<--OPRD21. 其中OPRD2为源串符号地址,OPRD1为目的串符号地址.

2. 字节串操作: 若DF=0,则作加, 若DF=1,则作减.

3. 对字串操作时: 若DF=0,则作加,若DF=1,则作减,.

4. 在指令中不出现操作数时,字节串传送格式为MOVSB、字串传送格式为MOVSW.

5. 本指令不影响标志位.

CMPS 串比较CMPS OPRD1,OPRD2

CMPSB

CMPSW

功能: 由SI寻址的源串中数

据与由DI寻址的目的串中数

据进行比较,比较结果送标志

位,而不改变操作数本身.

同时SI,DI将自动调整.1. 其中OPRD2为源串符号地址,OPRD1为目的串符号地址.

2. 本指令影响标志位AF、CF、OF、SF、PF、ZF.本指令可用来检查二个字符串是否相同,可

以使用循环控制方法对整串进行比较.

3. 与MOVS相似,CMPS指令也可以不使用操作数,此时可用

指令CMPSB或CMPSW分别表示字节串比较或字串比较

SCAS 串扫描把AL或AX的内容与目标串

作比较,比较结果反映在标志

LODS 装入串LODS OPRD 其中OPRD为源字符

串符号地址.

功能: 把SI寻址的源串的数

据字节送AL或数据字送AX中

去, 并根据DF的值修改地址

指针SI进行自动调整把源串中的元素(字或字节)逐一装入AL或AX中LODSB 传送字符. LODSW 传送字. LODSD 传送双字本指令不影响标志位

STOS 保存串STOS OPRD

功能: 把AL(字节)或AX(字)

中的数据存储到DI为目的串

地址指针所寻址的存储器单元

中去.指针DI将根据DF的值进

行自动调整.是LODS的逆过程

1. 其中OPRD为目的串符号地址.

2. 本指令不影响标志位.当不使用操作数时,可用STOSB或STOSW分别表示字节串或字串的操作.

REP REP

功能: 在串操作指令前加上重

复前缀,可以对字符串进重复

处理.由于加上重复前缀后,对

当CX≠0时重复

应的指令代码是不同的,所以

指令的功能便具有重复处理的

功能,重复的次数存放在CX寄

存器中

REPE/REPZ 当ZF=1或比较结果相等,且

CX≠0时重复

REPNE/REPNZ 当ZF=0或比较结果不相等,

且CX≠0时重复

程序转移指令

CMP 比较.(两操作数作减法,仅修改标志位,不回送结果).

CMP OPRD1,OPRD2

功能: 对两数进行相减,进行比较

1.OPRD1为任意通用寄存器或存储器操作数. OPRD2为任意通用寄存器或存储器操作数,立即数也可用作源操作数OPRD

2.

2. 对标志位的影响同SUB指令,完成的操作与SUB指令类似,唯一的区别是不将OPRD1-OPRD2的结果送回OPRD1,而只是比较.

1.无符号数

指令功能检测条件JZ、JE 相等或为0转移ZF=1

JNZ、JNE 不等或不为0转移ZF=0

JA、JNBE > 则转移CF=0&ZF=0 JAE、JNB >=则转移CF=0

JB、JNE <则转移CF=1

JBE、JNA <=则转移CF=1 || AF=1

2.有符号数

JZ、JE 相等或为0转移ZF=1

JNZ、JNE 不等或不为0转移ZF=0

JG、JNLE > 则转移ZF=0&OF=SF

JGE、JNL >=则转移SF=OF

JL、JNGE <则转移SF≠OF

JLE、JNG <=则转移ZF=1&OF=SF

3.标志位

JC 进位则转移CF=1

JNC 无进位则转移CF=0

JO 有溢出则转移OF=1

JNO 无溢出则转移OF=0

JP、JPE 有偶数个1则转移PF=1

JNP、JPO 有奇数个1则转移PF=0

JS 若为负数则转移SF=1 JNS 若为正数,则转移SF=0

调用子程序与返回指令

CALL 子程序调用指令CALL OPRD

功能: 过程调用指令1. 其中OPRD为过程的目的地址.

2. 过程调用可分为段内调用和段间调用两种.寻址方式也可以分为直接寻址和间接寻址两种.

3. 本指令不影响标志位.

RET 子程序返回指令RET

功能: 当调用的过程结束后实

现从过程返回至原调用程序的

下一条指令,本指令不影响标

志位.由于在过程定义时,已指明其近(NEAR)或远(FAR)的属性,所以RET指令根据段内调用与段间调用,执行不同的操作

对段内调用: 返回时,由堆栈弹出一个字的返回地址的段内偏移量至IP.

对段外调用: 返回时,由堆栈弹出的第一个字为返回地址的段内偏移量,将其送入IP中,由堆栈弹出第二个字为返回地址的段基址,将其送入CS中

PROC,ENDP 过程定义语句

其它指令

OFFSET 返回偏移地址

SEG 返回段地址

DUP 操作数字段用复制操作符SEGMENT,ENDS 段定义指令

ASSUME 段地址分配指令

ORG 起始偏移地址设置指令$ 地址计数器的当前值

PowerPC总汇编指令集

PowerPC汇编指令集 标签:汇编指令PowerPC PPC 2008-05-04 21:25 PowerPC 体系结构规范(PowerPC Architecture Specification)发布 于 1993 年,它是一个 64 位规范 ( 也包含 32 位子集 )。几乎所有常规可用 的 PowerPC(除了新型号 IBM RS/6000 和所有 IBM pSeries 高端服务器)都 是 32 位的。 PowerPC 处理器有 32 个(32 位或 64 位)GPR(通用寄存器)以及诸如 PC (程序计数器,也称为IAR/指令地址寄存器或 NIP/下一指令指针)、LR(链接寄存器)、CR(条件寄存器)等各种其它寄存器。有些 PowerPC CPU 还 有 32 个 64 位 FPR(浮点寄存器)。MPC555使用的PowerPC CPU是带有FPR 的。一些常用寄存器介绍如下: 通用寄存器的用途: r0在函数开始(function prologs)时使用。 r1堆栈指针,相当于ia32架构中的esp寄存器,idapro把这个寄存器反汇编标识为sp。 r2内容表(toc)指针,idapro把这个寄存器反汇编标识为rtoc。系统调用时,它包含系统调用号(这个好像跟系统有关吧)。 r3作为第一个参数和返回值。 r4-r10函数或系统调用开始的参数。 r11用在指针的调用和当作一些语言的环境指针。 r12它用在异常处理和glink(动态连接器)代码。 r13保留作为系统线程ID。 r14-r31 作为本地变量,非易失性。 专用寄存器的用途: lr链接寄存器,它用来存放函数调用结束处的返回地址。 ctr计数寄存器,它用来当作循环计数器,会随特定转移操作而递减。 xer定点异常寄存器,存放整数运算操作的进位以及溢出信息。 msr机器状态寄存器,用来配置微处理器的设定。 cr条件寄存器,它分成8个4位字段,cr0-cr7,它反映了某个算法操作的结果并且提供条件分支的机制。 寄存器r1、r14-r31是非易失性的,这意味着它们的值在函数调用过程保持不变。寄存器r2也算非易失性,但是只有在调用函数在调用后必须恢复它的值时才被处理。

(完整word版)汇编语言常用指令大全,推荐文档

MOV指令为双操作数指令,两个操作数中必须有一个是寄存器. MOV DST , SRC // Byte / Word 执行操作: dst = src 1.目的数可以是通用寄存器, 存储单元和段寄存器(但不允许用CS段寄存器). 2.立即数不能直接送段寄存器 3.不允许在两个存储单元直接传送数据 4.不允许在两个段寄存器间直接传送信息 PUSH入栈指令及POP出栈指令: 堆栈操作是以“后进先出”的方式进行数据操作. PUSH SRC //Word 入栈的操作数除不允许用立即数外,可以为通用寄存器,段寄存器(全部)和存储器. 入栈时高位字节先入栈,低位字节后入栈. POP DST //Word 出栈操作数除不允许用立即数和CS段寄存器外, 可以为通用寄存器,段寄存器和存储器. 执行POP SS指令后,堆栈区在存储区的位置要改变. 执行POP SP 指令后,栈顶的位置要改变. XCHG(eXCHanG)交换指令: 将两操作数值交换. XCHG OPR1, OPR2 //Byte/Word 执行操作: Tmp=OPR1 OPR1=OPR2 OPR2=Tmp 1.必须有一个操作数是在寄存器中 2.不能与段寄存器交换数据 3.存储器与存储器之间不能交换数据. XLAT(TRANSLATE)换码指令: 把一种代码转换为另一种代码. XLAT (OPR 可选) //Byte 执行操作: AL=(BX+AL) 指令执行时只使用预先已存入BX中的表格首地址,执行后,AL中内容则是所要转换的代码. LEA(Load Effective Address) 有效地址传送寄存器指令 LEA REG , SRC //指令把源操作数SRC的有效地址送到指定的寄存器中. 执行操作: REG = EAsrc 注: SRC只能是各种寻址方式的存储器操作数,REG只能是16位寄存器 MOV BX , OFFSET OPER_ONE 等价于LEA BX , OPER_ONE MOV SP , [BX] //将BX间接寻址的相继的二个存储单元的内容送入SP中 LEA SP , [BX] //将BX的内容作为存储器有效地址送入SP中 LDS(Load DS with pointer)指针送寄存器和DS指令 LDS REG , SRC //常指定SI寄存器。 执行操作: REG=(SRC), DS=(SRC+2) //将SRC指出的前二个存储单元的内容送入指令中指定的寄存器中,后二个存储单元送入DS段寄存器中。

汇编语言入门

汇编语言入门教程 对初学者而言,汇编的许多命令太复杂,往往学习很长时间也写不出一个漂漂亮亮的程序,以致妨碍了我们学习汇编的兴趣,不少人就此放弃。所以我个人看法学汇编,不一定要写程序,写程序确实不是汇编的强项,大家不妨玩玩DEBUG,有时CRACK出一个小软件比完成一个程序更有成就感(就像学电脑先玩游戏一样)。某些高深的指令事实上只对有经验的汇编程序员有用,对我们而言,太过高深了。为了使学习汇编语言有个好的开始,你必须要先排除那些华丽复杂的命令,将注意力集中在最重要的几个指令上(CMP LOOP MOV JNZ……)。但是想在啰里吧嗦的教科书中完成上述目标,谈何容易,所以本人整理了这篇超浓缩(用WINZIP、WINRAR…依次压迫,嘿嘿!)教程。大言不惭的说,看通本文,你完全可以“不经意”间在前辈或是后生卖弄一下DEBUG,很有成就感的,试试看!那么――这个接下来呢?――Here we go!(阅读时看不懂不要紧,下文必有分解) 因为汇编是通过CPU和内存跟硬件对话的,所以我们不得不先了解一下CPU和内存:(关于数的进制问题在此不提) CPU是可以执行电脑所有算术╱逻辑运算与基本I/O 控制功能的一块芯片。一种汇编语言只能用于特定的CPU。也就是说,不同的CPU其汇编语言的指令语法亦不相同。个人电脑由1981年推出至今,其CPU发展过程为:8086→80286→80386→80486→PENTIUM →……,还有AMD、CYRIX等旁支。后面兼容前面CPU的功能,只不过多了些指令(如多能奔腾的MMX指令集)、增大了寄存器(如386的32位EAX)、增多了寄存器(如486的FS)。为确保汇编程序可以适用于各种机型,所以推荐使用8086汇编语言,其兼容性最佳。本文所提均为8086汇编语言。寄存器(Register)是CPU内部的元件,所以在寄存器之间的数据传送非常快。用途:1.可将寄存器内的数据执行算术及逻辑运算。2.存于寄存器内的地址可用来指向内存的某个位置,即寻址。3.可以用来读写数据到电脑的周边设备。8086 有8个8位数据寄存器,这些8位寄存器可分别组成16位寄存器:AH&AL=AX:累加寄存器,常用于运算;BH&BL=BX:基址寄存器,常用于地址索引;CH&CL=CX:计数寄存器,常用于计数;DH&DL=DX:数据寄存器,常用于数据传递。为了运用所有的内存空间,8086设定了四个段寄存器,专门用来保存段地址:CS(Code Segment):代码段寄存器;DS(Data Segment):数据段寄存器;SS(Stack Segment):堆栈段寄存器;ES(Extra Segment):附加段寄存器。当一个程序要执行时,就要决定程序代码、数据和堆栈各要用到内存的哪些位置,通过设定段寄存器CS,DS,SS 来指向这些起始位置。通常是将DS固定,而根据需要修改CS。所以,程序可以在可寻址空间小于64K的情况下被写成任意大小。所以,程序和其数据组合起来的大小,限制在DS 所指的64K内,这就是COM文件不得大于64K的原因。8086以内存做为战场,用寄存器做为军事基地,以加速工作。除了前面所提的寄存器外,还有一些特殊功能的寄存器:IP(Intruction Pointer):指令指针寄存器,与CS配合使用,可跟踪程序的执行过程;SP(Stack Pointer):堆栈指针,与SS配合使用,可指向目前的堆栈位置。BP(Base Pointer):基址指针寄存器,可用作SS 的一个相对基址位置;SI(Source Index):源变址寄存器可用来存放相对于DS段之源变址指针;DI(Destination Index):目的变址寄存器,可用来存放相对于ES 段之目的变址指针。还有一个标志寄存器FR(Flag Register),有九个有意义的标志,将在下文用到时详细说明。 内存是电脑运作中的关键部分,也是电脑在工作中储存信息的地方。内存组织有许多可存放

x86汇编指令集

x86汇编指令集 数据传输指令它们在存贮器和寄存器、寄存器和输入输出端口之间传送数据. 1. 通用数据传送指令. MOV 传送字或字节. MOVSX 先符号扩展,再传送. MOVZX 先零扩展,再传送. MOVSX reg16,r/m8 ; o16 0F BE /r [386] MOVSX reg32,r/m8 ; o32 0F BE /r [386] MOVSX reg32,r/m16 ; o32 0F BF /r [386] MOVZX reg16,r/m8 ; o16 0F B6 /r [386] MOVZX reg32,r/m8 ; o32 0F B6 /r [386] MOVZX reg32,r/m16 ; o32 0F B7 /r [386] 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.

汇编语言知识大全

第一章基础知识: 一.机器码:1.计算机只认识0,1两种状态。而机器码只能由0,1组成。故机器码相当难认,故产生了汇编语言。 2.其中汇编由三类指令形成:汇编指令(有机器码对应),伪指令,其他符号(编译的时候有用)。 每一总CPU都有自己的指令集;注意学习的侧重点。 二.存储器:1.存储单元中数据和指令没任何差别。 2.存储单元:Eg:128个储存单元(0~127)128byte。 线: 1.地址总线:寻址用,参数(宽度)为N根,则可以寻到2^N个内存单元。 据总线:传送数据用,参数为N根,一次可以传送N/8个存储单元。 3.控制总线:cpu对元器件的控制能力。越多控制力越强。 四.内存地址空间:1.由地址总线决定大小。 2.主板:cpu和核心器件(或接口卡)用地址总线,数据总线,控制总 线连接起来。 3.接口卡:由于cpu不能直接控制外设,需通过接口卡间接控制。

4.各类存储器芯片:RAM,BIOS(主板,各芯片)的ROM,接卡槽的 RAM CPU在操控他们的时候,把他们都当作内存来对待,把他们总的看作一个由 若干个存储单元组成的逻辑存储器,即我们所说的内存地址空间。 自己的一点理解:CPU对内存的操作是一样的,但是在cpu,内存,芯片之间的硬件本身所牵扯的线是不同的。所以一些地址的功能是对应一些芯片的。 第二章寄存器 引入:CPU中含有运算器,寄存器,控制器(由内部总线连接)。而寄存器是可以用来指令读写的部件。8086有14个寄存器(都是16位,2个存储空间)。 一.通用寄存器(ax,bx,cx,dx),16位,可以分为高低位 注意1.范围:16位的2^16-1,8位的2^8-1 2.进行数据传送或运算时要注意位数对应,否则会报错 二.字:1. 1个字==2个字节。 2. 在寄存器中的存储:0x高位字节低位字节;单元认定的是低单元 数制,16进制h,2进制b

(完整word版)汇编语言指令集合-吐血整理,推荐文档

8086/8088指令系统记忆表 数据寄存器分为: AH&AL=AX(accumulator):累加寄存器,常用于运算;在乘除等指令中指定用来存放操作数,另外,所有的I/O指令都使用这一寄存器与外界设备传送数据. BH&BL=BX(base):基址寄存器,常用于地址索引; CH&CL=CX(count):计数寄存器,常用于计数;常用于保存计算值,如在移位指令,循环(loop)和串处理指令中用作隐含的计数器. DH&DL=DX(data):数据寄存器,常用于数据传递。他们的特点是,这4个16位的寄存器可以分为高8位: AH, BH, CH, DH.以及低八位:AL,BL,CL,DL。这2组8位寄存器可以分别寻址,并单独使用。 另一组是指针寄存器和变址寄存器,包括: SP(Stack Pointer):堆栈指针,与SS配合使用,可指向目前的堆栈位置; BP(Base Pointer):基址指针寄存器,可用作SS的一个相对基址位置; SI(Source Index):源变址寄存器可用来存放相对于DS段之源变址指针; DI(Destination Index):目的变址寄存器,可用来存放相对于ES 段之目的变址指针。 指令指针IP(Instruction Pointer) 标志寄存器FR(Flag Register) OF(overflow flag) DF(direction flag) CF(carrier flag) PF(parity flag) AF(auxiliary flag) ZF(zero flag) SF(sign flag) IF(interrupt flag) TF(trap flag) 段寄存器(Segment Register) 为了运用所有的内存空间,8086设定了四个段寄存器,专门用来保存段地址: CS(Code Segment):代码段寄存器; DS(Data Segment):数据段寄存器; SS(Stack Segment):堆栈段寄存器;

51单片机汇编指令集(附记忆方法)

51单片机汇编指令集 一、数据传送类指令(7种助记符) MOV(英文为Move):对内部数据寄存器RAM和特殊功能寄存器SFR的数据进行传送; MOVC(Move Code)读取程序存储器数据表格的数据传送; MOVX (Move External RAM) 对外部RAM的数据传送; XCH (Exchange) 字节交换; XCHD (Exchange low-order Digit) 低半字节交换; PUSH (Push onto Stack) 入栈; POP (Pop from Stack) 出栈; 二、算术运算类指令(8种助记符) ADD(Addition) 加法; ADDC(Add with Carry) 带进位加法; SUBB(Subtract with Borrow) 带借位减法; DA(Decimal Adjust) 十进制调整; INC(Increment) 加1; DEC(Decrement) 减1; MUL(Multiplication、Multiply) 乘法; DIV(Division、Divide) 除法; 三、逻辑运算类指令(10种助记符) ANL(AND Logic) 逻辑与; ORL(OR Logic) 逻辑或; XRL(Exclusive-OR Logic) 逻辑异或; CLR(Clear) 清零; CPL(Complement) 取反; RL(Rotate left) 循环左移; RLC(Rotate Left throught the Carry flag) 带进位循环左移; RR(Rotate Right) 循环右移; RRC (Rotate Right throught the Carry flag) 带进位循环右移; SWAP (Swap) 低4位与高4位交换; 四、控制转移类指令(17种助记符) ACALL(Absolute subroutine Call)子程序绝对调用; LCALL(Long subroutine Call)子程序长调用; RET(Return from subroutine)子程序返回; RETI(Return from Interruption)中断返回; SJMP(Short Jump)短转移; AJMP(Absolute Jump)绝对转移; LJMP(Long Jump)长转移; CJNE (Compare Jump if Not Equal)比较不相等则转移;

汇编语言指令表

汇编语言指令表文档编制序号:[KKIDT-LLE0828-LLETD298-POI08]

伪指令 1、定位伪指令 ORG m 2、定义字节伪指令 DB X1,X2,X3,…,Xn 3、字定义伪指令 DW Y1,Y2,Y3,…,Yn 4、汇编结束伪指令 END 寻址方式 MCS-51单片机有五种寻址方式: 1、寄存器寻址 2、寄存器间接寻址 3、直接寻址 4、立即数寻址 5、基寄存器加变址寄存器间接寻址 6、相对寻址 7、位寻址 数据传送指令 一、以累加器A为目的操作数的指令(4条) MOV A,Rn ;(Rn)→A n=0~7 MOV A,direct ;( direct )→A MOV A,@Ri ;((Ri))→A i=0~1 MOV A,#data ; data →A 二、以Rn为目的操作数的指令(3条) MOV Rn ,A;(A)→ Rn MOV Rn ,direct;( direct )→ Rn MOV Rn ,#data; data → Rn 三、以直接寻址的单元为目的操作数的指令(5条) MOV direct,A;(A)→direct MOV direct,Rn;(Rn)→direct MOV direct,direct ;(源direct)→目的direct MOV direct,@Ri;((Ri))→direct MOV direct,#data; data→direct 四、以寄存器间接寻址的单元为目的操作数的指令(3条) MOV @Ri,A;(A)→(Ri) MOV @Ri,direct;(direct)→(Ri) MOV @Ri,#data; data→(Ri) 五、十六位数据传送指令(1条) MOV DPTR,#data16;dataH→DPH,dataL →DPL

8086汇编指令手册

8086汇编指令手册 一、数据传输指令 它们在存贮器和寄存器、寄存器和输入输出端口之间传送数据. 1. 通用数据传送指令. MOV 传送字或字节. MOVSX 先符号扩展,再传送. MOVZX 先零扩展,再传送. 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内容装入标志寄存器.

STM 常用汇编指令

在嵌入式开发中,汇编程序常常用于非常关键的地方,比如系统启动时初始化,进出中断时的环境保护,恢复等对性能有要求的地方。 ARM指令集可以分为六大类,分别为数据处理指令、Load/Store指令、跳转指令、程序状态寄存器处理指令、协处理器指令和异常产生指令。 ARM指令使用的基本格式如下: 〈opcode〉{〈cond〉}{S}〈Rd〉,〈Rn〉{,〈operand2〉} opcode操作码;指令助记符,如LDR、STR等。 cond可选的条件码;执行条件,如EQ、NE等。 S可选后缀;若指定“S”,则根据指令执行结果更新CPSR中的条件码。 Rd目标寄存器。 Rn存放第1操作数的寄存器。 operand2第2个操作数 arm的寻址方式如下: 立即寻址 寄存器寻址 寄存器间接寻址 基址加偏址寻址 堆栈寻址 块拷贝寻址 相对寻址 这里不作详细描述,可以查阅相关文档。 数据处理指令 Load/Store指令 程序状态寄存器与通用寄存器之间的传送指令 转移指令 异常中断指令 协处理器指令 在S3C2410、S3C2440的数据手册中对各种汇编指令有详细的描述;这里只对较常见的作写介绍。 1、相对跳转指令:b、bl 这两条指令的不同之处在于bl指令除了跳转之外,还将返回地址(bl的下一条指令的地址)保存在lr寄存器中。 这两条指令的可跳转范围是当前指令前后32M。 b funa .... funa: b funb ....

funb: .... 2、数据传送指令mov,地址读取伪指令ldr mov指令可以把一个寄存器的值赋给另外一个寄存器,或者把一个常数赋给寄存器。 mov r1,r2 mov r1,#1024 mov传送的常数必须能用立即数来表示。当不能用立即数表示时,可以用ldr命令来赋值。ldr是伪命令,不是真实存在的指令,编译器会把它扩展成真正的指令;如果该常数能用“立即数”来表示,则使用mov指令,否则编译时将该常数保存在某个位置,使用内存读取指令把它读出来。 ldr r1,=1024 3、内存访问指令ldr、str、ldm、stm ldr既可以指低至读取伪指令,也可以是内存访问指令。当他的第二个参数前面有'='时标伪指令,否则表内存访问指令。 ldr指令从内存中读取数据到寄存器,str指令把寄存器的指存储到内存中,他们的操作数都是32位的。 ldr r1,[r2,#4] ldr r1,[r2] ldr r1,[r2],#4 str r1,[r2,#4] str r1,[r2] str r1,[r2],#4 寄存器传送指令可以用一条指令将16个可见寄存器(R0~R15)的任意子集合(或全部)存储到存储器或从存储器中读取数据到该寄存器集合中。与单寄存器存取指令相比,多寄存器数据存取可用的寻址模式更加有限。多寄存器存取指令的汇编格式如下: LDM/STM{}Rn{!}, 4、加减指令add、sub add r1,r2,#1 sub r1,r2,#1 5、程序状态寄存器的访问指令msr,mrs ARM指令中有两条指令,用于在状态寄存器和通用寄存器之间传送数据。修改状态寄存器一般是通过“读取-修改-写回”三个步骤的操作来实现的。这两条指令分别是: 状态寄存器到通用寄存器的传送指令(MRS) 通用寄存器到状态寄存器的传送指令(MSR) 其汇编格式如下: MRS{}Rd,CPSR|SPSR 其汇编格式如下:

单片机汇编语言指令集

汇编语言的所有指令数据传送指令集 MOV 功能: 把源操作数送给目的操作数 语法: MOV 目的操作数,源操作数 格式: MOV r1,r2 MOV r,m MOV m,r MOV r,data XCHG 功能: 交换两个操作数的数据 语法: XCHG 格式: XCHG r1,r2 XCHG m,r XCHG r,m PUSH,POP 功能: 把操作数压入或取出堆栈 语法: PUSH 操作数POP 操作数 格式: PUSH r PUSH M PUSH data POP r POP m PUSHF,POPF,PUSHA,POPA 功能: 堆栈指令群 格式: PUSHF POPF PUSHA POPA LEA,LDS,LES 功能: 取地址至寄存器 语法: LEA r,m LDS r,m LES r,m XLAT(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,O SUB,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,O

INC,DEC 功能: 把OP的值加一或减一 语法: INC OP DEC OP 格式: INC r/m DEC r/m 影响标志: P,A,Z,S,O NEG 功能: 将OP的符号反相(取二进制补码) 语法: NEG OP 格式: NEG r/m 影响标志: C,P,A,Z,S,O MUL,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/m CBW,CWD 功能: 有符号数扩展指令 语法: CBW CWD AAA,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

MCS-51汇编语言指令集

MCS-51汇编语言指令集 符号定义表 符号 含义 Rn R0~R7寄存器n=0~7 Direct 直接地址,内部数据区的地址RAM(00H~7FH) SFR(80H~FFH) B,ACC,PSW,IP,P3,IE,P2,SCON,P1,TCON,P0 @Ri 间接地址Ri=R0或R1 8051/31RAM地址(00H~7FH) 8052/32RAM地址(00H~FFH) #data 8位常数 #data16 16位常数 Addr16 16位的目标地址 Addr11 11位的目标地址 Rel 相关地址 bit 内部数据RAM(20H~2FH),特殊功能寄存器的直接地址的位 2指令介绍 指令 字节 周期 动作说明 算数运算指令 1.ADD A,Rn 1 1 将累加器与寄存器的内容相加,结果存回累加器 2.ADD A,direct 2 1 将累加器与直接地址的内容相加,结果存回累加器 3.ADD A,@Ri 1

将累加器与间接地址的内容相加,结果存回累加器4.ADD A,#data 2 1 将累加器与常数相加,结果存回累加器 5.ADDC A,Rn 1 1 将累加器与寄存器的内容及进位C相加,结果存回累加器6.ADDC A,direct 2 1 将累加器与直接地址的内容及进位C相加,结果存回累加器7.ADDC A,@Ri 1 1 将累加器与间接地址的内容及进位C相加,结果存回累加器8.ADDC A,#data 2 1 将累加器与常数及进位C相加,结果存回累加器 9.SUBB A,Rn 1 1 将累加器的值减去寄存器的值减借位C,结果存回累加器10.SUBB A,direct 2 1 将累加器的值减直接地址的值减借位C,结果存回累加器11.SUBB A,@Ri 1 1 将累加器的值减间接地址的值减借位C,结果存回累加器12.SUBB A,0data 2 1 将累加器的值减常数值减借位C,结果存回累加器 13.INC A 1 1 将累加器的值加1 14.INC Rn 1

汇编指令大全

ORG 0000H NOP ;空操作指令 AJMP L0003 ;绝对转移指令 L0003: LJMP L0006 ;长调用指令 L0006: RR A ;累加器A内容右移(先置A为88H) INC A ; 累加器A 内容加1 INC 01H ;直接地址(字节01H)内容加1 INC @R0 ; R0的内容(为地址) 的内容即间接RAM加1 ;(设R0=02H,02H=03H,单步执行后02H=04H) INC @R1 ; R1的内容(为地址) 的内容即间接RAM加1 ;(设R1=02H,02H=03H,单步执行后02H=04H) INC R0 ; R0的内容加1 (设R0为00H,单步执行后查R0内容为多少) INC R1 ; R1的内容加1(设R1为01H,单步执行后查R1内容为多少) INC R2 ; R2的内容加1 (设R2为02H,单步执行后查R2内容为多少) INC R3 ; R3的内容加1(设R3为03H,单步执行后查R3内容为多少) INC R4 ; R4的内容加1(设R4为04H,单步执行后查R4内容为多少) INC R5 ; R5的内容加1(设R5为05H,单步执行后查R5内容为多少) INC R6 ; R6的内容加1(设R6为06H,单步执行后查R6内容为多少) INC R7 ; R7的内容加1(设R7为07H,单步执行后查R7内容为多少) JBC 20H,L0017; 如果位(如20H,即24H的0位)为1,则转移并清0该位L0017: ACALL S0019 ;绝对调用 S0019: LCALL S001C ;长调用 S001C: RRC A ;累加器A的内容带进位位右移(设A=11H,C=0 ;单步执行后查A和C内容为多少) DEC A ;A的内容减1 DEC 01H ;直接地址(01H)内容减1 DEC @R0 ;R0间址减1,即R0的内容为地址,该地址的内容减1 DEC @R1 ; R1间址减1 DEC R0 ; R0内容减1 DEC R1 ; R1内容减1 DEC R2 ; R2内容减1 DEC R3 ; R3内容减1 DEC R4 ; R4内容减1 DEC R5 ; R5内容减1 DEC R6 ; R6内容减1 DEC R7 ; R7内容减1 JB 20H,L002D;如果位(20H,即24H的0位)为1则转移 L002D: AJMP L0017 ;绝对转移 RET ;子程序返回指令 RL A ;A左移 ADD A,#01H ;A的内容与立即数(01H)相加 ADD A,01H ; A的内容与直接地址(01H内容)相加 ADD A,@R0 ; A的内容与寄存器R0的间址内容相加 ADD A,@R1 ; A的内容与寄存器R1的间址内容相加

一些常用的汇编语言指令

汇编语言常用指令 大家在做免杀或者破解软件的时候经常要用到汇编指令,本人整理出了常用的 希望对大家有帮助! 数据传送指令 MOV:寄存器之间传送注意,源和目的不能同时是段寄存器;代码段寄存器CS不能作为目的;指令指针IP不能作为源和目的。立即数不能直接传送段寄存器。源和目的操作数类型要一致;除了串操作指令外,源和目的不能同时是存储器操作数。 XCHG交换指令:操作数可以是通用寄存器和存储单元,但不包括段寄存器,也不能同时是存储单元,还不能有立即数。 LEA 16位寄存器存储器操作数传送有效地址指令:必须是一个16位寄存器和存储器操作数。 LDS 16位寄存器存储器操作数传送存储器操作数32位地址,它的16位偏移地址送16位寄存器,16位段基值送入DS中。 LES :同上,只是16位段基址送ES中。 堆栈操作指令 PUSH 操作数,操作数不能使用立即数, POP 操作数,操作数不能是CS和立即数 标志操作指令 LAHF:把标志寄存器低8位,符号SF,零ZF,辅助进位AF,奇偶PF,进位CF传送到AH 指定的位。不影响标志位。 SAHF:与上相反,把AH中的标志位传送回标志寄存器。 PUSHF:把标志寄存器内容压入栈顶。 POPF:把栈顶的一个字节传送到标志寄存器中。 CLC:进位位清零。 STC:进位位为1。 CMC:进位位取反。 CLD:使方向标志DF为零,在执行串操作中,使地址按递增方式变化。 STD:DF为1。 CLI:清中断允许标志IF。Cpu不相应来自外部装置的可屏蔽中断。 STI:IF为1。 加减运算指令

注意:对于此类运算只有通用寄存器和存储单元可以存放运算结果。如果参与运算的操作数有两个,最多只能有一个存储器操作数并且它们的类型必须一致。 ADD。 ADC:把进位CF中的数值加上去。 INC:加1指令 SUB。 SBB:把进位CF中数值减去。 DEC:减1指令。 NEG 操作数:取补指令,即用0减去操作数再送回操作数。 CMP:比较指令,完成操作数1减去操作数2,结果不送操作数1,但影响标志位。可根据ZF(零)是否被置1判断相等;如果两者是无符号数,可根据CF判断大小;如果两者是有符号数,要根据SF和OF判断大小。 乘除运算指令 MUL 操作数:无符号数乘法指令。操作数不能是立即数。操作数是字节与AL中的无符号数相乘,16位结果送AX中。若字节,则与AX乘,结果高16送DX,低16送AX。如乘积高半部分不为零,则CF、OF为1,否则为0。所以CF和OF表示AH或DX中含有结果的有效数。IMUL 操作数:有符号数乘法指令。基本与MUL相同。 DIV 操作数:被除数是在AX(除数8位)或者DX和AX(除数16位),操作数不能是立即数。如果除数是0,或者在8(16)位除数时商超过8(16)位,则认为是溢出,引起0号中断。IDIV:有符号除法指令,当除数为0,活着商太大,太小(字节超过127,-127字超过32767,-32767)时,引起0号中断。 符号扩展指令 CBW,CWD:把AL中的符号扩展到寄存器AH中,不影响各标志位。CWD则把AX中的符号扩展到DX,同样不影响标志位。注意:在无符号数除之前,不宜用这两条指令,一般采用XOR 清高8位或高16位。 逻辑运算指令与位移指令 注意:只能有一个存储器操作数;只有通用寄存器或存储器操作数可作为目的操作数,用于存放结果;操作数的类型必须一致。 NOT:取反,不影响标志位。 AND 操作数1 操作数2:操作结果送错作数1,标志CF(进位)、OF(溢出)清0,PF(奇偶)ZF(0标志) SF(符号)反映运算结果,AF(辅助进位)未定义。自己与自己AND值不变,她主要用于将操作数中与1相与的位保持不变,与0相与清0。(都为1时为1)OR 操作数1 操作数2:自己与自己OR值不变,CF(进位)、OF(溢出)清0,PF(奇偶)ZF(0标志)SF(符号)反映运算结果,AF(辅助进位)未定义。她使用于将若干位置1:

PIC8位单片机汇编语言常用指令的识读

PIC8位单片机汇编语言常用指令的识读(上) 各大类单片机的指令系统是没有通用性的,它是由单片机生产厂家规定的,所以用户必须遵循厂家规定的标准,才能达到应用单片机的目的。 PIC 8位单片机共有三个级别,有相对应的指令集。基本级PIC系列芯片共有指令33条,每条指令是12位字长;中级PIC系列芯片共有指令35条,每条指令是14位字长;高级PIC 系列芯片共有指令58条,每条指令是16位字长。其指令向下兼容。 在这里笔者介绍PIC 8位单片机汇编语言指令的组成及指令中符号的功能,以供初学者阅读相关书籍和资料时快速入门。 一、PIC汇编语言指令格式 PIC系列微控制器汇编语言指令与MCS-51系列单片机汇编语言一样,每条汇编语言指令由4个部分组成,其书写格式如下: 标号操作码助记符操作数1,操作数2;注释 指令格式说明如下:指令的4个部分之间由空格作隔离符,空格可以是1格或多格,以保证交叉汇编时,PC机能识别指令。 1 标号与MCS-51系列单片机功能相同,标号代表指令的符号地址。在程序汇编时,已赋以指令存储器地址的具体数值。汇编语言中采用符号地址(即标号)是便于查看、修改,尤其是便于指令转移地址的表示。标号是指令格式中的可选项,只有在被其它语句引用时才需派上标号。在无标号的情况下,指令助记符前面必须保留一个或一个以上的空格再写指令助记符。指令助记符不能占用标号的位置,否则该助记符会被汇编程序作标号误处理。 书写标号时,规定第一字符必须是字母或半角下划线“—”,它后面可以跟英文和数字字符、冒号(:)制符表等,并可任意组合。再有标号不能用操作码助记符和寄存器的代号表示。标号也可以单独占一行。 2 操作码助记符该字段是指令的必选项。该项可以是指令助记符,也可以由伪指令及宏命令组成,其作用是在交叉汇编时,“指令操作码助记符”与“操作码表”进行逐一比较,找出其相应的机器码一一代之。 3 操作数由操作数的数据值或以符号表示的数据或地址值组成。若操作数有两个,则两个操作数之间用逗号(,)分开。当操作数是常数时,常数可以是二进制、八进制、十进制或十六进制数。还可以是被定义过的标号、字符串和ASCⅡ码等。具体表示时,规定在二进制数前冠以字母“B”,例如B10011100;八进制数前冠以字母“O”,例如O257;十进制数前冠以字母“D”,例如D122;十六进制数前冠以“H”,例如H2F。在这里PIC 8位单片机默认进制是十六进制,在十六进制数之前加上Ox,如H2F可以写成Ox2F。 指令的操作数项也是可选项。 PIC系列与MCS-51系列8位单片机一样,存在寻址方法,即操作数的来源或去向问题。因PIC系列微控制器采用了精简指令集(RISC)结构体系,其寻址方式和指令都既少而又简单。其寻址方式根据操作数来源的不同,可分为立即数寻址、直接寻址、寄存器间接寻址和位寻址四种。所以PIC系列单片机指令中的操作数常常出现有关寄存器符号。有关的寻址实例,均可在本文的后面找到。 4 注释用来对程序作些说明,便于人们阅读程序。注释开始之前用分号(;)与其它部分相隔。当汇编程序检测到分号时,其后面的字符不再处理。值得注意:在用到子程序时应说明程序的入口条件、出口条件以及该程序应完成的功能和作用。 二、清零指令(共4条) 1 寄存器清零指令 实例:CLRW;寄存器W被清零 说明:该条指令很简单,其中W为PIC单片机的工作寄存器,相当于MCS-51系列单片机中的累加器A,CLR是英语Clear的缩写字母。 2 看门狗定时器清零指令。 实例:CLRWDT;看门狗定时器清零(若已赋值,同时清预分频器)

汇编语言手册

寄存器与存储器 1. 寄存器功能 . 寄存器的一般用途和专用用途 . CS:IP 控制程序执行流程 . SS:SP 提供堆栈栈顶单元地址 . DS:BX(SI,DI) 提供数据段内单元地址 . SS:BP 提供堆栈内单元地址 . ES:BX(SI,DI) 提供附加段内单元地址 . AX,CX,BX和CX寄存器多用于运算和暂存中间计算结果,但又专用于某些指令(查阅指令表)。. PSW程序状态字寄存器只能通过专用指令(LAHF, SAHF)和堆栈(PUSHF,POPF)进行存取。 2. 存储器分段管理 . 解决了16位寄存器构成20位地址的问题 . 便于程序重定位 . 20位物理地址=段地址* 16 + 偏移地址 . 程序分段组织: 一般由代码段,堆栈段,数据段和附加段组成,不设置堆栈段时则使用系统内部的堆栈。 3. 堆栈 . 堆栈是一种先进后出的数据结构, 数据的存取在栈顶进行, 数据入栈使堆栈向地址减小的方向扩展。 . 堆栈常用于保存子程序调用和中断响应时的断点以及暂存数据或中间计算结果。 .堆栈总是以字为单位存取 指令系统与寻址方式 1. 指令系统 . 计算机提供给用户使用的机器指令集称为指令系统,大多数指令为双操作数指令。执行指令后,一般源操作数不变,目的操作数被计算结果替代。 . 机器指令由CPU执行,完成某种运算或操作,8086/8088指令系统中的指令分为6类: 数据传送,算术运算,逻辑运算,串操作,控制转移和处理机控制。 2. 寻址方式 . 寻址方式确定执行指令时获得操作数地址的方法 . 分为与数据有关的寻址方式(7种)和与转移地址有关的寻址方式(4)种。 . 与数据有关的寻址方式的一般用途: (1) 立即数寻址方式--将常量赋给寄存器或存储单元 (2) 直接寻址方式--存取单个变量 (3) 寄存器寻址方式--访问寄存器的速度快于访问存储单元的速度 (4) 寄存器间接寻址方式--访问数组元素 (5) 变址寻址方式 (6) 基址变址寻址方式 (7) 相对基址变址寻址方式(5),(6),(7)都便于处理数组元素 . 与数据有关的寻址方式中,提供地址的寄存器只能是BX,SI,DI或BP . 与转移地址有关的寻址方式的一般用途: (1) 段内直接寻址--段内直接转移或子程序调用 (2) 段内间接寻址--段内间接转移或子程序调用

相关文档
最新文档