彙編語言學習(80x86 寄存器&指令)

80x86 16bit架構中用了14個寄存器:   ┏ 指令指針寄存器

AX  BX  CX  DX  SI  DI  SP  BP  IP  CS  SS  DS  ES  PSW/FLAG

┗━━━━━━━━━━━━━━━━━━━┛    ┗━━━━━┛    ┗━━━━━━━┛              ┗━━━━━━━━━━━━━━━━━━━┛      狀態寄存器

       通用寄存器    變址寄存器   指針寄存器                 段寄存器          狀態寄存器

 

AX  (AH AL)累加寄存器 

             以下指令使用該寄存器:DIV  MUL  XLAT

BX  (BH BL)基地址寄存器

             該寄存器可用於內存尋址

             以下指令使用該寄存器:XLAT

CX  (CH CL)計數器寄存器

             以下指令使用該寄存器:LOOP

DX  (DH DL)數據寄存器

             以下指令使用該寄存器:DIV(32)  MUL(32)  IDIV(32)  IMUL(32)  XLAT

SI  源變址寄存器

             該寄存器用於內存尋址

             以下指令使用該寄存器:MOVS  STOS  LODS  CMPS  SCAS

DI  目的變址寄存器

             該寄存器用於內存尋址

             以下指令使用該寄存器:MOVS  STOS  LODS  CMPS  SCAS

SP  堆棧指針寄存器

             該寄存器用於內存尋址

             以下指令使用該寄存器:PUSH/POP  PUSHF/POPF  PUSHA/POPA  CALL/RET

BP  基指針寄存器

IP  指令指針寄存器

             以下指令使用該寄存器:CALL/RET

CS  代碼段寄存器

             該寄存器用於內存尋址

             以下指令使用該寄存器:CALL/RET

DS  數據段寄存器

             該寄存器用於內存尋址

             以下指令使用該寄存器:MOVS  STOS  LODS  CMPS  SCAS

SS  堆棧段寄存器

             該寄存器用於內存尋址

             以下指令使用該寄存器:MOVS  STOS  LODS  CMPS  SCAS

ES  附加段寄存器

             該寄存器用於內存尋址

             以下指令使用該寄存器:MOVS  STOS  LODS  CMPS  SCAS

PSW/FLAG  狀態寄存器

             以下指令影響該寄存器:LAHF/SAHF   PUSHF/POPF  ADD/SUB  ADC/SBB  INC/DEC  NEG  CMP  MUL  DIV  IMUL  IDIL  AND/OR/XOR/TEST  SHL/SAR  SHL/SAR  

以下指令影響 OF溢出標誌:INC/DEC  ADD/SUB  ADC/SBB  NEG  CMP  MUL  IMUL

以下指令影響 SF符號標誌INC/DEC  ADD/SUB  ADC/SBB  NEG  CMP

以下指令影響 ZF零標誌:INC/DEC  ADD/SUB  ADC/SBB  NEG  CMP

以下指令影響 CF進位/借位標誌:MUL  IMUL

以下指令影響 AF輔助進位標誌:INC/DEC  ADD/SUB  ADC/SBB  NEG  CMP

以下指令影響 PF奇偶標誌INC/DEC  ADD/SUB  ADC/SBB  NEG  CMP

以下指令影響 整個標誌寄存器:LAHF  POPF  DIV  IDIV  XADD

80x86 32bit架構中用了16個寄存器:

EAX  EBX  ECX  EDX  ESI  EDI  ESP  EBP  EIP  CS  SS  DS  ES  FS  GS  EFLAG

┗━━━━━━━━━━━━━━━━━━━━━━━┛  ┗━━━━━━━━┛  ┗━━━━━━━━━━┛             ┗━━━━━━━━━━━━━━━━━━━━━━━━━━┛   狀態寄存器

       通用寄存器         變址寄存器  指針寄存器                             段寄存器 

各寄存器的作用與16位差不多

EAX  (AH AL)累加寄存器 

             以下指令使用該寄存器:DIV  MUL  XLAT

EBX  (BH BL)基地址寄存器

             該寄存器可用於內存尋址

             以下指令使用該寄存器:XLAT

ECX  (CH CL)計數器寄存器

             以下指令使用該寄存器:LOOP

EDX  (DH DL)數據寄存器

             以下指令使用該寄存器:DIV(32)  MUL(32)  IDIV(32)  IMUL(32)  XLAT

ESI  源變址寄存器

             該寄存器用於內存尋址

             以下指令使用該寄存器:MOVS  STOS  LODS  CMPS  SCAS

EDI  目的變址寄存器

             該寄存器用於內存尋址

             以下指令使用該寄存器:MOVS  STOS  LODS  CMPS  SCAS

ESP  堆棧指針寄存器

             該寄存器用於內存尋址

             以下指令使用該寄存器:PUSH/POP  PUSHF/POPF  PUSHA/POPA  CALL/RET

EBP  基指針寄存器

EIP  指令指針寄存器

             以下指令使用該寄存器:CALL/RET

CS  代碼段寄存器

             該寄存器用於內存尋址

             以下指令使用該寄存器:CALL/RET

DS  數據段寄存器

             該寄存器用於內存尋址

             以下指令使用該寄存器:MOVS  STOS  LODS  CMPS  SCAS

SS  堆棧段寄存器

             該寄存器用於內存尋址

             以下指令使用該寄存器:MOVS  STOS  LODS  CMPS  SCAS

ES  附加段寄存器

             該寄存器用於內存尋址

             以下指令使用該寄存器:MOVS  STOS  LODS  CMPS  SCAS

EFLAG  狀態寄存器

             以下指令影響該寄存器:LAHF/SAHF   PUSHF/POPF  ADD/SUB  ADC/SBB  INC/DEC  NEG  CMP  MUL  DIV  IMUL  IDIL  AND/OR/XOR/TEST  SHL/SAR  SHL/SAR  

 

------------------------------------------------------------------------------------------------

下文轉自: https://www.cnblogs.com/hustlijian/archive/2011/07/02/2096520.html

一、數據傳送指令

指令名稱

彙編語句格式

功能

影響標誌位

傳送
move data
mov opd, ops (ops) → opd;分爲主存儲器、通用寄存器、段寄存器,不可同時使用主存儲器,類型要匹配:byte,word,dword
帶符號擴充的傳送
move with sign-extend
movsx opd, ops 將ops的符號向前擴展成與opd相同的數據類型後 → opd
ops不能爲立即數,
帶0擴展的傳送
move with zero-extend
movzx opd, ops 將ops的高位向前補0擴展成與opd相同的數據類型後 → opd
數據交換
exchange
xchg opd, ops 將(opd)與(ops)交換
源操作數不能是立即操作數
32位寄存器字節交換
byte swap
bswap reg
(reg,代表寄存器,下同)
將從第一個與第四個字節交換,將第二個字節和第三個字節交換
(按字節反序),32位寄存器
交換並相加
exchange and add
xadd opd, ops 將(opd)與(ops)互換,(opd)+(ops) → opd af,of,pf,
sf,zf,cf
查錶轉換
table look-up translation
xlat ops 或 xlatb (ds:[bx/ebx+al]) → al (求和之前al作無符號擴展),
一般把數表的首地址放到bx/ebx中,lea bx, buf  ;al就是在buf中的位置
傳送偏移地址
load effective address
lea reg,ops ops → reg
傳送偏移地址和數據段首地址
load data segment register
lds reg, ops (ops)→ reg   
(ops+2/4)→ ds;ops一定是存儲器地址,類型爲dword/fword
傳送偏移地址和附加段首地址
load far pointer to extra segment
les/lfs/lgs reg, ops 同上,只是段寄存器分別爲es,fs,gs
傳送偏移地址和堆棧首地址
load stack segment
lss reg, ops 同上,段寄存器爲ss
進棧
push word/dword onto stack
push ops
pushw ops 或pushd ops
16位段:(sp) – 2/4 → sp    (ops) → [sp]; 可以爲兩個字節,
或四個字節32位段:(esp) – 2/4 → esp  (ops) → [esp]; 同上
所有16位通用寄存器進棧
pushall 16-bit general registers
pusha (sp/esp) –2 → sp/esp 重複8次壓入ax,cx,dx,bx,sp(指令執前),bp,si,di;是先改變sp/esp 再把數據寫入
所有32位通用寄存器進棧
pushall 32-bit general registers
pushad (sp/esp) – 4 → sp/esp 重複8次壓入eax,ecx,edx,ebx,
esp(指令執行前),ebp,esi,edi;是先改變sp/esp 再把數據寫入
出棧
pop a word/dword frome the stack
pop opd 16位段:[sp]→ (opd) ; (sp) + 2/4 → sp   ;可以爲兩個字節,或四個字節
32位段:[esp]→ (opd) ; (esp) + 2/4 → esp ;  同上
出棧到所有16位通用寄存器
pop stack into all 16-bit registers
popa 將棧頂的16個字節依次出棧到di,si,bp,丟棄2個字節,bx,dx,cx,ax,
(sp/esp)+16 → sp/esp  
出棧到所有32位通用寄存器
pop stack into all 32-bit registers
popad 將棧頂的16個字節依次出棧到edi,esi,ebp,丟棄4個字節,ebx,edx,ecx,eax,
(sp/esp)+32 → sp/esp  
標誌進棧
push flags onto stack
pushf (sp/esp) – 2 → sp/esp
(flags) → [sp/esp]
擴展標誌出棧
push eflags onto stack
pushfd sp/esp – 4 → sp/esp
(eflags) → [sp/esp]
標誌出棧
pop stack into flags
popf [sp/esp] → flags
sp/esp + 4 → sp/esp
擴展標誌出棧
pop stack into eflags
popfd [sp/esp] → eflags
sp/esp + 4 → sp/esp
標誌傳送到ah
load ah from flags
lahf (flags7-0) →  ah
將ah傳送到flags
store ah into flags
sahf (ah) → flags7-0 sf,zf,af,pf,cf
輸入
input from port
in opd, ops ([ops]) →  opd;
opd只能是al、ax、eax;ops爲立即數(<255)或者dx
輸出
output to port
out opd, ops (ops) → [opd];
ops只能是al、ax、eax;opd爲立即數(<255)或者dx

二、算術運算指令

指令名稱

彙編語句格式

功能

影響標誌位

加 1
increment
inc opd (opd) + 1 → opd af,of,pf,
sf,zf

addition
add opd, ops (opd) + (ops) → opd af,of,pf,
sf,zf
帶進位加
add with carry
adc opd, ops (opd) + (ops) + cf → opd af,of,pf,
sf,zf
減 1
decrement
dec opd (opd) – 1 → opd af,of,pf,
sf,zf
求補
two's complement negation
neg opd 0 – (opd) → opd af,of,pf,
sf,zf

subtract
sub opd, ops (opd) – (ops) → opd af,of,pf,
sf,zf
帶借位減
subtract with borrow
sbb opd, ops (opd) – (ops) – cf → opd af,of,pf,
sf,zf
比較
compare
cmp opd, ops (opd) – (ops)
一般用於轉移前的控制,應用於跳轉
af,of,pf,
sf,zf
無符號乘
unsigned multiply
mul ops 字節乘:(al) * (ops) → ax; 字乘法:(ax) * (ops) → dx:ax;
雙字乘:(eax) * (ops) → edx:eax
cf,of
單操作數的有符號乘
signed integer multiply
imul ops 字節乘:(al) * (ops) → ax; 字乘法:(ax) * (ops) → dx:ax;
雙字乘:(eax) * (ops) → edx:eax
cf,of
雙操作數的有符號乘
signed integer multiply
imul opd, ops (opd) * (ops) → opd;opd可爲16/32的寄存器,ops可爲同類型的寄存器、存儲器或立即數 cf,of
三操作數的有符號乘
signed integer multiply
imul opd, ops, n (ops) * n → opd;同上,n爲立即數 cf,of
將字節轉換成字
convert byte to word
cbw 將al中的符號擴展到ah中,數據的補碼數值沒有變
將字轉換成雙字
convert word to double word
cwd 將ax中的符號擴展到dx的高位中
將字轉換成雙字
convert word to double word
cwde 將ax中的符號擴展到eax的高位中
將雙字轉換成4字
convert double word to quadword
cdq 將eax中的符號擴展到edx中
無符號除
unsigned divide
div ops 字節除:(ax)/(ops)→al(商),ah(餘數);字除:(dx:ax)/(ops) → ax(商),
dx(餘數) 雙字除: (edx:eax)/(ops) → eax(商),edx(餘數)
af,of,pf,
cf,sf,zf
有符號除
signed integer divide
idiv ops 字節除:(ax)/(ops)→al(商),ah(餘數);字除:(dx:ax)/(ops) → ax(商),
dx(餘數) 雙字除: (edx:eax)/(ops) → eax(商),edx(餘數)
af,of,pf,
cf,sf,zf

三、控制轉移指令

指令名稱

彙編語句格式

功能

影響標誌位

相等/等於0轉移
jump if equal/zero
je/jz 標號 zf = 1 轉移
不相等/不等於0轉移
jump if not equal/zero
jne/jnz 標號 zf = 0 轉移
爲負轉移
jump if sign
js 標號 sf = 1 轉移
爲正轉移
jump if positive
jns 標號 sf = 0 轉移
溢出轉移
jump if overflow
jo 標號 of = 1 轉移
無溢出轉移
jump if not overflow
jno 標號 of = 0 轉移
有進位轉移
jump if carry
jc 標號 cf = 1 轉移
無進位轉移
jump if not carry
jnc 標號 cf = 0 轉移
偶檢驗/偶性轉移
jump if parity/parity even
jp/jpe 標號 pf = 1 轉移
奇檢驗/奇性轉移
jump if no parity/parity odd
jnp/jpo 標號 pf = 0 轉移
小於/不大於也不等於 轉移
jump if less/not greater nor equal
jl/jnge 標號 sf ≠ of 轉移
不小於/大於或等於轉移
jump if not less/greater or equal
jnl/jge 標號 sf = of 轉移
大於/不小於或不等於轉移
jump if greater/not less or not equal
jg/jnle 標號 sf = of, 且zf = 0 轉移
不大於/小於或等於轉移
jump if not greater /less or equal
jng/jle 標號 sf ≠ of 或zf =  1 轉移
低於/不高於且不等於轉移(無符號)
jump if below/not above not equal
jb/jnae 標號 cf = 1 轉移
不低於/高於或等於轉移(無符號)
jump if now below/above or equal
jnb/jae 標號 cf = 0 轉移
高於/不低於且比等於轉移(無符號)
jump if above/not below nor equal
ja/jnbe 標號 cf = 0 且 zf = 0 轉移
不高於/低於或等於
jump if not above/below or equal
jna/jbe 標號 cf = 1 或 zf =1 轉移
無條件轉移
jump unconditionally
jmp opd 相對轉移:(opd)+ip/eip → ip/eip 近轉移:(opd) → ip/eip
遠轉移:(opd) → ip/eip, (opd+2/4) → cs,或根據描述符決定
cx爲0轉移
jump if cx is zero
jcxz 標號
或jecxz 標號
若(cx/ecx) = 0 轉移
循環
loop
loop 標號
或loopw/loopd 標號
(cx/ecx) – 1 → cx/ecx, 若(cx/ecx) ≠ 0 則轉移
相等/爲0循環
loop if equal/zero
loope/loopz 標號 (cx/ecx) – 1 → cx/ecx,若(cx/ecx) ≠ 0 且zf = 1 則轉移
不相等/不爲0循環
loop if not equal/not zero
loopne/loopnz 標號 (cx/ecx) – 1 → cx/ecx,若(cx/ecx) ≠ 0 且zf = 0 則轉移
檢查數組下標邊界
check array index against bounds
bound reg, ops 若reg的索引值小於ops指定的下邊界或大於ops指定的上邊界,則變成5號異常
調用子程序
call a procedure
call opd 調用opd所指定的子程序(32位段的遠調用時,CS被擴展成4字節後壓棧) 任務切換有影響,否則無
從子程序返回
return from procedure
ret [n]
n代表16位常量,[]表可選
從子程序返回到調用語句的下一個語句處,若n存在,則(sp/esp)+n → sp/esp;32位段遠返回時,cs出棧時改變4字節的棧指針
中斷調用
interrupt
int n (flags/eflags) 入棧,0→if,tf;(cs) 入棧;(4*n)→ip,(4*n+2)→cs或根據idt給eip,cs賦值 0→tf,if,返回時復原
溢出中斷
interrupt if overflow
into (flags/eflags) 入棧,0→if,tf;(cs) 入棧;(4*n)→ip,(4*n+2)→cs或根據idt給eip,cs賦值;of=1時產生int 4 0→tf,if,返回時復原
中斷返回
interrupt return
iret 或iretd(32位段)
或iretf
ip出棧,cs出棧,flags/eflags出棧,根據nt標誌做相應的處理 都有影響

四、串操作指令

指令名稱

彙編語句格式

功能

影響標誌位

串傳送
move byte/word string
movs opd, ops
movsb,movsw,movsd
(ds:[si/esi]) → es:[di/edi],(ops所在的段可以取代ds),(si/esi)±1/2/4 → si/esi, (di/edi)±1/2/4 → di/edi
串比較
compare string
cmps ops, opd
cmpsb,compsw,compsd
(ds:[si/esi]) – (es:[di/edi]),(si/esi)±1/2/4 → si/esi,
(di/edi)±1/2/4 →di/edi
af,cf,of,pf,
sf,zf
串搜索
scan string
scas opd
scasb,scasw,scasd
(al/ax/eax) – (es:[di/edi]),(di/edi)±1/2/4 →di/edi af,cf,of,pf,
sf,zf
取字符串
load string
lods ops
lodsb, lodsw,lodsd
(ds:[si/esi]) → al/ax/eax,(ops所在的段可以取代ds),
(si/esi)±1/2/4 →si/esi
存字符串
store string
stos opd
stosb,stosw,stosd
(al/ax/eax)→es:[di/edi],(di/edi)±1/2/4 →di/edi
輸入串
input from port to string
ins opd, dx
insb,insw,insd
([dx]) →es:[di/edi],(di/edi)±1/2/4 →di/edi
輸出串
output string port
outs opd, ops
outsb,outsw,outsd
(ds:[si/esi])→[dx],(si/esi)±1/2/4 →si/esi
重複前綴
repeat string operation
rep 串操作指令
repe/repz 串操作指令
repne/repnz 串操作指令
若(cx/ecx) ≠ 0,執行一個串操作,(cx/ecx)-1→cx/ecx,返回再做
若(cx/ecx) ≠ 0且zf=1,執行一次串操作,(cx/ecx)-1→cx/ecx,返回
若(cx/ecx) ≠ 0且zf=0,執行一次串操作,(cx/ecx)-1→cx/ecx,返回

五、位操作指令

指令名稱

彙編語句格式

功能

影響標誌位

求反
one's complement negation
not opd ▁▁▁▁▁
(opd)→opd
邏輯乘
and
and opd, ops (opd)∧(ops)→opd pf,sf
位測試
bit test
bt opd, ops 將(ops)作爲位偏移(0~31)指明的opd對應位的值→CF cf
位測試並求補
bit test and complement
btc opd, ops 在bt指令的基礎上,將opd的對應位求反後→opd cf
位測試並清0
bit test and reset
btr opd, ops 在bt指令的基礎上,將0→opd的對應位 cf
位測試並置1
bit test and set
bts opd, ops 在bt指令的基礎上,將1→opd的對應位 cf
正向位掃描
bit scan forward
bsf reg, ops 從0位開始掃描ops各位,若均爲0,則zf=1,否則將第一個爲1的位置值
→reg,zf=0
zf
反向位掃描
bit scan reverse
bsr reg, ops 從最高位開始掃描ops各位,若均爲0,則zf=1,否則,將首先碰到的爲1的位置值→reg,zf=0 zf
測試
test
test opd, ops (ops)∧(opd) sf,zf,pf;
0→of,cf
邏輯加
inclusive or
or opd, ops (opd)∨(ops)→opd sf,zf,pf;
0→of,cf
按位加
exclusive or
xor opd, ops 加法,就是用異或的計算方法了 sf,zf,pf;
0→of,cf
算術左移
shift arithmetic left
sal opd, 1 ;sal opd, cl;
sal opd, 8位立即數
cf中的值是最後移入位的值 sf,zf,pf,cf
邏輯左移
shift logic left
shl opd, 1; shl opd, cl
shl opd, 8位立即數
cf中的值是最後移入位的值 sf,zf,pf,cf
雙精度左移
double precision shift left
shld opd, reg,八位立即數
shld opd, reg, cl
將reg的最高n位移入opd的低n位中,reg保持不變,opd最後移入的一位保存在cf中 cf,sf,zf,pf
算術右移
shift arithmetic rigtht
sar opd,1; sar opd, cl
sar opd, 8位立即數
將(opd)向右移動n個指定的次數且最高位保持不變,cf的內容爲最後移入位的值 sf,zf,pf,cf
邏輯右移
shift logical right
shr opd, 1; shr opd cl
shr opd, 8位立即數
將(opd)向右移動n規定的次數,最高位補入0,cf的內容爲最後移入位的值 sf,zf,pf,cf
雙精度右移
double precision shift right
shrd opd, reg,8位立即數
shrd opd, reg, cl
將reg的最低n位移入opd高n位中,reg保持不變,opd最後移出的一位保存在cf中 cf,sf,zf,pf
循環右移
rotate rigth
ror opd, 1; ror opd cl
ror opd, 8位立即數
將目的操作數的最高位和最低位連接起來,組成一個環,將環中的所有位一起向右移動n位規定的數目(cl或立即數確定),cf爲最後移入位的值 cf
循環左移
rotate left
rol opd,1; rol opd cl
rol opd, 8位立即數
同上,向左移動 cf
帶進位的循環右移
rotate right through carry
rcr opd, 1; rcr opd, cl
rcr opd, 8位立即數
cf在最低位,與目的操作數連成環,移動 cf
帶進位的循環左移
rotate left through carry
rcl opd, 1; rcl opd, cl
rcl opd, 8位立即數
cf在最高位,與目的操作數連成環,移動指定的位數 cf

六、尋址方式

尋址方式

格式

功能

實例

寄存器尋址 R 寄存器R的內容就是操作數(R是任意寄存器個別指令的限制除外)
R可以是ax,bx,cx,dx,cs,ds,ss,es…….
inc bx
寄存器間接尋址 [R]
SS:[R]; 堆棧段
DS:[R]; 數據段
操作數在主存儲器中,而操作數的偏移地址EA在指明的寄存器中
16位:只能是bx,bp,si,di
32位:通用寄存器(eax,ebx,ecx,edx,edi,esi,ebp,esp)
未指明段時,bp,ebp,esp爲堆棧段,其餘是數據段
mov a, [si]
mov cx, [ebp]
變址尋址 16位:[R+V],[R]+V,V[R]
32位:[R*F+V],
[R*F]+V,V[R*F]
操作數在主存儲器中,偏移地址EA在指定寄存器R的內容乘以比例因子F與給出位移量V的和。
位移量V是不超過16位或不超過32位的二進制補碼錶示的有符號數(立即數),也可以是符合語法規則的數值表達式變量標號,
最後計算的偏移量是無符號數,
未明確段時,規則如上
mov al, [ebx*2]+5
add –2[bp], ax
mov 2*10h[si]
基址加變址尋址 16位:[bx/bp+si/di+V]
        V[bx/bp][si/di]
        V[bx/bp+si/di]
32位:[BR+IR*F+V],
        V[BR][IR*F],
        V[BR+IR*F]
操作數在主存儲器中,偏移地址EA是指令中基址寄存器的內容、變址寄存器的內容乘以比例因子、位移量V三項之和
32位時IR不能是esp,
br中的來確定段
mov ax, 8[bx][si]
mov eax, –6[edi*2][ebp]
立即尋址 n 所提供額操作數是緊跟在指令碼後面的一個採用8位、16位或32位二進制補碼錶示的有符號書,構成指令的一部分
n是立即數,可以是佔用1個字節,2個字節,4個字節的存儲單元,具體的類型必須要表示出來,根據指令的其它部分來決定,n只能是常數或結果爲確定值的表達式,且只能做源操作數
mov word ptr [si],12h
add eax, -12345678h
直接尋址 段寄存器名:[n]
變量
變量+常量
操作數在主存儲器中,
n是一個數值或數值表達式時,直接表明操作數的偏移地址值,且爲無符號數,[n]不能指明段寄存器,所以加了一個段說明符,
變量或變量+常量的地址表達式在彙編過程中被轉換成“段寄存器名:[n]”的形式,期中n是彙編程序計算地址表達式得到的結果,
mov ds:[20h], cl
inc buf; (buf是定義的變量)
mov ax, array1
mov array, bx
sub cx, array3
mov dx, array4+3
(array* 是定義的變量)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章