轉移指令:可以修改ip或者同時修改cs和ip的指令(jmp、loop、call)
總的來說,轉移指令就是可以控制cpu執行記憶體中某處**的指令。
8086的轉移行為有一下幾類:
由於轉移指令對ip的修改範圍不同,段內轉移,又分為:短轉移和近轉移
loop——》無條件轉移指令
jmp——》條件轉移指令
偽指令offset在組合語言中的由編譯器處理的符號,它的功能是取得標號的偏移位址。
assume cs:code
code segment
start: mov ax,offset start ;相當於mov ax,0
;start所標記的是**段的第一條指令,偏移位址為0
s: mov ax,offset s ;相當於mov ax,3
;s所標記的指令是**段中的第二條指令,第一條指令的長度為3byte,則s的偏移位址為3
code ends
end start
問題:有如下程式段,填寫兩條指令,使改程式在執行中將s處的第一條指令複製到s0處:
**如下:
;問題:有如下程式段,填寫兩條指令,使改程式在執行中將s處的第一條指令複製到s0處:
assume cs:code
code segment
s: mov ax,bx ;mov ax,bx機器碼佔兩個位元組
mov si,offset s
mov di,offset s0
mov dx,cs:[si]
;資料從**來
mov cs:[di],dx ;資料到**去
s0: nop ;cpu遇到nop指令什麼都不做,nop指令佔乙個位元組
nopcode ends
end s
8086cpu執行過程①cpu從cs和ip所組合出來的位址讀取資料,將指令放到指令緩衝器中
②ip=ip+所讀指令的位元組數
③執行指令緩衝器中的內容,跳轉到第一步
jmp s
mov bx,1000h
s: mov ax,1000h ;由觀察可得此時**jmp指令的機器碼是eb04**
再加一條指令:
jmp s
mov bx,1000h
mov bx,1000h
s: mov ax,1000h ;由觀察可得此時**jmp指令的機器碼是eb07**
jmp跳轉指令編譯後的機器碼和指令的長度有關
cpu在執行jmp指令的時候,並不需要跳轉的目的位址就可以實現對ip暫存器的修改,只要做乙個加法就好了
編譯器如何計算指令長度?
標號位址 - jmp指令後第乙個位元組的位址
jmp指令可能存在的乙個問題:
s: mov ax,1000h
jmp s ;jmp在下面
涉及到補碼:jmp指令的跳轉範圍:(向前跳 or 向後跳)將乙個正數變成二進位制之後按位取反(0變1,1變0),再加1
eg:5的二進位制:0000 0101
取反:1111 1010 +1 =1111 1011(fb)
;跳轉範圍也叫做位移範圍 八位位移(-128~127)
十六位位移(-32768~32767)
可以指定是八位位移還是十六位位移:
jmp short s(八位位移)
jmp near ptr s(十六位位移)
彙編 OFFSET操作符
offset 找到標記位置的操作符 assume cs code,ds data data segment db 128 dup 0 data ends stack segment db 128 dup 0 stack ends code segment start mov ax,bx mov ax...
LEA指令和OFFSET指令
lea 是機器指令,offset 是偽指令。lea bx,buffer 在實際執行時才會將變數buffer的位址放入bx mov bx,offset buffer 在編譯時就已經計算出buffer的位址為4300 假設 然後將上句替換為 mov bx,4300 lea可以進行比較複雜的計算,比如le...
偽指令dd 和 操作符dup
db define byte 定義位元組型資料 八位資料 dw define word 定義字型資料 十六位資料 dd double word 定義雙字型資料 三十二位資料 比如 data segment dd 1 dw 1 db 1 data ends 可以用debug觀察記憶體分配情況 問題 用...