《組合語言》實驗8

2021-10-07 12:34:19 字數 1858 閱讀 9426

分析下面的程式,在執行前思考:這個程式可以正確返回嗎?

執行後再思考:為什麼是這種結果?

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的偏移值寫入了disi

由上圖我們可以知道,緊接著的兩條指令的作用是把s2標誌處的那條跳轉指令複製到了s處,所以此時s標誌處不再是nop指令,而是jmp short s1。根據程式,我們下一條指令會跳轉到s標誌處,也就是jmp 0008,(0008是s的偏移值)。

我們執行跳轉到s標誌的指令之後,系統提示我們,下一條指令是跳轉到0000處,為什麼會這樣呢?按道理我們這裡是把s2標誌處的跳轉指令給複製過來了,根據複製過來的跳轉指令,我們應該是跳到s1處才對,為什麼會跳到0000處呢?

根據之前學到的知識可以解釋。像jmpjcxzloop等指令,它們在執行時會對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...