(持續更新)oop
彙編指令
1.mov指令spa
mov是一個傳送指令,能夠實現如下操做:debug
- 將數據傳給寄存器,好比:mov al,10H
- 將寄存器中的值傳給寄存器,好比mov ax,bx
- 將內存單元中的值傳給寄存器,好比mov ax,[10]
- 將寄存器中的值傳給內存單元,好比mov ds:[0],ax
有一點須要注意,數據不能直接傳給段寄存器,好比mov ds,100H就是錯誤的。可是能夠將其餘寄存器中的值賦給段寄存器。段寄存器有cs,ds,ss,es等。若是你想知道爲何,那就能夠去了解一下關於每條指令的硬件實現。後面還有好多指令有一系列的限制,其限制都是與硬件實現有關的。code
補充一點須要注意的,當執行與內存單元相關的數據傳送時,中括號中的寄存器只能是四選一,這四個寄存器包括:bx,bp,si,di。四個寄存器在進行間接尋址時不能拆成8位的用(bp,si,di原本也只能支持16位,自己不能拆開)。舉個例子mov ax,[bx+100]是正確的,mov ax,[bl+1]是錯誤的。blog
此外,有的軟件不支持中括號中是數字,而且把括號中的數字當作內容來使用。針對這種狀況,比較保險的方法是在中括號前面加上段前綴,好比mov ds:[0]。內存
2.add指令 add指令用於實現兩個數的加法,好比asm
add ax,bx
該指令會將bx中的值加到ax上,而且結果會保存在ax中。須要注意的是,該指令不支持對段寄存器進行操做,不管段寄存器是做爲第一個操做數仍是第二個操做數。編譯
3.sub指令class
sub是一個減法指令,與add能夠當作一對,除了執行的是減法命令以外,其餘的與add徹底相同。好比在寄存器方面,sub也不支持對段寄存器進行操做。軟件
4.loop指令
loop在彙編中用做循環,會執行標號到loop之間的部分,循環結束條件是cx寄存器的值爲0。下面是一個例子,令ax寄存器中的值累加6次。
assume cs:code code segment mov ax,0 mov cx,6 s: inc ax loop s mov ax,4c00h int 21h code ends end
約定一下,(xxx)表明xxx寄存器中的值。
循環部分的執行流程爲,遇到loop指令的時候,(cx)先減1,若是(cx)==0,則循環結束,執行下一條語句,不然調到標號對應的位置。這裏有一個容易迷惑人的地方,就是若是先判斷(cx)-1的值,那循環只執行了5次,那如何作到的使(ax)爲6呢。緣由很簡單,在第一次遇到標號s對應的彙編指令時,該指令會執行一次,無視標號。(標號並非指令,只是起到指示地址的做用,編譯後會被轉化爲實際的地址。)只有在遇到loop指令時,纔會進行判斷,而後選擇是否跳轉到標號的位置執行相應的命令。
運行一下程序,執行debug程序,觀察程序運行的每一步。
inc第一次執行,cx寄存器並不受影響
執行到loop的時候,cx寄存器發生了變化。並且能夠看到,在被編譯後,s已經沒有了,變成了其實際的IP寄存器的位置0006。
後面就不全展現了。
5.div指令
該指令用於除法運算,除數存放在一個8位寄存器中,被除數在存放在ax中。獲得的商在al寄存器中,餘數在ah寄存器中。
下面是一個例子。
mov ax,26 mov bl,10 div bl
觀察一下寄存器中的值。
6.inc指令
在以前說到loop指令的時候已經演示過用法了,該指令的做用是使寄存器中的值自增1。(須要注意該命令一樣不能用於段寄存器)
7.and和or指令
and指令和or指令分別用來將兩個數據進行和、或的運算。舉個例子:
and ax,0000000011111111B or bl,11111111B
彙編中的數據
彙編語言支持數字型數據和字符型數據。
數字型數據支持3種數制,包括10進制,16進制和2進制,能夠靠後綴來區分。10進制沒有後綴,16進制後綴爲H,2進制後綴爲B,後綴不區分大小寫。
字符型數據則是直接寫上字符加單引號便可,好比mov al,'d'。