《組合語言》讀書筆記(4) 乙個奇怪的程式

2021-04-15 10:45:32 字數 1201 閱讀 4243

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 short s

s1:mov ax,0

int 21h

mov ax,0

s2:jmp short s1

nopcodesg ends

end start

這個程式可以正常執行嗎???

我們知道程式中:

movdi,offset s

movsi,offset s2

movax,cs:[si]

movcs:[di],ax

四條指令的作用是將標號s2處的一條指令複製到標號s處。

這時我們應該關心所複製的語句"jmp short s1"對程式的影響:我們知道在段內直接短轉移指令所對應的

機器碼中,並不包含轉移的目的位址,而包含的是轉移的位移量(

如對此概念還不太熟悉,請檢視書中第

167頁的內容

)。也就是說,在源程式的編譯過程中,編譯器遇到『段內直接短轉移』[形如:jmp

short 標

號]時就會自動算出其要跳轉的位移量,以便程式在執行『段內直接短轉移』的指令時就根據位移量進行(向

前或向後)跳轉。通過除錯中的u命令我們可以看到指令's2:jmp short s1'所對應的機器碼是ebf6,

f6h(

-10d

的補碼)

就是跳轉的位移量[

此位移量也可由指令's2:jmp short s1'處的偏移位址18h減去指

令's2:jmp short s1'後乙個位元組的偏移位址22h得出

]。這時我們就知道了其實複製到標號s處的指令所對

應的機器碼就是ebf6(剛好取代兩個nop

所對應的機器碼),它的作用就是

將當前ip向前移動10個位元組。

當程式執行標號s0處的指令後,程式便跳到標號s處接著執行標號s處的指令。s處的指令的作用是向前

跳10位元組,於是便跳到了**中的第一條指令,繼續執行後便

實現了程式的正常返回。 

王爽組合語言 乙個奇怪的程式

先大概分析分析 程式從 start mov ax,0 開始執行,執行到s0時,已經將s處替換成了s2處的 jmp short s1.而程式編譯後,s2處的彙編語句 jmp short s1對應的機器碼是 ebf6 f6即 10的補碼 也就是說,此刻s處對應機器碼是ebf6。然後執行s0 jmp sh...

王爽 《組合語言》 讀書筆記 一 基礎知識

第一章 基礎知識 1.1 1.0 小結 1 彙編指令是機器指令的助記符,同機器指令一一對應。2 每種cpu都有自己的彙編指令集 機器語言指令集 3 cpu可以直接使用的資訊中儲存器中存放 4 在儲存器中指令和資料沒有任何區別,都是二進位制資訊 5 儲存單元從0開始順序編號 6 乙個儲存單元可以儲存8...

組合語言 筆記 第乙個程式

程式 4.1 assume cs code code segment mov ax,0123h mov bx,0456h add ax,bx add ax,ax mov ax,4c00h int 21h code ends end偽指令是由編譯器執行的指令 程式4.1 現的偽指令有 源程式檔案中所有...