王爽組合語言實驗8

2021-09-25 15:42:06 字數 2349 閱讀 3504

答:這個程式是可以正常返回的。

解析:

這個程式將

mov ax,4c00h

int 21h

放到了start標號的上面,codesg段的開頭,也就是這兩條指令的起始偏移位址是0.

這段程式的主要指令是

這幾條。我說明一下這幾條指令的作用。這幾天指令的作用看懂了,還有jmp指令的偏移量也明白了,那麼這題就迎刃而解。

mov di,offset s

作用:將s標號的偏移位址存放到di暫存器中

mov si,offset s2

作用:將s2標號的偏移位址存放到si暫存器中

mov ax,cs:[si]

作用:將s2標號的指令存放到ax中。

s2標號的指令是jmp short s1指令。

mov cs:[di],ax

作用: *將s標號的資料替換成ax暫存器裡的資料。也就是將s標號的兩個nop指令替換為jmp short s1指令。

上述這四條指令執行後就相當於下面的程式了

assume cs:codesg 

codesg segment

mov ax,4c00h

int 21h

start: mov ax,0

s: jmp short s1 ;將原來兩條nop指令替換成 jmp short s1指令

mov 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

nop

codesg ends

end start

上述這些如果看懂的話,那就往下說,說jmp指令的偏移量。

我們知道jmp指令中給出的是位移量而不是記憶體位址,這樣的好處是利於在記憶體的浮動裝配,意思就是說在記憶體哪一塊地方都可以正常執行。

那麼偏移量是怎麼計算的呢?

偏移量 = 目標標號的偏移位址 - jmp指令執行後的第一條指令的偏移位址。

這個程式中,

這條指令,jmp 0008,表示跳轉到偏移位址為8的地方。

可是機器指令是eb f0,而是給出的f0,這個f0是位移量,這是乙個補碼,不懂補碼的可以去其他地方搜尋答案,這裡就不講述了。

f0也就是-10(十六進製制)

f0 = 目標標號的偏移位址 - jmp指令後的第一條指令的偏移位址

f0 = 8 - 18 = -10

好了,回歸到本題。

上面說到將s2的指令jmp short s1指令送到s標號處。那我們看一下這條指令的機器碼是多少。

是eb f6,這條指令的位移量是f6,也就是-a(十六進製制)

我們執行上面那四條指令,檢視s標號的指令是否變了。

s標號的指令成功變為了eb f6了。

cpu執行這條指令後,ip = ip + 2 = a , a + f6 = a + -a = 0,

這個就是jmp指令執行後,下一條指令+位移量,就是要跳轉到標號處,

結果就跳轉到偏移位址為0的mov ax,4c00h處。

接下來就可以正常結束這個程式了。

王爽 組合語言 實驗10 1

assume cs code,ds data 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...

王爽 組合語言 實驗7

assume cs codesg,ds data ss stack data segment db 1975 1976 1977 1978 1979 1980 1981 1982 db 1983 1984 1985 1986 1987 1988 1989 1990 db 1991 1992 1993...

王爽 組合語言 實驗9

assume cs code data segment db welcome to masm db 00000010b,00100100b,01110001b data ends code segment start mov ax,data mov ds,ax mov si,07c0h 臨時,可調整...