ADD(x86彙編指令)

Intel x86平台的彙編加法指令

基本介紹

  • 外文名:ADD
指令集,說明,16位指令集,標誌位,示例程式,示例一,示例二,示例三,

指令集

說明

註:以下所有數字默認為十六進制數字
MEM代指運算元為記憶體或暫存器,使用地址超越前綴0x67可以在16位與32位定址模式之間切換
REG代指運算元為暫存器,使用運算元超越前綴0x66可以在16位與32位暫存器之間切換
IMM代指立即數,使用運算元超越前綴0x66可以在16位與32位立即院諒虹數之間切換
SEG代指運算元為段暫存器
以上三縮寫後接數字表示位數
指令結構:|前綴| |OPcode| |記憶體定址(可選)及其小端偏移肯奔榆說量(可選)| |小端戲估旋立即數|
16位模式 2E 00 46 34 12 為ADD CS:[1234],AL
16位模式 66 05 78 56 34 12 為ADD EAX,12345678
32位模式 66 05 34 12 為 ADD AX,1234
32位模式 67 03 4E 04 為 ADD ECX,SS:[BP+4]
16位記憶體定址 |ModR/M| |偏移量|
ModR/M字跨悼墊迎節結構
7
6
5
4
3
2
1
0
ModR/M
mod
reg
r/m
有時候reg用來區分指令,記做fun;有時候reg用來指代段暫存器,記做seg
mod
r/m解讀方法
00
若r/m=6即110,為踏員翻DS:[16位小端偏移],否則為無偏移量記憶體定址
01
帶8位偏移量的記憶體定址
10
帶16位偏移量的記憶體定址
11
為暫存器
reg或seg或r/m解讀
16位暫存器
8位暫存器
記憶體定址
段暫存器
0=000
AX
AL
DS:[BX+SI]
ES
1=001
CX
CL
DS:[BX+DI]
CS
2=010
DX
DL
SS:[BP+SI]
SS
3=011
BX
BL
SS:[BP+DI]
DS
4=100
SP
AH
DS:[SI]
5=101
BP
CH
DS:[DI]
6=110
SI
DH
SS:[BP]
7=111
DI
BH
DS:[BX]

16位指令集

OPcode
指令
示例(機器碼)
示例(對應彙編)
00
ADD MEM8,REG8
00 00
ADD DS:[BX+SI],AL
01
ADD MEM16,REG16
01 DD
ADD BP,BX
02
ADD REG8,MEM8
02 2E 8B 0E
ADD CH,DS:[0E8B]
03
ADD REG16,MEM16
03 EB
ADD BP,BX
04
ADD AL,IMM8
04 12
ADD AL,12
05
ADD AX,IMM16
05 34 12
ADD AX,1234
80 (fun=0=000)
ADD MEM8,IMM8
80 00 12
ADD BYTE DS:[BX+SI],12
81 (fun=0=000)
ADD MEM16,IMM16
81 06 34 12 78 56
ADD WORD DS:[1234],5678
82 (fun=0=000)
ADD MEM8,IMM8
82 C1 12
ADD CL,12
83 (fun=0=000)
ADD MEM16,IMM8 (有符號)
83 00 FE
83 C4 0A
ADD WORD DS:[BX+SI],-02
ADD SP,+0A
背誦技巧:00funXXX 中fun是ADD,OR,ADC,SBB,AND,SUB,XOR,CMP(加或進借與減異比),XXX是m8r8,m16r16,r8,m8,r16,m16,ALimm8,AXimm16(或者記成mr,rm,AccImm),100000XX是fun m8i8,m16,i16,m8i8,m16Si8

標誌位

OF
DF
IF
SF
ZF
AF
PF
CF
*
*
*
*
*
*
註:0指清零;1指置一;*指按結果修改;?指未定義

示例程式

示例一

0100 B88680        MOV     AX,8086
0103 05FFFF       屑估  ADD      AX,FFFF
0106 CD01           INT        01
AX=8085  NV - - NG NZ AC PO CY
有一個加數符號位為1,不論結果符號位如何,OF=0,Not oVerflow
結果最高位為1,所以兵罪白SF=1,NeGative
結果不為0,所以ZF=0,Not Zero
低4位6與F相加時向高位進位了,所以AF=1,Auxiliary Carry
結果低8位為1000 0101共3個1,所以PF=0,Parity Odd
相加結果發生進位,CF=1,CarrY

示例二

0100 B063           MOV     AL,63
0102 0457           ADD      AL,57
0104 CD01           INT        01
AL=BA  OV - - NG NZ NA PO NC
兩加數符號位都為0,結果符號位變為1,所以OF=1,OVerflow
結果最高位為1,所以SF=1,NeGative
結果不為0,所以ZF=0,Not Zero
第4位3與7相加時未向高位進位,所以AF=0,No Auxiliary carry
結果(低8位)為1011 1010共5個1,所以PF=0,Parity Odd
相加結果未發生進位,CF=0,No Carry

示例三

0100 B83917        MOV     AX,1739
0103 00E0            ADD      AL,AH
0105 CD01           INT        01
AL=50  NV - - PL NZ AC PE NC
兩加數符號位都為0,結果符號位也仍然是0,所以OF=0,Not oVerflow
結果最高位為0,所以SF=0,PLus
低4位7與9相加時向高位進位了,所以AF=1,Auxiliary Carry
結果(低8位)為0101 0000共2個1,所以PF=1,Parity Even
相加結果未發生進位,CF=0,No Carry
0107 27                DAA
0108 CD01            INT        01
AL=56  - - - PL NZ AC PE NC
分析見詞條DAA
AL為17與39兩個壓縮BCD碼的加法結果
0103 05FFFF         ADD      AX,FFFF
0106 CD01           INT        01
AX=8085  NV - - NG NZ AC PO CY
有一個加數符號位為1,不論結果符號位如何,OF=0,Not oVerflow
結果最高位為1,所以SF=1,NeGative
結果不為0,所以ZF=0,Not Zero
低4位6與F相加時向高位進位了,所以AF=1,Auxiliary Carry
結果低8位為1000 0101共3個1,所以PF=0,Parity Odd
相加結果發生進位,CF=1,CarrY

示例二

0100 B063           MOV     AL,63
0102 0457           ADD      AL,57
0104 CD01           INT        01
AL=BA  OV - - NG NZ NA PO NC
兩加數符號位都為0,結果符號位變為1,所以OF=1,OVerflow
結果最高位為1,所以SF=1,NeGative
結果不為0,所以ZF=0,Not Zero
第4位3與7相加時未向高位進位,所以AF=0,No Auxiliary carry
結果(低8位)為1011 1010共5個1,所以PF=0,Parity Odd
相加結果未發生進位,CF=0,No Carry

示例三

0100 B83917        MOV     AX,1739
0103 00E0            ADD      AL,AH
0105 CD01           INT        01
AL=50  NV - - PL NZ AC PE NC
兩加數符號位都為0,結果符號位也仍然是0,所以OF=0,Not oVerflow
結果最高位為0,所以SF=0,PLus
低4位7與9相加時向高位進位了,所以AF=1,Auxiliary Carry
結果(低8位)為0101 0000共2個1,所以PF=1,Parity Even
相加結果未發生進位,CF=0,No Carry
0107 27                DAA
0108 CD01            INT        01
AL=56  - - - PL NZ AC PE NC
分析見詞條DAA
AL為17與39兩個壓縮BCD碼的加法結果

相關詞條

熱門詞條

聯絡我們