8086轉移指令有以下幾類:
無條件轉移指令,eg.jmp
條件轉移指令,eg.jz
迴圈指令,eg.loop
過程中斷
操作符offset在組合語言中是由編譯器處理的符號,它的功能是取得標號的偏移位址。
eg.start:mov ax,offset start
jmp指令:
jmp short 標號,實現段內短轉移,僅對ip修改,範圍是-128~127
注意,此短轉移儲存轉移的偏移的位移。即(ip)=(ip)+8位位移
1>8位位移=標號處的位址-jmp指令後第乙個位元組的位址
2>short指明此處的位移為8位位移
3>8位位移採用補碼表示,-128~127
4>8位位移由編譯程式在編譯時計算
與此類似的還有
jmp near ptr 標號,段內近轉移-32768~32767,16位位移
jmp far ptr 標號,實現段間轉移,又稱遠轉移,同時修改cs和ip
jmp 16位reg,修改ip,(ip) = (16位reg)
jmp word ptr 記憶體單元位址(段內轉移),實際修改ip,(ip) = ([...])
jmp dword ptr 記憶體單元位址(段間轉移),修改cs和ip,(cs)=([...+2]),(ip) = ([...]),就是說cs用記憶體單元的高位址。
jcxz指令:段內短轉移
jcxz 標號
條件(cx)=0跳轉到標號
所有條件轉移指令都是短轉移
loop指令:段內短轉移
loop 標號
條件(cx) != 0跳轉到標號
所有迴圈指令都是短轉移
在後續的試驗8中,出現乙個nop指令
nop指令的作用是什麼,通過nop指令的填充(nop指令乙個位元組),使指令按字對齊,從而減少取指令時的記憶體訪問次數。(一般用來記憶體位址偶數對齊,比如有一條指令,佔3位元組,這時候使用nop指令,cpu 就可以從第四個位元組處讀取指令了。) baidu了一下,發現有許多答案:
1)通過nop指令產生一定的延遲,但是對於快速的cpu來說效果不明顯,可以使用rep字首,多延遲幾個時鐘;-->具體應該說是占用了3個時鐘脈衝!
2)i/o傳輸時,也會用一下 nop,等待緩衝區清空,匯流排恢復;
3)清除由上乙個算術邏輯指令設定的flag位;
4)破解:)對於原程式中驗證部分使用nop來填充,使驗證失效;
5)有乙個朋友說的比較厲害--在太空梭控制程式中防止程式跳飛!
解釋如下:在空間放射性環境下,放射性子粒很容易使記憶體位元改變(呵呵,有點基因突變的感覺),這樣如果改變的是jump,call指令的存貯位置的話,就會導致程式跳轉到乙個不可以預置的位置,對於關鍵系統來說的確是災難性的。所以就在被呼叫程式之前填充nop指令,這樣即使跳轉到稍前或者稍後的位置,也不會造成影響。
這樣我想起"c tarp and fitfall"中舉的那個飛彈軟體中的致命錯誤:因為飛彈是以0.1s為單位進行記時的,但是由於浮點數沒有辦法精確的表示0.1,造成了舍尾誤差,這個誤差在飛彈開啟3天的之後逐漸的積累,結果誤差了一秒。
nop說明**:
《組合語言 第2版 2011041001
摘抄 call和ret指令都是轉移指令 詳細 ret指令用棧中的資料,修改ip的內容,實現近轉移 retf指令用棧中的資料,修改cs和ip的內容,實現遠轉移 cpu執行ret指令 ip ss 16 sp sp sp 2 cpu執行retf指令 ip ss 16 sp sp sp 2 cs ss 16...
《組合語言 第2版 2011033101
學習指令 and指令 邏輯與指令,按位進行與運算 and r m,r m data or指令 邏輯或指令,按位進行與運算 or r m,r m data 關於如何靈活訪問位址,以下用mov指令看定位記憶體位址 1 mov ax,bx idata 或mov ax,idata bx 記憶體位址 bx i...
ADS組合語言2
4.2 組合語言的語句格式 arm thumb 組合語言的語句格式為 在組合語言程式設計中,每一條指令的助記符可以全部用大寫 或全部用小寫,但不用許在一條指令中大 小寫混用。同時,如果一條語句太長,可將該長語句分為若干行來書寫,在行的末尾用 表示下一行與本行為同一條語句。4.2.1 在組合語言程式中...