貼入**如下:
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標號的字段開始執行。
我們先來看一下程式的執行流程:
1. start: mov ax,0
2. s: nop ; nop標號語句,在執行時在**段中分配乙個位元組的空間,
3. nop ; 這個位元組(空間)的值為90h。
; 操作符 `offset` 的功能是取得標號的偏移位址。
4. mov di,offset s ; 將 s 的偏移位址存到 di 暫存器中
5. mov si,offset s2 ; 將 s2 的偏移位址存到 si 暫存器中
6. mov ax,cs:[si] ; 此行是將cs:[si]記憶體中的機器碼存到ax暫存器中,
; 這個機器碼是由編譯器將 s2 標號欄位中的指令編譯而成。
7. mov cs:[di],ax ; 將 ax 中的 s2 標號欄位的機器碼存放到 s 標號欄位中。
8. s0: jmp short s ; 跳轉到 s 標號欄位處執行**。
9. s: jmp short s1 ; 根據我們之前的分析, 指令是用相對偏移來表示的
; 因此執行的操作並不是真的跳轉到 s1 這個標號,
; 而是跳轉編譯時確定的 該指令到 s1 標號的偏移量。
; 所以我們要分析接下來程式的流程的話 , 就必須先編譯程式 ,
; 通過檢視這條指令的機器**,才知道偏移量是多少。
; 然後再根據這個偏移量確定程式下一步應該執行**的指令。
; 根據下圖的編譯結果 , 可以發現 ,
; jmp short s1 在編譯後得到的指令是 : eb f6
; 由上可知,偏移量是 :f6
; 偏移量是由 補碼 來表示的,由書中 附註二 ,
; 我們可以算出 f6對應的有符號十進位制數為 -10。
; 從這裡,我們可以知道,這條指令是將 ip 的值加上 -10。
; 那麼,我們再看看 ip - 10 指向的位址是**呢 ?
; 由下圖的編譯結果,我們可以知道,
; 它指向的剛好就是 code segment 開始的位置.
10. mov ax,4c00h
11. int 21h ;看到這兩句,大家就知道,程式是可以正常返回了
注意這裡使用 debug 的u
命令進行反彙編的時候要指定**段的偏移位址為 0 ,否則 debug 會自動從 start 標號的地方開始反彙編有時候單純從u 0
命令無法檢視到jmp short s1
這條**。因為有的命令列工具可能不能夠顯示過多的**。 我們可以從上圖中找乙個參照點,再次運用u
命令,就可以看到這行**了。從下圖中,我們可以看到,jmp short s1對應的機器**,正是eb f6
mov ax,4c00h ; 3位元組
int 21h ; 2位元組
2. start: mov ax,0 ; 3位元組
3. s: jmp short s1 ; 2位元組
; 上述4條指令總共加起來是10位元組,即 10 個單位的偏移量!
; 由於 nop 只佔乙個位元組 , 因此
; 原來 s 中的兩個 nop 被jmp short s1完全替代。
; cpu首先讀取這條指令到指令快取器裡
; 此時的ip為8(由上圖可以知道)
; 【文末的參考文章中的len(eb f6)解釋錯誤,應為2,此處已更正】
; 接下來 , (ip) = (ip) + len(eb f6) = (ip) + 2 = 10
; 然後執行這條指令 , 即為 (ip) = (ip) - 10 = 0
; 這樣 ip 就回到了 code segment 的起始處
; 這樣繼續執行
4. mov ax,4c00h
5. int 21h
; 這樣,程式就這樣神奇的執行成功啦!!!
運用王爽老師在p179頁的話,cpu在執行jmp指令的時候並不需要轉移的目的位址,而包含的是轉移的位移。這個位移,是編譯器根據彙編指令中的「標號」計算出來的。《組合語言》 王爽第三版實驗8
分析下面的程式,在執行前思考 這個程式可以正確返回嗎?執行後再思考 為什麼是這種結果 assume cs code code segment mov ax,4c00h int 21h start mov ax,0 s nop nopmov di,offset s mov si,offset s2 m...
王爽《組合語言》 第三版 實驗10解析
assume cs code data segment db welcome to masm 0 data ends code segment start mov dh,8 mov dl,3 mov cl,2 mov ax,data mov ds,ax mov si,0 call show str ...
《組合語言》王爽第三版 實驗9
datas segment 此處輸入資料段 db w 00000010b,e 00000010b,l 00000010b,c 00000010b,o 00000010b db m 00000010b,e 00000010b,0,t 00100100b,o 00100100b,0 db m 01110...