汇编通用指令集(含分析)

汇编通用指令集(含分析)
汇编通用指令集(含分析)

指令格式(16进制)机器码(2进制)机器码

ADD r/m8,r8 00 /r 00 000 0 0 0 oorrrmmm ADD r/m32,r32 01 /r 00 000 0 0 1 oorrrmmm ADD r/m16,r16 01 /r 00 000 0 0 1 oorrrmmm ADD r8,r/m8 02 /r 00 000 0 1 0 oorrrmmm ADD r16,r/m16 03 /r 00 000 0 1 1 oorrrmmm ADD r32,r/m32 03 /r 00 000 0 1 1 oorrrmmm 前6位全为0

ADD AL, imm8 04 ib 00 000 1 0 0 ib

ADD EAX, imm32 05 id 00 000 1 0 1 id

ADD AX, imm16 05 iw 00 000 1 0 1 iw

前5位为0,第6,7位为10???第6位为0有MOD域

PUSH ES 06 00 000 1 1 0

POP ES 07 00 000 1 1 1

前5位为0,第6,7位为11

OR r/m8,r8 08 /r 00 001 000 oorrrmmm OR r/m16,r16 09 /r 00 001 001 oorrrmmm OR r/m32,r32 09 /r 00 001 001 oorrrmmm OR r8,r/m8 0A /r 00 001 010 oorrrmmm OR r16,r/m16 0B /r 00 001 011 oorrrmmm

OR r32,r/m32 0B /r 00 001 011 oorrrmmm 前4位为0,第5,6位为10

OR AL, imm8 0C ib 00 001 1 0 0 ib

OR EAX, imm32 0D id 00 001 1 0 1 id

OR AX, imm16 0D iw 00 001 1 0 1 iw

前4位为0,第5,6位为11

PUSH CS 0E 00 001 1 1 0

这里没有0F 0F是以后用于扩展00 001 1 1 1

ADC r/m8,r8 10 /r 00 010 0 0 0 oorrrmmm ADC r/m32,r32 11 / r 00 010 0 0 1 oorrrmmm ADC r/m16,r16 11 /r 00 010 0 0 1 oorrrmmm ADC r8,r/m8 12 /r 00 010 0 1 0 oorrrmmm ADC r16,r/m16 13 /r 00 010 0 1 1 oorrrmmm ADC r32,r/m32 13 /r 00 010 0 1 1 oorrrmmm 前5位为00010,6、7位为01

ADC AL, imm8 14 ib 00 010 100 ib

ADC EAX, imm32 15 id 00 010 101 id

ADC AX, imm16 15 iw 00 010 101 iw

前5位为00010,6、7位为10

PUSH SS 16 00 010 1 1 0

POP SS 17 00 010 1 1 1

前5位为00010,6、7位为11

SBB r/m8,r8 18 /r 00 011 000 oorrrmmm SBB r/m32,r32 19 / r 00 011 001 oorrrmmm SBB r/m16,r16 19 /r 00 011 001 oorrrmmm SBB r8,r/m8 1A /r 00 011 010 oorrrmmm SBB r16,r/m16 1B /r 00 011 011 oorrrmmm SBB r32,r/m32 1B /r 00 011 011 oorrrmmm 前5位为00011,6位为0

SBB AL, imm8 1C ib 00 011 100 ib

SBB EAX, imm32 1D id 00 011 101 id

SBB AX, imm16 1D iw 00 011 101 iw

前5位为00011,6位为1

PUSH DS 1E 00 011 1 10

POP DS 1F 00 011 1 11

前5位为00011,6、7位为11

AND r/m8,r8 20 /r 00 100 000 oorrrmmm AND r/m16,r16 21 /r 00 100 001 oorrrmmm AND r/m32,r32 21 /r 00 100 001 oorrrmmm AND r8,r/m8 22 /r 00 100 010 oorrrmmm

AND r16,r/m16 23 /r 00 100 011 oorrrmmm AND r32,r/m32 23 /r 00 100 011 oorrrmmm 前5位为00100,6位为0

AND AL, imm8 24 ib 00 100 100 ib

AND EAX, imm32 25 id 00 100 101 id

AND AX, imm16 25 iw 00 100 101 iw

前5位为00100,6位为1

ES前缀26 00 100 110

00 100 111 把al调为DAA 27

前5位为00100,6位为1,后两位为11

SUB r/m8,r8 28 /r 00 101 000 oorrrmmm SUB r/m32,r32 29 / r 00 101 001 oorrrmmm SUB r/m16,r16 29 /r 00 101 001 oorrrmmm SUB r8,r/m8 2A /r 00 101 010 oorrrmmm

SUB r16,r/m16 2B /r 00 101 011 oorrrmmm SUB r32,r/m32 2B /r 00 101 011 oorrrmmm 前5位为00101,6位为 0

SUB AL, imm8 2C ib 00 101 100 ib

SUB EAX, imm32 2D id 00 101 101 id

SUB AX, imm16 2D iw 00 101 101 iw

前5位为00101,6位为1

CS前缀2E 00 101 110

DAS 2F 00 101 111

前5位为00101,6位为1,后两位为11

XOR r/m8,r8 30/r 00 110 000 oorrrmmm XOR r/m16,r16 31/r 00 110 001 oorrrmmm XOR r/m32,r32 31/r 00 110 001 oorrrmmm XOR r8,r/m8 32/r 00 110 010 oorrrmmm XOR r16,r/m16 33/r 00 110 011 oorrrmmm XOR r32,r/m32 33/r 00 110 011 oorrrmmm 前5位为00110,6位为 0

XOR AL,imm8 34 ib 00 110 100 ib

XOR EAX,imm32 35 id 00 110 101 id

XOR AX,imm16 35 iw 00 110 101 iw

前5位为00110,6位为 1

SS前缀36 00 110 110

AAA 37 00 110 111

前5位为00110,6位为1,后两位为11

CMP r/m8,r8 38 /r 00 111 000 oorrrmmm CMP r/m32,r32 39 /r 00 111 001 oorrrmmm CMP r/m16,r16 39 /r 00 111 001 oorrrmmm CMP r8,r/m8 3A /r 00 111 010 oorrrmmm CMP r16,r/m16 3B /r 00 111 011 oorrrmmm CMP r32,r/m32 3B /r 00 111 011 oorrrmmm 前5位为00111,6位为0

CMP AL, imm8 3C ib 00 111 100 ib

CMP EAX, imm32 3D id 00 111 101 id

CMP AX, imm16 3D iw 00 111 101 iw

前5位为00111,6位为1

DS前缀3E 00 111 110

AAS 3F 00 111 111

以上为0-3开头的操作码,按2-3-1-1-1拆分,第六位定有无mod 域,为0有MOD域,3、4、5位决定功能(表1),为1无MOD域,看第7位,为1则看(表2),为0看(表1);(表1)第8位定

操作数长度(表2)第8位定操作;

经典呀!!

INC r32 40+rd 01 0 00 000 +rd

INC r16 40+rw 01 0 00 000 +rw

DEC r32 48 +rd 01 0 01 000 +rd

DEC r16 48 +rw 01 0 01 000 +rw

前4位为0100后三位为000,第5位为0位为INC,为1为DEC PUSH r32 50+rd 01 0 10 000+rd

PUSH r64 50+rd 01 0 10 000+rd

PUSH r16 50+rw 01 0 10 000+rw

前4位为0101,第5位为0,后3为000

POP r32 58+rd 01 0 11 000+rd

POP r64 58+rd 01 0 11 000+rd

POP r16 58+rw 01 0 11 000+rw

由第3位定最后三位是否为寄存器,4、5位定4种操作;按2-1-2-3拆分最规整中间两位定操作,最后3为定寄存器

000是eax ……111是edi

PUSHA 60 01 1 0 0 0 0 0 PUSHAD 60 01 1 0 0 0 0 0

POPA 61 01 1 0 0 0 0 1

POPAD 61 01 1 0 0 0 0 1

前7位为0110000,最后一位为0为PUSHA,为1为POPA

BOUND r16,m16/16 62 /r 01 1 0 0 0 1 0 oorrrmmm BOUND r32,m48/48

这里改成了48

62 /r 01 1 0 0 0 1 0 oorrrmmm

ARPL r/m16,r16 这里改成16了63 /r

01 1 0 0 0 1 1 oorrrmmm

64 FS段超越64 01 1 0 0 1 0 0

65 GS段超越65 01 1 0 0 1 0 1

66 数据宽度66 01 1 0 0 1 1 0

67 地址宽度67 01 1 0 0 1 1 1 PUSH imm16 68 01 1 0 1 0 0 0 PUSH imm32 68 01 1 0 1 0 0 0特殊

IMUL

r32,r/m32,imm32 69 /r id

01 1 0 1 0 0 1 oorrrmmm

id

IMUL

r16,r/m16,imm16 69 /r iw

01 1 0 1 0 0 1 oorrrmmm

iw

PUSH imm8 6A 01 1 0 1 0 1 0 特殊

IMUL

r16,r/m16,imm8 6B /r ib

01 1 0 1 0 1 1 oorrrmmm

ib

IMUL

r32,r/m32,imm8 6B /r ib

01 1 0 1 0 1 1 oorrrmmm

ib

前6位为011010,最后一位为1 ,第7位为0时表示同类寄存器之间,为1表示的为不同类寄存器之间,第七位决定立即数宽度

最后一位为0,表示push立即数,第七位为0表示8位立即数,第七位为1,表示16/32位立即数。就是s位了。

2-1-1-2-1-1

INSB 6C 01 1 0 11 00

INSW 6D 01 1 0 11 01

INSD 6D 01 1 0 11 01

OUTSB 6E 01 1 0 11 10

OUTSW 6F 01 1 0 11 11

OUTSD 6F 01 1 0 11 11

第7位为0时表示INS等,为1时表示OUTS等,第8位为0时表示8位操作,为1时表示16位或32位操作

2-1-1-2-1-1

比较规整

JO rel8 70 cb 01 1 1 0000 cb

JNO rel8 71 cb 01 1 1 0001 cb

JB rel8 72 cb 01 1 1 0010 cb

JAE rel8 73 cb 01 1 1 0011 cb

JE rel8 74 cb 01 1 1 0100 cb

JNE rel8 75 cb 01 1 1 0101 cb

JBE rel8 76 cb 01 1 1 0110 cb

JA rel8 77 cb 01 1 1 0111 cb

JS rel8 78 cb 01 1 1 1000 cb

JNS rel8 79 cb 01 1 1 1001 cb

JP rel8 7A cb 01 1 1 1010 cb

JNP rel8 7B cb 01 1 1 1011 cb

JL rel8 7C cb 01 1 1 1100 cb

JGE rel8 7D cb 01 1 1 1101 cb

JLE rel8 7E cb 01 1 1 1110 cb

JG rel8 7F cb 01 1 1 1111 cb

由第4位定是否有cb,由最后4位定操作码2-1-1-4

解决问题

ADD r/m8, imm8 80 /0 ib 10 00 00 00 oo000mmm ib OR r/m8, imm8 80 /1 ib 10 00 00 00 oo001mmm ib ADC r/m8, imm8 80 /2 ib 10 00 00 00 oo010mmm ib SBB r/m8, imm8 80 /3 ib 10 00 00 00 oo011mmm ib

AND r/m8, imm8 80 /4 ib 10 00 00 00 oo100mmm ib SUB r/m8, imm8 80 /5 ib 10 00 00 00 oo101mmm ib XOR r/m8,imm8 80 /6 ib 10 00 00 00 oo110mmm ib CMP r/m8, imm8 80 /7 ib 10 00 00 00 oo111mmm ib ADD r/m32,imm32 81 /0 id 10 00 00 01 oo000mmm id ADD r/m16,imm16 81 /0 iw 10 00 00 01 oo000mmm iw OR r/m32,imm32 81 /1 id 10 00 00 01 oo001mmm id OR r/m16,imm16 81 /1 iw 10 00 00 01 oo001mmm iw ADC r/m32,imm32 81 /2 id 10 00 00 01 oo010mmm id ADC r/m16,imm16 81 /2 iw 10 00 00 01 oo010mmm iw SBB r/m32,imm32 81 /3 id 10 00 00 01 oo011mmm id SBB r/m16,imm16 81 /3 iw 10 00 00 01 oo011mmm iw AND r/m32,imm32 81 /4 id 10 00 00 01 oo100mmm id AND r/m16,imm16 81 /4 iw 10 00 00 01 oo100mmm iw SUB r/m32,imm32 81 /5 id 10 00 00 01 oo101mmm id SUB r/m16,imm16 81 /5 iw 10 00 00 01 oo101mmm iw XOR r/m32,imm32 81/6 id 10 00 00 01 oo110mmm id XOR r/m16,imm16 81/6 iw 10 00 00 01 oo110mmm iw CMP r/m32,imm32 81 /7 id 10 00 00 01 oo111mmm id

CMP r/m16,imm16 81 /7 iw 10 00 00 01 oo111mmm iw 这里没有82 10 00 00 10 ,没有ADD r/m16,imm8 83 /0 ib 10 00 00 11 oo000mmm ib ADD r/m32,imm8 83 /0 ib 10 00 00 11 oo000mmm ib OR r/m16,imm8 83 /1 ib 10 00 00 11 oo001mmm ib OR r/m32,imm8 83 /1 ib 10 00 00 11 oo001mmm ib ADC r/m16,imm8 83 /2 ib 10 00 00 11 oo010mmm ib ADC r/m32,imm8 83 /2 ib 10 00 00 11 oo010mmm ib SBB r/m16,imm8 83 /3 ib 10 00 00 11 oo011mmm ib SBB r/m32,imm8 83 /3 ib 10 00 00 11 oo011mmm ib AND r/m16,imm8 83 /4 ib 10 00 00 11 oo100mmm ib AND r/m32,imm8 83 /4 ib 10 00 00 11 oo100mmm ib SUB r/m16,imm8 83 /5 ib 10 00 00 11 oo101mmm ib SUB r/m32,imm8 83 /5 ib 10 00 00 11 oo101mmm ib XOR r/m16,imm8 83/6 ib 10 00 00 11 oo110mmm ib XOR r/m32,imm8 83/6 ib 10 00 00 11 oo110mmm ib CMP r/m16,imm8 83 /7 ib 10 00 00 11 oo111mmm ib CMP r/m32,imm8 83 /7 ib 10 00 00 11 oo111mmm ib 前6位为100000,第7位为0表示同类之间操作,为1表示不同类之间操作;第8位为0表示对8位数操作,为1表示对16位或32

位数操作, MOD域中间 3位决定7种操作

按2-2-2-2拆分??????

TEST r/m8,r8 84 /r 10 00 0 1 0 0 oorrrmmm TEST r/m16,r16 85 /r 10 00 0 1 0 1 oorrrmmm

TEST r/m32,r32 85 /r 10 00 0 1 0 1 oorrrmmm 前7位为1000010,第8位定操作数长度

XCHG r/m8, r8 86 /r 10 00 0 1 1 0 oorrrmmm XCHG r/m16, r16 87 /r 10 00 0 1 1 1 oorrrmmm XCHG r/m32, r32 87 /r 10 00 0 1 1 1 oorrrmmm

前7位为1000011,第8位定操作数长度

MOV r/m8,r8 88 /r 10 00 1 0 0 0 oorrrmmm MOV r/m16,r16 89 /r 10 00 1 0 0 1 oorrrmmm MOV r/m32,r32 89 /r 10 00 1 0 0 1 oorrrmmm MOV r8,r/m8 8A /r 10 00 1 0 1 0 oorrrmmm

MOV r16,r/m16 8B /r 10 00 1 0 1 1 oorrrmmm MOV r32,r/m32 8B /r 10 00 1 0 1 1 oorrrmmm MOV r/m16,Sreg 8C /r 10 00 1 1 0 0 ooSSSmmm LEA r16,m(源只能

8D /r 10 00 1 1 0 1 oorrrmmm 是内存)

LEA r32,m 8D /r 10 00 1 1 0 1 oorrrmmm

MOV Sreg,r/m16 8E /r 10 00 1 1 1 0 ooSSSmmm POP r/m32 8F /0 10 00 1 1 1 1 oo000mmm POP r/m16 8F /0 10 00 1 1 1 1 oo000mmm 以上为8开头的操作码,group1 已经单独说明了,剩下的可以按

4-2-1-1(3-3-2)拆分??????

如果前六位10 00 1 1就看最后一位,如果是0,就是(MOV+段寄存器),如果是1,就是LEA或POP

NOP 90 10 01 0 000 特殊XCHG EAX, r32 90+rd 10 01 0 000+rd

XCHG AX, r16 90+rw 10 01 0 000+rw

特殊

CBW 98 10 01 1 000

CWDE 98 10 01 1 000

CWD 99 10 01 1 001

CDQ 99 10 01 1 001

最后一位还是表示不同的操作数,整体表示一种操作方法

CALL far ptr16:16 9A cd 10 01 1 010 cd

CALL far ptr16:32 9A cp 10 01 1 010 cp

WAIT 9B 10 01 1 011

PUSHF 9C 10 01 1 100

PUSHFD 9C 10 01 1 100

POPF 9D 10 01 1 101

POPFD 9D 10 01 1 101

SAHF 9E 10 01 1 110

LAHF 9F 10 01 1 111

前4位为1001,后3位表示不同的操作;按4-1-3拆分;第5位为0和1时有不同的意义

??????

MOV AL,moffs8就是

A0 10 10 0 0 0 0 moffs m8

MOV AX,moffs16 A1 10 10 0 0 0 1 moffs

MOV EAX,moffs32 A1 10 10 0 0 0 1 moffs

MOV moffs8,AL A2 10 10 0 0 1 0 moffs

MOV moffs16,AX A3 10 10 0 0 1 1 moffs MOV moffs32,EAX A3 10 10 0 0 1 1 moffs MOVSB A4 10 10 0 1 0 0 MOVSW A5 10 10 0 1 0 1 MOVSD A5 10 10 0 1 0 1 CMPSB A6 10 10 0 1 1 0 CMPSW A7 10 10 0 1 1 1

CMPSD A7 10 10 0 1 1 1

前7位为1010011,第8位表长度???怎样区分是否带操作数??????

TEST AL, imm8 A8 ib 10 10 1 0 0 0 ib TEST EAX, imm32 A9 id 10 10 1 0 0 1 id TEST AX, imm16 A9 iw 10 10 1 0 0 1 iw 特殊

STOSB AA 10 10 1 0 1 0 STOSW AB 10 10 1 0 1 1 STOSD AB 10 10 1 0 1 1

第8位表长度

LODSB AC 10 10 1 1 00 LODSW AD 10 10 1 1 01 LODSD AD 10 10 1 1 01

第8位表长度

SCASB AE 10 10 1 1 10 SCASW AF 10 10 1 1 11 SCASD AF 10 10 1 1 11

第8位表长度

整体考虑按4-3-1比较合理??????

MOV r8,imm8 B0+rb 10 11 0 000+rb

MOV r32,imm32 B8+rd 10 11 1 000+rd

MOV r16,imm16 B8+rw 10 11 1 000+rw

-以B开头的操作码就这几个,按4-1-3比较合理

第5位定长度??????

ROL r/m8, imm8 C0 /0 ib 11 0 00 00 0 oo000mmm ib ROR r/m8, imm8 C0 /1 ib 11 0 00 00 0 oo001mmm ib RCL r/m8, imm8 C0 /2 ib 11 0 00 00 0 oo010mmm ib RCR r/m8, imm8 C0 /3 ib 11 0 00 00 0 oo011mmm ib SAL r/m8, imm8 C0 /4 ib 11 0 00 00 0 oo100mmm ib SHL r/m8, imm8 C0 /4 ib 11 0 00 00 0 oo100mmm ib SHR r/m8, imm8 C0 /5 ib 11 0 00 00 0 oo101mmm ib SAR r/m8, imm8 C0 /7 ib 11 0 00 00 0 oo111mmm ib ROL r/m16, imm8 C1 /0 ib 11 0 00 00 1 oo000mmm ib ROL r/m32, imm8 C1 /0 ib 11 0 00 00 1 oo000mmm ib ROL r/m64, imm8 C1 /0 ib 11 0 00 00 1 oo000mmm ib ROR r/m16, imm8 C1 /1 ib 11 0 00 00 1 oo001mmm ib ROR r/m32, imm8 C1 /1 ib 11 0 00 00 1 oo001mmm ib RCL r/m16, imm8 C1 /2 ib 11 0 00 00 1 oo010mmm ib

RCL r/m32, imm8 C1 /2 ib 11 0 00 00 1 oo010mmm ib RCR r/m16, imm8 C1 /3 ib 11 0 00 00 1 oo011mmm ib RCR r/m32, imm8 C1 /3 ib 11 0 00 00 1 oo011mmm ib SAL r/m16,imm8 C1 /4 ib 11 0 00 00 1 oo100mmm ib SAL r/m32, imm8 C1 /4 ib 11 0 00 00 1 oo100mmm ib SHL r/m16, imm8 C1 /4 ib 11 0 00 00 1 oo100mmm ib SHL r/m32, imm8 C1 /4 ib 11 0 00 00 1 oo100mmm ib SHR r/m16, imm8 C1 /5 ib 11 0 00 00 1 oo101mmm ib SHR r/m32, imm8 C1 /5 ib 11 0 00 00 1 oo101mmm ib SAR r/m16, imm8 C1 /7 ib 11 0 00 00 1 oo111mmm ib SAR r/m32, imm8 C1 /7 ib 11 0 00 00 1 oo111mmm ib 第8位表长度,0表示同等长度之间的运算,1表示不同长度之间的长度;MOD域表示6种不同的操作方法(没有/6),

7-1;MOD域的中间3位和ROL、RCL等一致

RETN imm16 C2 iw 11 000 0 1 0 iw

RETN C3 11 000 0 1 1

特殊

LES r16,m16:16 C4 /r 11 000 10 0 oorrrmmm LES r32,m16:32 C4 /r 11 000 10 0 oorrrmmm LDS r16,m16:16 C5 /r 11 000 10 1 oorrrmmm

LDS r32,m16:32 C5 /r 11 000 10 1 oorrrmmm 最后一位定

MOV r/m8,imm8 C6 /0 11 000 11 0 oo000mmm imm8

MOV r/m16,imm16 C7 /0 11 000 11 1 oo000mmm imm16

MOV r/m32,imm32 C7 /0 11 000 11 1 oo000mmm imm32

第8位表长度,特殊

ENTER imm16,imm8 C8 iw ib 11 001 0 0 0 iw ib LEAVE C9 11 001 0 0 1

RETF imm16 CA iw 11 001 0 1 0 iw

RET CB 11 001 0 1 1

INT3 CC 11 001 1 0 0

INT imm8 CD ib 11 001 1 0 1 ib INTO CE 11 001 1 1 0

IRET CF 11 001 1 1 1

???有无操作数

按4-3-1拆分比较规整

ROL r/m8, 1 D0 /0 11 010 00 0 oo000mmm

ROR r/m8, 1 D0 /1 11 010 00 0 oo001mmm RCL r/m8, 1 D0 /2 11 010 00 0 oo010mmm RCR r/m8, 1 D0 /3 11 010 00 0 oo011mmm SAL r/m8, 1 D0 /4 11 010 00 0 oo100mmm SHL r/m8, 1 D0 /4 11 010 00 0 oo100mmm SHR r/m8, 1 D0 /5 11 010 00 0 oo101mmm SAR r/m8, 1 D0 /7 11 010 00 0 oo111mmm ROL r/m16, 1 D1 /0 11 010 00 1 oo000mmm ROL r/m32, 1 D1 /0 11 010 00 1 oo000mmm ROR r/m16, 1 D1 /1 11 010 00 1 oo001mmm ROR r/m32, 1 D1 /1 11 010 00 1 oo001mmm RCL r/m16, 1 D1 /2 11 010 00 1 oo010mmm RCL r/m32, 1 D1 /2 11 010 00 1 oo010mmm RCR r/m16, 1 D1 /3 11 010 00 1 oo011mmm RCR r/m32, 1 D1 /3 11 010 00 1 oo011mmm SAL r/m16, 1 D1 /4 11 010 00 1 oo100mmm SAL r/m32, 1 D1 /4 11 010 00 1 oo100mmm SHL r/m16, 1 D1 /4 11 010 00 1 oo100mmm SHL r/m32, 1 D1 /4 11 010 00 1 oo100mmm SHR r/m16, 1 D1 /5 11 010 00 1 oo101mmm

(完整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),有九个有意义的标志,将在下文用到时详细说明。 内存是电脑运作中的关键部分,也是电脑在工作中储存信息的地方。内存组织有许多可存放

(完整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位、4位、8位、16、32位单片机。 正文: 在此我们主要讲解美国ATMEL公司的89C51单片机。 一、89C51单片机PDIP(双列直插式)封装引脚图: 其引脚功能如下: P0口(—):为双向三态口,可以作为输入/输出口。但在实际应用中通常作为地址/数据总线口,即为低8位地址/数据总线分时复用。低8位地址在ALE信号的负跳变锁存到外部地址锁存器中,而高8位地址由P2口输出。 P1口(—):其每一位都能作为可编程的输入或输出线。 P2口(—):每一位也都可作为输入或输出线用,当扩展系统外设时,可作为扩展系统的地址总线高8位,与P0口一起组成16位地址总线。对89c51单片机来说,P2口一般只作为地址总线使用,而不作为I/O线直接与外设相连。 P3口(—):其为双功能口,作为第一功能使用时,其功能与P1口相同。当作为第二功能使用时,每一位功能如下表所示。 P3口第二功能

Rst\Vpd:上电复位端和掉电保护端。 XTAL1(xtal2):外接晶振一脚,分别接晶振的一端。 Gnd:电源地。 Vcc:电源正级,接+5V。 PROG\ALE:地址锁存控制端 PSEN:片外程序存储器读选通信号输出端,低电平有效。 EA\vpp:访问外部程序储存器控制信号,低电平有效。当EA为高电平时访问片内存储器,若超出范围则自动访问外部程序存储器。当EA为低电平时只访问外部程序存储器。 二、常用指令及其格式介绍: 1、指令格式: [标号:]操作码 [ 目的操作数][,操作源][;注释] 例如:LOOP:ADD A,#0FFH ;(A)←(A)+FFH 2、常用符号: Ri和Rn:R表示工作寄存器,i表示1和0,n表示0~7。 rel:相对地址、地址偏移量,主要用于无条件相对短转移指令和条件转移指令。 #data:包含于指令中的8位立即数。 #data16:包含于指令中的16位立即数。

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

一些常用的汇编语言指令

汇编语言常用指令 大家在做免杀或者破解软件的时候经常要用到汇编指令,本人整理出了常用的 希望对大家有帮助! 数据传送指令 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:

汇编语言指令集

汇编语言指令集 一、数据传输指令 1. 通用数据传送指令. MOV(MOVe) 传送字或字节. MOVS(MOVe String) 串传送指令 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 (eXCHanG)交换字或字节.( 至少有一个操作数为寄存器,段寄存器不可作为操作数) CMPXCHG比较并交换操作数.( 第二个操作数必须为累加器AL/AX/EAX ) XADD先交换再累加.( 结果在第一个操作数里) XLAT(TRANSLATE) 字节查表转换. ── 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 (Load Effective Address)装入有效地址. 例: LEA DX,string ;把偏移地址存到DX. LDS (Load DS with pointer)传送目标指针,把指针内容装入DS. 例: LDS SI,string ;把段地址:偏移地址存到DS:SI. LES (Load ES with pointer)传送目标指针,把指针内容装入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 (Load AH with Flags)标志寄存器传送,把标志装入AH. SAHF (Store AH into Flgs)标志寄存器传送,把AH内容装入标志寄存器. PUSHF (PUSH the Flags)标志入栈. POPF (POP the Flags)标志出栈.

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;看门狗定时器清零(若已赋值,同时清预分频器)

MIPS 指令系统和汇编语言

第四章MIPS指令系统和汇编语言 1.考研预测:出题特点总结 本章是对统考408内容来说,本章是新增的章节。此外北航961大纲中制定了要考MIPS 指令集,从15年961真题来看MIPS是重中之重。但是今年计组并没有指定具体的教材,但大纲明确要求掌握MIPS指令集,所以还是建议考生将《计算机组成与设计:硬件/软件接口》中文版(原版第三版或第四版)作为本章的参考书籍。 本章大致内容是MIPS的基础知识,难度并不大。考生应该将重点放在MIPS指令集的基础上,考察C语言中的语句转换为对应的MIPS指令,所以需要熟练掌握C语言中一些语句对应的MIPS指令实现。本章出题很大可能就是C语言和MIPS汇编语言之间的转换,也可能涉及到第五章CPU指令流水线等内容。 2.考研知识点系统整理:梳理考点,各个击破 3.1 指令系统概述 机器指令要素 操作码:指明进行的何种操作 源操作数地址:参加操作的操作数的地址,可能有多个。 目的操作数地址:保存操作结果的地址。 下条指令的地址:指明下一条要运行的指令的位置,一般指令是按顺序依次执行的,所以绝大多数指令中并不显式的指明下一条指令的地址,也就是说,指令格式中并不包含这部分信息。只有少数指令需要显示指明下一条指令的地址。

指令执行周期 3.2 指令格式 一台计算机指令格式的选择和确定要涉及多方面的因素,如指令长度、地址码结构以及操

作码结构等,是一个很复杂的问题,它与计算机系统结构、数据表示方法、指令功能设计等都密切相关。 指令的基本格式 一条指令就是机器语言的一个语句,它是一组有意义的二进制代码,指令的基本格式如下: ( 其中A1为第一操作数地址,A2为第二操作数地址,A3为操作结果存放地址。 这条指令的含义:(A1)OP(A2)→A3 式中OP表示双操作数运算指令的运算符号,如“+”或“–”等。 (2)二地址指令

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

PIC单片机指令集简介 PIC 8位单片机共有三个级别,有相对应的指令集。基本级PIC系列芯片共有指令33条,每条指令是12位字长;中级PIC系列芯片共有指令35条,每条指令是14位字长;高级PIC系列芯片共有指令58条,每条指令是16位字长。其指令向下兼容。 一、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;看门狗定时器清零(若已赋值,同时清预分频器)

汇编语言的各条指令

常用命令 数据传送指令 一通用数据传送指令 MOV指令为双操作数指令,两个操作数中不能全为内存操作数 格式:MOV DST,SRC 执行操作:dst = src 注:1.目的数可以是通用寄存器,存储单元和段寄存器(但不允许用CS段寄存器). 2.立即数不能直接送段寄存器 3.不允许在两个存储单元直接传送数据 4.不允许在两个段寄存器间直接传送信息 PUSH入栈指令及POP出栈指令: 堆栈操作是以“后进先出”的方式进行数据操作。 格式:PUSH SRC //Word 执行操作:(SP)<-(SP)-2 ((SP)+1,(SP))<-(SRC) 注:1.入栈的操作数除不允许用立即数外,可以为通用寄存器,段寄存器(全部)和存储器。

2.入栈时高位字节先入栈,低位字节后入栈。 格式:POP DST //Word 执行操作:(DST)<-((SP+1),(SP)) (SP)<-(SP)+2 注:1.出栈操作数除不允许用立即数和CS段寄存器外,可以为通用寄存器,段寄存器和存储器。 2.执行POP SS指令后,堆栈区在存储区的位置要改变。 3.执行POP SP 指令后,栈顶的位置要改变。 XCHG(eXCHanG)交换指令: 将两操作数值交换。 格式:XCHG OPR1,OPR2 //Byte/Word 执行的操作:(OPR1)<-->(OPR2) 注:1.必须有一个操作数是在寄存器中 2.不能与段寄存器交换数据 存储器与存储器之间不能交换数据。 二累加器专用传送指令 IN输入指令 长格式为:IN AL,PORT(字节) IN AX,PORT(字) 执行的操作:(AL)<-(PORT)(字节)

单片机汇编语言指令集

汇编语言的所有指令数据传送指令集 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

常见汇编语言指令解释:

PC是一个16位的程序计数器。用于存放和指示下一条要执行的指令的地址。寻址范围达64KB。PC有自动加1功能,以实现程序的顺序执行。PC没有地址,是不可寻址的,无法用指令对它进行读写。但在执行转移、调用、返回等指令时能自动改变其内容,以改变程序的执行顺序。 参数代表的意义: 1、Rn 表示R0~R7中的一个 2、#data 表示8位的数值 00H~FFH 3、direct 表示8位的地址 00H~FFH(指的是内部RAM或SFR的地址) 4、@Ri 表示寄存器间接寻址只能是R0或者R1 5、@DPTR 表示数据指针间接寻址 6、bit 表示位地址 7、$ 表示当前地址 常见汇编语言指令解释: 寄存器寻址 MOV A,R1将R1中的数值赋予A 直接寻址 MOV A,3AH将地址3AH中的数值赋予A 立即寻址 MOV A,#3AH将3AH数值赋予A

寄存器间址 MOV A,@R0 将 R0中地址的数值赋予A 变址寻址 MOVC A,@A+DPTR以A中的数值为地址偏移量进行查表 相对寻址 AJMP MATN跳转到行号为MATN处 位寻址 MOV C,7FH 将位地址7FH的数值赋予C MOV A,#3AH数据传输、赋值命令 PUSH direct将direct为地址的数值压入堆栈中 POP direct将direct为地址的数值弹出堆栈 XCH A,direct将direct中的数值与A进行交换 ADD A,direct将direct中的数值与 INC direct将direct中的数值加1 SUBB A,direct将A中的数值减去direct中的数值和Cy值,并保存在A中,如果想使用不带Cy减法,可以在运算前对Cy清零:CLR C DEC direct将direct中的数值减1 DA A 用于对BCD码加减法后进行10进制调整 MUL A B将A和B相乘,并把高八位放在B中,低八位放在A中 DIV A B将A和B相除,并把商放在A中,余数放在B中 ANL A,direct将A与direct中的数值进行与运算,结果保留在A 中(与运算规律:有0出0,全1出1) ORL A,direct将A与direct中的数值进行或运算,结果保留在A中(或运算规律:有1出1,全0出0) XRL A,direct将A与direct中的数值进行异或运算,结果保留在A 中(异或运算规律:全0出0,全1出0,01、10出1)

汇编语言常见指令

?PTR?操作符:强制类型转换 MOV BYTE PTR [BX], 20H ;1B立即数20H送DS:[BX] MOV WORD PTR [BX], 20H ;立即数20H送DS:[BX], ;00H送DS:[BX+1] 2.LEA(Load Effective Address) 设:变量X的偏移地址为1020H , (BP)=0020H 执行指令后: LEA DX, X LEA BX, [BP] ; 执行后, (DX) = 1020H ; 执行后, (BX) = 0020H 3.地址传送指令LDS,LES LDS REG16, MEM ; 从存储器取出4B,送入REG16和DS LES REG16, MEM ; 从存储器取出4B,送入REG16和ES 4.符号扩展指令CBW,CWD CBW ;将AL寄存器内容符号位扩展到AH CWD ;将AX寄存器内容符号位扩展到DX 设:(AX)= 8060H,(DX)=1234H 执行下列指令后 CBW ;(AX)= 0060H 设:(AX)= 8060H,(DX)=1234H 执行下列指令后 CWD ;(DX)= 0FFFFH,(AX)= 8060H 5.交换指令XCHG 例如,(AX)= 5678H 执行下面指令后 XCHG AH, AL ;(AX)= 7856H 6.换码指令XLAT XLAT ;AL←DS: [BX+AL] 表格的首地址事先存放在内存逻辑地址DS: BX中, AL的内容是相对于表格的位移量, 把对应内存的内容取出放在AL寄存器。 7.逻辑运算符 SHR(右移) SHL(左移) AND(与) OR(或) XOR(异或)

反汇编语言常用指令

内容目录 计算机寄存器分类简介 计算机寄存器常用指令 一、常用指令 二、算术运算指令 三、逻辑运算指令 四、串指令 五、程序跳转指令 ------------------------------------------ 计算机寄存器分类简介: 32位CPU所含有的寄存器有: 4个数据寄存器(EAX、EBX、ECX和EDX) 2个变址和指针寄存器(ESI和EDI) 2个指针寄存器(ESP和EBP) 6个段寄存器(ES、CS、SS、DS、FS和GS) 1个指令指针寄存器(EIP) 1个标志寄存器(EFlags) 1、数据寄存器 数据寄存器主要用来保存操作数和运算结果等信息,从而节省读取操作数所需占用总线和访问存储器的时间。 32位CPU有4个32位的通用寄存器EAX、EBX、ECX和EDX。 对低16位数据的存取,不会影响高16位的数据。 这些低16位寄存器分别命名为:AX、BX、CX和DX,它和先前的CPU中的寄存器相一致。 4个16位寄存器又可分割成8个独立的8位寄存器(AX:AH-AL、BX:BH-BL、CX:CH-CL、DX:DH-DL),每个寄存器都有自己的名称,可独立存取。 程序员可利用数据寄存器的这种“可分可合”的特性,灵活地处理字/字节的信息。 寄存器EAX通常称为累加器(Accumulator),用累加器进行的操作可能需要更少时间。可用于乘、除、输入/输出等操作,使用频率很高; 寄存器EBX称为基地址寄存器(Base Register)。它可作为存储器指针来使用; 寄存器ECX称为计数寄存器(Count Register)。 在循环和字符串操作时,要用它来控制循环次数;在位操作中,当移多位时,要用CL来指明移位的位数;寄存器EDX称为数据寄存器(Data Register)。在进行乘、除运算时,它可作为默认的操作数参与运算,也可用于存放I/O的端口地址。 在16位CPU中,AX、BX、CX和DX不能作为基址和变址寄存器来存放存储单元的地址, 在32位CPU中,其32位寄存器EAX、EBX、ECX和EDX不仅可传送数据、暂存数据保存算术逻辑运算结果, 而且也可作为指针寄存器,所以,这些32位寄存器更具有通用性。 2、变址寄存器 32位CPU有2个32位通用寄存器ESI和EDI。 其低16位对应先前CPU中的SI和DI,对低16位数据的存取,不影响高16位的数据。 寄存器ESI、EDI、SI和DI称为变址寄存器(Index Register),它们主要用于存放存储单元在段内的偏移量,用它们可实现多种存储器操作数的寻址方式,为以不同的地址形式访问存储单元提供方便。 变址寄存器不可分割成8位寄存器。作为通用寄存器,也可存储算术逻辑运算的操作数和运算结果。 它们可作一般的存储器指针使用。在字符串操作指令的执行过程中,对它们有特定的要求,而且还具有特殊的功能。 3、指针寄存器

相关文档
最新文档