《組合語言》 王爽第三版實驗8

2021-10-11 02:08:35 字數 1600 閱讀 9530

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

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

assume cs:code

code 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

nopcode ends

end start

經過執行,發現過程是這樣的:

1. mov ax, 0

2. s: nop

nop3. mov di, offset s

mov si, offset s2

mov ax, cs:[si]

mov cs:[di], ax ;將s2的**給了s

4. jmp short s ;跳到s

5. jmp short s1 ;在s的位置執行了s2的命令,向前10個位元組,一下子跳到 mov ax 4c00h去了

6. mov ax, 4c00h

為什麼會出現這種情況?是因為在編譯時,jmp short 命令編譯器已經確定好了位移的長度。

第乙個jmp對應

s0:  jmp short s
根據機器碼可知ebf0,它的位移是補碼f0,也就是11110000,最高位是1,所以是負數,其正數應該是00010000h= 16。

負數的補碼和正數的補碼相互轉換——從左到右複製,複製完乙個1, 後面全部取反即可

另一篇補碼文章

所以為-16。可以驗證一下,jmp後一位為0018h,s為0008h,0008h - 0018h = 8 - 24 = -16。

第二個jmp對應

s2:  jmp short s1
機器碼f6,也就是-10,驗證,0018h - 0022h = 24 - 34 = -10,本身這個-10,是從s1到s2的。

mov di, offset s

mov si, offset s2

mov ax, cs:[si]

mov cs:[di], ax

這段**將s2給了s。等到跳到s後,就執行了原先那個s2的命令。

jmp short s1 ;向前10位元組
在s處ip=8,減掉10就是0(不能小於0)。

《組合語言》王爽第三版 實驗9

datas segment 此處輸入資料段 db w 00000010b,e 00000010b,l 00000010b,c 00000010b,o 00000010b db m 00000010b,e 00000010b,0,t 00100100b,o 00100100b,0 db m 01110...

王爽 組合語言第三版實驗7

這個題目做了很久,使用了2中方法做出了結果,不過目前在單步除錯時還有點疑問。題目 power idea公司從1975成立一直到1995年的基本情況被定義到了datasg中,程式設計將datasg段中的資料寫入到table段中,並計算21年中的人均收入 取整 結果儲存到table段中 兩種方法我都使用...

《組合語言(第三版)》王爽,實驗九

不知道為什麼,在win7下用的emu8086,顯示會錯位,到不了中間位置 在網上找了下別人的 發現即使是在別人那裡能正常顯示在中間位置,複製到我這裡都會顯示為上圖所示的樣子。下面是 定義資料段的時候為了後面不用將ascii碼和屬性分開讀取,就定義成如下這樣比較繁瑣的形式了。其實做的時候第一時間沒想到...