四、串指令
───────────────────────────────────────
ds:si 源串段暫存器 :源串變址.
es:di 目標串段暫存器:目標串變址.
cx 重複次數計數器.
al/ax 掃瞄值.
d標誌 0表示重複操作中si和di應自動增量; 1表示應自動減量.
z標誌 用來控制掃瞄或比較操作的結束.
movs 串傳送.
( movsb 傳送字元. movsw 傳送字. movsd 傳送雙字. )
cmps 串比較.
( cmpsb 比較字元. cmpsw 比較字. )
scas 串掃瞄.
把al或ax的內容與目標串作比較,比較結果反映在標誌位.
lods 裝入串.
把源串中的元素(字或位元組)逐一裝入al或ax中.
( lodsb 傳送字元. lodsw 傳送字. lodsd 傳送雙字. )
stos 儲存串.
是lods的逆過程.
rep 當cx/ecx<>0時重複.
repe/repz 當zf=1或比較結果相等,且cx/ecx<>0時重複.
repne/repnz 當zf=0或比較結果不相等,且cx/ecx<>0時重複.
repc 當cf=1且cx/ecx<>0時重複.
repnc 當cf=0且cx/ecx<>0時重複.
五、程式轉移指令
───────────────────────────────────────
1>無條件轉移指令 (長轉移)
jmp 無條件轉移指令
call 過程呼叫
ret/retf過程返回.
2>條件轉移指令 (短轉移,-128到+127的距離內)
( 當且僅當(sf xor of)=1時,op1
ja/jnbe 不小於或不等於時轉移.
jae/jnb 大於或等於轉移.
jb/jnae 小於轉移.
jbe/jna 小於或等於轉移.
以上四條,測試無符號整數運算的結果(標誌c和z).
jg/jnle 大於轉移.
jge/jnl 大於或等於轉移.
jl/jnge 小於轉移.
jle/jng 小於或等於轉移.
以上四條,測試帶符號整數運算的結果(標誌s,o和z).
je/jz 等於轉移.
jne/jnz 不等於時轉移.
jc 有進製時轉移.
jnc 無進製時轉移.
jno 不溢位時轉移.
jnp/jpo 奇偶性為奇數時轉移.
jns 符號位為 "0" 時轉移.
jo 溢位轉移.
jp/jpe 奇偶性為偶數時轉移.
js 符號位為 "1" 時轉移.
3>迴圈控制指令(短轉移)
loop cx不為零時迴圈.
loope/loopz cx不為零且標誌z=1時迴圈.
loopne/loopnz cx不為零且標誌z=0時迴圈.
jcxz cx為零時轉移.
jecxz ecx為零時轉移.
4>中斷指令
int 中斷指令
into 溢位中斷
iret 中斷返回
5>處理器控制指令
hlt 處理器暫停, 直到出現中斷或復位訊號才繼續.
wait 當晶元引線test為高電平時使cpu進入等待狀態.
esc 轉換到外處理器.
lock 封鎖匯流排.
nop 空操作.
stc 置進製標誌位.
clc 清進製標誌位.
cmc 進製標誌取反.
std 置方向標誌位.
cld 清方向標誌位.
sti 置中斷允許位.
cli 清中斷允許位.
六、偽指令
───────────────────────────────────────
dw 定義字(2位元組).
proc 定義過程.
endp 過程結束.
segment 定義段.
assume 建立段暫存器定址.
ends 段結束.
end 程式結束.
3.4 再談暫存器和記憶體的區別
第零講說到「暫存器在cpu中。內存在記憶體條中。前者的速度比後者快100倍左右。後面的程式要求每條指定要麼沒有記憶體資料,要麼在有乙個暫存器的參與下有乙個記憶體資料。(也就是說,不存在只訪問記憶體的指令)。」
暫存器是在cpu中的儲存器,而記憶體是在記憶體條中的儲存器。cpu訪問暫存器,只需要通過微指令直接就可以訪問,而訪問記憶體則要先經過匯流排,再由匯流排到達記憶體控制器,讀到某單元的記憶體資料後放上匯流排,再傳到cpu中,cpu才能使用。
8086系列計算機的暫存器,共有14個,每個都是十六位的。
ax,bx,cx,dx,sp,bp,si,di,cs,ds,ss,es,ip,flags。
其中前四位,每個可以單位再分成兩個,ax=ah+al,bx=bh+bl,cx=ch+cl,dx=dh+dl。這些分開的每個都是8位的。
這個分開不要理解成平時語言中的分開,你可以理解為ax是由ah和al組合成的,你給al付值,就意味著同時給ax的低半部付值。你給ax付值,就意味著同時改變ah和al。這樣作的好處是你可以更靈活地控制這個暫存器。
3.5 指令說明
看了3.3的指令集和3.4的暫存器,是不是已經了,或者了?不要急,上面的東西雖然多,我也沒讓你一下學會,(其實有些永遠也不會似乎也不是什麼大不了的事)。為了應付看的懂我後面所說的,我把其中的指令挑幾個重點的,你必須要記住,其它的慢慢學吧。
1資料傳輸指令。
mov a,b
注意不是move,這個指令是把b中的資料複製給a,(b中仍儲存原狀)。這裡的a和b可以是暫存器,可以是記憶體。但可以同時是暫存器,不能同時是記憶體。比如
mov ax,100 ;這是對的,注意100在這裡叫立即數,但這個數在編譯系統編譯成exe的時候儲存在記憶體中。如果學過別的高階語言,你就可以理解為這就是賦值語句 let ax=100/ax:=100;/ax=100。
2 偽指令
偽指令就是不是真的指令,但他同時又是指令。之所以說這樣矛盾的話,是因為偽指令不是機器語言的一部分,而是組合語言的一部分,是你告訴彙編的編譯系統如何去作。
string db '這是我的第乙個組合語言程式$'
上面一行指令中,db就是偽指令,他的作用就是告訴編譯程式,把後面一些資料或字串放到記憶體中。當然對於exe來說,已在記憶體中了,就不用「告訴」了。(這就是為什麼叫偽指令)。string是你給這段記憶體起的名字,如果你不需要這段記憶體,不起名字也可以,但如果後面要用,當然要加上這個名字。'這是我的第乙個組合語言程式$'這個就是要處理的資料,當然你也可以換成別的內容,但需要注意的是,要以'$'結尾,這是彙編的約寫,即:只是到了$,就認為字串結束,否則就一直向下找,直到找到乙個$為止。所以這就要求你的字串中不能有'$',如果必須有,再換別的處理方式,後面再說。
3 位址傳送指令
lea a,string
前面已經定義了string,後面要把位址找到,就要用到lea指令。lea是把字串的位址給a這個暫存器中,a當然可以上前面提到的任意暫存器。注意位址和內容的區別。如果是內容就是把string的字串給a了。(當然這也不成立,乙個字串有很多位元組,而乙個暫存器只有兩個位元組)。
那麼從上面也看到了,string代表乙個位址,lea把這個位址給了a,那這個位址到底在**呢?事實上這不重要,就象你要把某書店買書,這個書店在哪並不是最重要的,有沒有你要的書才是最重要的。所以你前面標出string,後面引用就行了,至於這個位址到底在哪是編譯程式的事,不是你的事。
4 運算指令
add a,n
這個很容易理解吧,暫存器a加上n,把和仍存在a中。類似於高階語言中的let a=a+n/a:=a+n/a+=n。
5 串操作指令
記住串操作指令表面很複雜,其實很簡單。
因為他就象乙個複雜的數學公式一樣簡單,你所要記住的就是公式的格式,使用時具體套用即可。
從乙個位址到另乙個位址的複製需要注意的是:
*把源串段位址給ds。
*把源串編址給si。
*把目的串段址給es。
*把目的串偏址給di。
*把要複製的個數給cx,這裡可不考慮$了。
*把flag中的方向標誌標誌你要的方向,乙個是順向,另乙個是逆向。
*傳送loop movs,scans等命令。
6 轉移指令
記住:無條件轉移指令 jmp。等於轉 jz,不等於時轉jnz
7 中斷指令
int 中斷號,注意進製,預設是十進位制,所以十六進製制就加h。
好了,上面的指令變成七八個了,這你不能嫌多了吧,如果再嫌多就不要繼續向下看了。
彙編入門指南
2.介紹 常見概念 3.推薦資源 本教程按照作者親身經歷和 x86組合語言 從實模式到保護模式 寫成 為什麼要學彙編?眾所周知,彙編是比較早期的一種程式語言和低階語言,雖然比不上高階語言的可讀性和效率,但這種語言作為最接近機器碼的語言可以很好的幫助我們了解最底層相關機制。mov指令是資料傳送指令 如...
mips 彙編入門 helloworld
原始碼如下 hello.s vb view plain copy text segment text globl main main execution starts here la a0,str put string address into a0 li v0,4 system call to p...
PIC彙編入門示例
將20h單元低4位取出存入21h,高四位取出存入22h 要點 andlw和swapf movf 20h,0 將20h單元的內容送人w andlw 0fh w高四位清零低4位保持不變 movwf 21h 將拆分後的低4位送21h swapf 20h,0 將20h單元內容高 低半位元組換位後送w and...