1.ret指令用棧中的資料,修改ip內容,從而實現轉移。retf指令也是根據棧中的內容,修改cs和ip的內容,進行控制轉移。
2.call指令將當前的ip或cs和ip壓入棧中,然後進行跳轉。
3.call命令被送到cpu指令快取的時候,ip已經指向了call命令下一條指令,cpu執行call令後,是將call命令的下一條指令儲存到了棧中。
4.我們可以通過call指令和ret指令配合,實現函式的跳轉,也就是子程式的呼叫。
5. call 標號比如call code(標號),call可以根據位移進行轉移。這樣**無論放到**都可以正確執行,但是轉移的的偏移量有最大限制。
6.可以直接call乙個目的位址比如call far ptr 標號。
7.call 16為暫存器也是可以的,暫存器中存放轉移位址。
8.call也可以直接讀取記憶體中的位址進行轉移,比如call word ptr ds:[0],相當於進行了push ip;jmp word ptr。
9.call dword ptr ds:[0]相當於push cs;push ip;jmp dword ptr 記憶體位址。
10.子程式可以通過暫存器接受引數,通過暫存器儲存結果,但是更通用的做法應該是用棧。
11.為了解決主程式和子程式中暫存器衝突,也就是同乙個暫存器在兩個程式中使用的問題。子程式在執行前,需要把所有用到的暫存器儲存到棧中,執行後恢復暫存器中的內容,然後再返回。
12.兩個數相乘要麼是8位,要麼是16位,不能8位和16位相乘。
13.如果是8位,乙個預設放到al中,另乙個放到8位reg或記憶體位元組單元中。如果是16位,乙個預設在ax中,另乙個放到16位reg或者記憶體字單元中。結果8位乘法放到ax中,16位乘法高位放到dx,地位放到ax中。
14.mov [di].2,dx 把dx中的內容放到di+2的記憶體位址中。
15.標誌暫存器中的每乙個位都代表乙個標記。8086cpu中0,2,4,6,7,8,9,10,11位是有特殊含義的,其他位保留沒有含義。
16.zf標誌如果執行當前指令,結果是0那麼zf=1,不是0則zf=0。不是所有指令都會設定zf標誌,比如mov,push,pop。這些資料轉移的指令不會設定zf標誌。add sub mul div inc or and這些對資料進行操作的指令會設定zf標誌。
17.pf標誌,其結果的所有bit位中1的個數是否為偶數,是pf=1,不是(奇數),pf = 0。
18.sf標誌是符號標記為,也就是它只負責有符號數的邏輯意義,sf=1為負數,sf=0非負。這裡需要強調一下,對於cpu它是不會區分有符號和無符號的,這些都是程式設計師邏輯上的劃分。當兩個有符號的數進行相加溢位後,cpu依然會根據結果設定sf。但是這時候的sf標誌是錯誤的。甚至我們在做無符號運算的時候sf標誌也會設定,只是我們邏輯上不會去使用sf標誌位而已。
19.cf標誌位是針對無符號數使用的,加法的進製,減法的借位都會設定cf=1,沒有進製或者借位cf=0。
20.of標誌只針對有符號數,如果出現溢位of=1,沒有則of=0。
21.adc是帶進製的加法指令,adc ax,bx = (ax) + (bx) + cf。
22.為什麼要設計adc加法指令呢,如果兩個數都超過了16位,我們可以先將低16位相加,然後在用adc執行進行高位相加,這樣就可以實現任意大的資料的加法運算。
23.sbb可以實現任意大的資料減法。
24.cmp指令,實際上是將兩個運算元進行相減,然後通過標記位判斷兩個數的大小關係。
25.cmp指令針對無符號數和有符號數判斷的標記位不同。無符號數的邏輯是,zf = 1,(ax) = (bx)。 zf = 0,(ax) != (bx)。
cf = 1, (ax) < (bx)。cf = 0,(ax) >= (bx)。cf = 0 && zf = 0,(ax) > (bx)。 cf = 1 or zf = 1,(ax) <= (bx)。
25.cmp指令針對有符號數,因為sf存在溢位的情況,所以不能只通過sf判斷兩個數的大小。要結合of進行判斷。
26.sf = 1 && of = 0,說明沒有溢位(ah)<(bh),sf = 1 && of = 1,(ah) > (bh)如果因為溢位導致了實際結果位負,那麼邏輯上真正的結果必然為正。比如34-(-96) = 130,130溢位了,cpu當作有符號數解釋為-126,所以sf = 1,但是34 > -96。如果sf = 0 &&of = 1。如果因為溢位導致了實際結果為正,那麼邏輯上的真正結果必然為負。(ah) < (bh)。如果sf = 0 && of = 0,則說明(ah) >= (bh)。
27.cmp指令通常和轉移指令配合使用。比如cmp ah,bh; je s;。
28.無符號數的轉移指令je(等於則轉移),jne(不等於則轉移),jb(低於則轉移),jnb(不低於則轉移),ja(高於則轉移),jna(不高於則轉移)。
29.條件轉移指令實際上是根據標誌位進行判斷是否轉移的,所以理論上即使不用cmp,其他指令改變了標記為,也會影響轉移指令的結果。
30.df標誌位,是方向標誌位。df=0 每次操作後si,di遞增。df=1 每次操作後si,di遞減。cld指令設定df = 0。std指令設定df = 1。
31.movsb指令將ds:si指定的內容拷貝到es:di的位置。如果df=0則si = si + 1,di = di + 1。df = 1則si = si - 1; di = di - 1。
32.movsw和movsb類似只不過每一次偏移兩個位元組。
33.串傳送指令(movsw,movsb)一般會和rep指令共同完成傳輸操作。比如rep movsb相當於s:move sb;loop s。rep的次數根據cx的值決定。
34.pushf是將標誌暫存器的值壓棧,popf是將棧中彈出的資料,送入標誌寄存去。它們兩個位直接訪問狀態暫存器,提供了一種方法。
組合語言 a 基礎知識
本專題是學習王爽的 組合語言 第三版 的學習筆記。這本書按照作者的意思是要教會讀者怎樣去循序漸進地學習組合語言。首先,什麼是組合語言呢?組合語言是人和計算機溝通的最直接方式,它描述了機器最終所要執行的指令序列。作為一門底層的語言,其可以直接與計算機進行互動。注意此書中如果沒有能夠完成檢測點的內容,則...
組合語言基礎知識
1.1機器語言 1.機器語言機器語言是機器指令的集合。2.cpu central processing unit,處理單元 cpu是一種微處理器,由於硬體設計和內部結構的不同,就需要不同的電平脈衝來控制使它工作,所以每一種微處理器都有自己的機器指令集,也就是機器語言。1.2組合語言的產生 1.例如,...
組合語言 基礎知識
組合語言是直接在硬體之上工作的程式語言,首先要了解硬體系統的結構,才能有效的應用組合語言對程式設計。機器語言就是機器指令的集合 機器指令展開來講就是一台機器可以正確執行的指令 主體是彙編的指令,機器指令便於記憶的書寫格式。彙編指令是機器指令的助記符 暫存器簡單的說是cpu中可以儲存資料的器件,乙個c...