实验16 编写包含多个功能子程序的中断例程
本實驗是本書的第二個精華的實驗。到此可以總結,匯編的重點在于跳轉,這里的跳轉包括jmp,call(調用),int(中斷),這反映到操作系統(tǒng)上就是調用,線程、進程的切換,跳轉的本質是任務的切換,CPU的并行就是通過指令切換完成的,所以匯編是操作系統(tǒng)的基礎。再說跳轉,那就涉及到程序放在哪里,怎樣把指令指到想執(zhí)行的程序上?分為兩種情況:一是不安裝程序,這種情況比較好辦,通過offset直接可以定位到程序的位置,然后通過jmp或者call找到位置執(zhí)行;二是安裝程序,本實驗就是第二種情況。
1,安裝代碼
assume cs:codecode segment start: mov ax, cs mov ds, ax mov si, offset setscreen ;設置ds:si指向源地址 mov ax, 0 mov es, ax mov di, 200h ;設置es:si指目的地址 mov cx, offset setscreenend - offset setscreen ;設置cx傳輸長度 cld rep movsb mov ax, 0 ;設置中斷向量表 mov es, ax mov word ptr es:[7ch*4], 200h mov word ptr es:[7ch*4+2], 0 mov ax, 4c00hint 21h;---------------- setscreen:jmp short settable dw offset sub1 - offset setscreen + 200h,offset sub2 - offset setscreen + 200h,offset sub3 - offset setscreen + 200h,offset sub4 - offset setscreen + 200h set: push bxpush esmov bx, 0mov es, bxcmp ah, 3ja sretmov bl, ahxor bh, bhadd bx, bxadd bx, offset table - offset setscreen + 200hcall word ptr es:[bx] sret: pop espop bxiretsub1: push bx push cx push es mov bx,0b800h mov es,bx mov bx,0 mov cx,2000 sub1s: mov byte ptr es:[bx],' ' add bx,2 loop sub1s pop es pop cx pop bx ret sub2: push bx push cx push es mov bx,0b800h mov es,bx mov bx,1 mov cx,2000 sub2s: and byte ptr es:[bx],11111000b or es:[bx],al add bx,2 loop sub2s pop es pop cx pop bx ret sub3: push bx push cx push es mov cl,4 shl al,cl mov bx,0b800h mov es,bx mov bx,1 mov cx,2000 sub3s: and byte ptr es:[bx],al or es:[bx],al add bx,2 loop sub3s pop es pop cx pop bx ret sub4: push cx push si push di push es push ds mov si,0b800h mov es,si mov ds,si mov si,160 mov di,0 cld mov cx,24 sub4s: push cx mov cx,160 rep movsb pop cx loop sub4s mov cx,80 mov si,0 sub4s1: mov byte ptr [160*24+si],' ' add si,2 loop sub4s1 pop ds pop es pop di pop si pop cx ret setscreenend:nopcode ends end start
2,應用代碼(t2)
3,實驗結果:
t1.exe
masm t2.asm
link t2.obj
t2.exe
4,實驗體會
jmp,loop這類指令,編譯后后面跟的是兩個指令的距離,所以包含它們倆的代碼無論是復制還是安裝,都可以正常的運行;offset這個指令后得到的指令正在運行的程序所在的段的偏移地址,一旦復制安裝到其它地方一般就會出錯,所以在寫中斷例程時,一定要考慮中斷例程在0段下的偏移地址,而不是在安裝程序中的偏移地址。這段話結合上面的程序不難理解。
這段程序費了我兩天時間,有兩個問題,一是包含offset的中斷例程應該怎樣處理,這一點和loop,jmp混在一起了;二是往上有個老師說程序放在0:7e00處,但是我在dosbox出現(xiàn)了奇怪的問題,老師講的沒錯,他是在winxp上運行的,應該可以吧,但是在dosbox是確定不行的。
總結
以上是生活随笔為你收集整理的实验16 编写包含多个功能子程序的中断例程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: qpsk相点 matlab,qpsk调制
- 下一篇: 谷歌翻译用不了解决办法