組合語言王爽第三版 實驗12 0號中斷的處理程式

2021-09-23 22:02:23 字數 1940 閱讀 2639

實驗 編寫0號中斷處理程式
movsb rep cel

movsb即字串傳送指令,這條指令按位元組傳送資料。通過si和di這兩個暫存器控制字串的源位址和目標位址,比如ds:si這段位址的n個位元組複製到es:di指向的位址,複製後ds:si的內容保持不變。

movsb 的英文是 move string byte,意思是搬移乙個位元組,

它是把 ds:si 所指位址的乙個位元組搬移到 es:di 所指的位址上,搬移後原來的內容不變,但是原來 es:di 所指的內容會被覆蓋而且在搬移之後 si 和 di 會自動地指向下乙個要搬移的位址。 一般而言,通常程式設計師一般並不會只搬乙個位元組,通常都會重複許多次,

如果要重複的話,就得把重複次數 ( 也就是字串長度 ) 先記錄在 cx 暫存器,

並且在 movsb 之前加上 rep 指令,

rep 是重複 (repeat) 的意思。這種寫法很是奇怪,一般而言組合語言原始檔的每一行都只有乙個指令,但 rep movsb 卻可以在同一行寫兩個指令,當然分開寫也是一樣的。

通過標誌位df控制移動的方向,cld(clear direction flag)則是清方向標誌位,也就是使df的值為0,在執行串操作時,使位址按遞增的方式變化,這樣便於調整相關段的的當前指標。這條指令與std(set direction flag)的執行結果相反,即置df的值為1。

例如:

mov cx ,100

lea si,first

lea di,second

rep movsb

以上程式段的功能是從緩衝區first傳送100個位元組到second緩衝區.

程式中就是通過這些步驟,把中斷程式寫入目標位址的。

實際執行結果

螢幕中間 白底藍字 處顯示了字串"divide error!"

mov cx,offset do0end - offset do0 ;這一步是用來測量轉移**長度

cldrep movsb ;這兩步**請參考上面的解釋

mov ax,0

mov es,ax

mov word ptr es:[0*4],200h

mov word ptr es:[0*4+2],0

;以上的**是設定中斷表,

也就是說將執行中斷程式**所在的位址寫進去讓中斷機制呼叫

mov ax,4c00h

int 21h

do0: jmp short do0start

db 'divide error!'

do0start: mov ax,cs

mov ds,ax

mov si,202h

mov ax,0b800h

mov es,ax

mov di,12*160+36*2

;這是顯示器中間位置的

mov ah,71h;這是設定字型的樣式,詳細去見好像是第十章的實驗這樣子

mov cx,13

s: mov al,[si]

mov es:[di],al

mov es:[di+1],ah

inc si

add di,2

loop s

mov ax,4c00h

int 21h

do0end: nop

code ends

end start

《組合語言》王爽第三版 實驗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碼和屬性分開讀取,就定義成如下這樣比較繁瑣的形式了。其實做的時候第一時間沒想到...