王爽《組合語言》 第三版 實驗8解析 超詳細)

2022-09-08 02:15:10 字數 2802 閱讀 1455

貼入**如下:

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