日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

实验16 编写包含多个功能子程序的中断例程

發布時間:2023/12/10 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 实验16 编写包含多个功能子程序的中断例程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本實驗是本書的第二個精華的實驗。到此可以總結,匯編的重點在于跳轉,這里的跳轉包括jmp,call(調用),int(中斷),這反映到操作系統上就是調用,線程、進程的切換,跳轉的本質是任務的切換,CPU的并行就是通過指令切換完成的,所以匯編是操作系統的基礎。再說跳轉,那就涉及到程序放在哪里,怎樣把指令指到想執行的程序上?分為兩種情況:一是不安裝程序,這種情況比較好辦,通過offset直接可以定位到程序的位置,然后通過jmp或者call找到位置執行;二是安裝程序,本實驗就是第二種情況。

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)

assume cs:codecode segment start: mov ah, 1mov al, 2int 7chmov ax, 4c00hint 21hcode ends end start
3,實驗結果:

t1.exe

masm t2.asm

link t2.obj

t2.exe

4,實驗體會

jmp,loop這類指令,編譯后后面跟的是兩個指令的距離,所以包含它們倆的代碼無論是復制還是安裝,都可以正常的運行;offset這個指令后得到的指令正在運行的程序所在的段的偏移地址,一旦復制安裝到其它地方一般就會出錯,所以在寫中斷例程時,一定要考慮中斷例程在0段下的偏移地址,而不是在安裝程序中的偏移地址。這段話結合上面的程序不難理解。

這段程序費了我兩天時間,有兩個問題,一是包含offset的中斷例程應該怎樣處理,這一點和loop,jmp混在一起了;二是往上有個老師說程序放在0:7e00處,但是我在dosbox出現了奇怪的問題,老師講的沒錯,他是在winxp上運行的,應該可以吧,但是在dosbox是確定不行的。








總結

以上是生活随笔為你收集整理的实验16 编写包含多个功能子程序的中断例程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。