分析下面的程式,在執行前思考:這個程式可以正確返回嗎?
執行後再思考:為什麼是這種結果?
assume cs:codesg
codesg segment
mov ax,
4c00h
int21hstart:
mov ax,
0s:
nopnop
mov di,offset s
mov si,offset s2
mov ax,cs:
[si]
mov cs:
[di]
,axs0:
jmp short s
s1:
mov ax,
0int
21h mov ax,
0s2:
jmp short s1
nopcodesg ends
end start
在執行前,單看這個程式,我個人覺得是不能夠正確返回的,因為他把返回的標識放到了**段的開頭,卻沒有給出跳轉到該標識的方式。
然後試著執行一下:
居然成功返回了。
為什麼是這種結果呢?我們可以debug一下。
我們首先單步執行程式兩次,執行的是前面兩條nop
指令,該指令不會產生任何的效果,只會消耗兩個始終週期。但是有乙個值得我們注意的地方是:執行第一條nop
指令的時候,cs
的值為076a,ip
的值為0008。也就是說,我們將結束的標識成功的寫入了**段的前8個位元組中。
接下來這兩條指令分別把標誌s和標誌s2的偏移值寫入了di
和si
。
由上圖我們可以知道,緊接著的兩條指令的作用是把s2標誌處的那條跳轉指令複製到了s處,所以此時s標誌處不再是nop
指令,而是jmp short s1
。根據程式,我們下一條指令會跳轉到s標誌處,也就是jmp 0008
,(0008是s的偏移值)。
我們執行跳轉到s標誌的指令之後,系統提示我們,下一條指令是跳轉到0000處,為什麼會這樣呢?按道理我們這裡是把s2標誌處的跳轉指令給複製過來了,根據複製過來的跳轉指令,我們應該是跳到s1處才對,為什麼會跳到0000處呢?
根據之前學到的知識可以解釋。像jmp
,jcxz
,loop
等指令,它們在執行時會對ip
進行修改,但是它們對ip
的修改是根據轉移目的位址和轉移起始位址之間的位移來進行的。在s2標誌處的那條指令,它的作用就是把ip
往回修改8個單位(因為s1和s2之間的位移是8)。所以將這條指令複製到s處,在執行時,它也會往回修改8個單位,從而跳轉到我們一開始定義的結束語句,結束程式。
這就解釋了為什麼我們沒有在定義的結束語句那裡設定標誌,但依然能夠跳轉到結束語句並結束程式的。
《組合語言》實驗 實驗
注意 db定義位元組型別變數,乙個位元組資料百佔1個位元組單度元,讀完乙個,偏移量加1 dw定義字型別變問量,乙個字資料佔2個位元組單元,讀完乙個,權偏移量加2 dd定義雙字型別變數版,乙個雙字資料佔4個位元組單元,讀完乙個,權偏移量加4 一開始用了乙個暫存器表示所有項,但是後來發現四個資料佔的位元...
王爽組合語言實驗8
答 這個程式是可以正常返回的。解析 這個程式將 mov ax,4c00h int 21h 放到了start標號的上面,codesg段的開頭,也就是這兩條指令的起始偏移位址是0.這段程式的主要指令是 這幾條。我說明一下這幾條指令的作用。這幾天指令的作用看懂了,還有jmp指令的偏移量也明白了,那麼這題就...
組合語言實驗1 2
小寫字母變為大寫字母 data segment notic db please input the word 0ah,0dh data ends code segment assume cs code,ds data start mov ax,data mov ds,ax 填入ds mov cx,1...