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 現的偽指令有 源程式檔案中所有...