彙編實驗八 分析乙個奇怪的程式

2021-09-02 22:25:06 字數 1417 閱讀 9938

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...