assueme cs:codesg
codesg segment
mov ax,4c00h
int 21h
start: mov ax,0
s: nop
nopmov di,offset s
mov si,offset s2
mov ax,cs:[si]
mov cs:[di],ax
s0: jmp short s
s1: mov ax,0
int 21h
mov ax,0
s2: jmp short s1
nopcodesg ends
end start
分析:
start: mov ax,0
s: nop ; nop標號語句,在執行時在**段中分配乙個位元組的空間,
nop ; 這個位元組(空間)的值為90h。
; 操作符 `offset` 的功能是取得標號的偏移位址。
mov di,offset s ;將 s 的偏移位址存到 di 暫存器中
mov si,offset s2 ;將 s2 的偏移位址存到 si 暫存器中
mov ax,cs:[si] ;此行是將cs:[si]記憶體中的機器碼存到ax暫存器中
;這個機器碼是由編譯器將s2標號欄位中的指令編譯而成
mov cs:[di],ax ;將ax中的s2標號欄位的機器碼存放到s標號欄位中
s0: jmp short s ;跳轉到 s 標號欄位處執行**。
s: jmp short s1 ; 根據我們之前的分析, 指令是用相對偏移來表示的
; 因此執行的操作並不是真的跳轉到 s1 這個標號,
; 而是跳轉編譯時確定的 該指令到 s1 標號的偏移量。
; 所以我們要分析接下來程式的流程的話 , 就必須先編譯程式 ,
; 通過檢視這條指令的機器**,才知道偏移量是多少。
; 然後再根據這個偏移量確定程式下一步應該執行**的指令。
; 根據下圖的編譯結果 , 可以發現 ,
; jmp short s1 在編譯後得到的指令是 : eb f6
; 由上可知,偏移量是 :f6
; 偏移量是由 補碼 來表示的,由書中 附註二 ,
; 我們可以算出 f6對應的有符號十進位制數為 -10。
; 從這裡,我們可以知道,這條指令是將 ip 的值加上 -10。
; 那麼,我們再看看 ip - 10 指向的位址是**呢 ?
; 由下圖的編譯結果,我們可以知道,
; 它指向的剛好就是 code segment 開始的位置.
mov ax,4c00h
int 21h ;看到這兩句,大家就知道,程式是可以正常返回了
彙編實驗八 分析乙個奇怪的程式
預備知識 1 offset 獲取標號的偏移位址 2 jmp 依據位移進行跳轉 jmp short 標號 jmp near ptr 標號,jmp near ptr 標號 轉到標號處 3 jmp 轉到記憶體 jmp word ptr 位址,jmp dword ptr 位址 4 jcxz 有條件轉移 5 ...
實驗8 分析乙個奇怪的程式
仔細閱讀9.3節依據位移進行轉移的jmp指令,然後理解下面的這個很奇怪的程式就容易多了,當然要看著機器碼去分析。assume cs codesg codesg segment mov ax,4c00h int 21h start mov ax,0 s nop nopmov di,offset s m...
實驗8 分析乙個奇怪的程式
分析 assume cs codesg codesg segment mov ax,4c00h int 21h start mov ax,0 s nop nopmov di,offset s mov si,offset s2 mov ax,cs si mov cs di ax s0 jmp shor...