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 |
|
|
無 |
五、位操作指令
指令名稱 |
彙編語句格式 |
功能 |
影響標誌位 |
求反 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* 是定義的變量) |