青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

無我

讓內心永遠燃燒著偉大的光明的精神之火!
靈活的思考,嚴謹的實現
豪邁的氣魄、頑強的意志和周全的思考

[轉]匯編語言課程設計——調試并修改一個小的內存駐留程序(http://www.4ngel.net/article/31.htm)

匯編語言課程設計——調試并修改一個小的內存駐留程序
本文作者:Kasi
文章性質:原創
發布日期:2004-07-16

2004.4.18

一、課程設計之目的

  學習DOS下內存駐留程序的基本思想,了解與熟悉用匯編語言編寫程序。本課程設計將完成一個小的.com程序,運行程序后,你的所有按鍵輸入(指在DOS或Windows的DOS模式下)將不被接受,所有輸入將被替換成特定的字符串(回車鍵除外)。

二、內存駐留程序的基本框架(framework of a TSR)

  內存駐留程序的基本思想就是讓程序一直停留在內存中,不斷的執行特定的命令。但內存駐留如何被執行呢?一般地,內存駐留程序都是通過修改BIOS或DOS的系統中斷向量表來實現的。比如修改向量表中16H位置的中斷(這個中斷接收鍵盤的按鍵,在DOS中,按鍵按下,這個中斷就會被調用),讓其指向我的程序,這時若有按鍵被按下,則執行的是我的程序。下面是一個最簡單的框架:

CSEG SEGMENT
  ASSUME   CS:CSEG, DS:CSEG
  ORG    100H
Start:
  JMP    Initialize

new_keyboard_io PROC FAR // 這一部分是駐留在內存的內容
  STI
  NOP
  IRET
new_keyboard_io ENDP // 到這里結束

Initialize:
  MOV DX, OFFSET new_keyboard_io // 新的鍵盤處理程序
  MOV AL, 16H // 需更改的向量號(interrupt index)
  MOV AH, 25H // 更改系統中斷向量表
  INT 21H

MOV DX, OFFSET Initialize
  INT 27H // 將標簽Initialize前的程序駐留內存

CSEG ENDS
  END Start

三、實現原來設計程序

首先,我需要還是需要捕獲用戶的回車鍵,所以需要將原來的DOS本身的鍵盤處理程序保留起來。下面的代碼:

old_keyboard_io DD ?
……
Initialize:
……
  MOV AL, 16H          ; Interrupt index in vector table
  MOV AH, 35H          ; Get the interrupt dealing
  INT 21H            ; program's pointer
  MOV old_keyboard_io, BX    ; offset
  MOV old_keyboard_io[2], ES   ; base address
……

  old_keyboard_io用來儲存原鍵盤處理程序的指針,其中INT 21H – AH=35H,是獲得其指針,返回值在ES:BX中。ES是指針的基地址,BX是偏移量。

  其次,就是實現我原來設計的功能,截獲按鍵信息,并改為特定的字符串。下面的實現的代碼:

……
Hello_Msg DB 'Kasi, haha!'    ; string to display when catch a key-press
Msg_Index DW 0          ; which char in the string been displayed(char index)
……
new_keyboard_io PROC FAR
  ASSUME CS:CSEG, DS:CSEG
    STI

    CMP AH, 00H        ; INT 16H - AH = 0 to catch
    JE new_io_0        ; key-press func
    ASSUME DS:nothing
    JMP old_keyboard_io    ; No catch, jump to old handler
new_io_0:
    PUSHF
  ASSUME DS:nothing
    CALL old_keyboard_io
    CMP AL, 0DH        ; Is a ENTER been pressed ?
    JNE new_io_1       ; no, output string 'Kasi, haha!'
    MOV Msg_Index, 0     ; yes, reset the string index
    JMP new_io_done      ; and return
new_io_1:
    PUSH SI
    MOV SI, Msg_Index     ; Get current char index
    MOV AL, Hello_Msg[SI]   ; Get current char

    INC SI          ; Next char in the Hello_Msg
    CMP SI, 11        ; Reach the end of the Hello_Msg ?
    JNE new_io_2       ; no, jump
    MOV SI, 0         ; yes, set the char index to the beginning
new_io_2:
    MOV Msg_Index, SI     ; Save the char index
    POP SI
new_io_done:
    IRET
new_keyboard_io ENDP
……

  下面的分段說明:

    CMP AH, 00H        ; INT 16H - AH = 0 to catch
    JE new_io_0        ; key-press func
    ASSUME DS:nothing
    JMP old_keyboard_io    ; No catch, jump to old handler

  這一段代碼是根據書上抄下來的,先檢測AH中是否為0(INT 21H - AH=0表示用戶按下鍵盤),不為0就進入old_keyboard_io,由系統原來的處理程序去處理用戶的請求。這里”ASSUME DS:nothing”是告訴編譯器忽略DS的內容,這樣才能正確跳轉。

new_io_0:
    PUSHF
  ASSUME DS:nothing
    CALL old_keyboard_io
    CMP AL, 0DH        ; Is a ENTER been pressed ?
    JNE new_io_1       ; no, output string 'Kasi, haha!'
    MOV Msg_Index, 0     ; yes, reset the string index
    JMP new_io_done      ; and return

  如果是有按鍵被按下,則先檢測按鍵是否為回車鍵(0DH),如果不是則跳轉到new_io_1去處理,否則將字符串的索引置0(Msg_Inedx = 0)并結束程序。

new_io_1:
    PUSH SI
    MOV SI, Msg_Index     ; Get current char index
    MOV AL, Hello_Msg[SI]   ; Get current char

    INC SI          ; Next char in the Hello_Msg
    CMP SI, 11        ; Reach the end of the Hello_Msg ?
    JNE new_io_2       ; no, jump
    MOV SI, 0         ; yes, set the char index to the beginning
new_io_2:
    MOV Msg_Index, SI     ; Save the char index
    POP SI

  若用戶按下的不是回車鍵,將Hello_Msg[Msg_Index]這個字符放入AL中(因為AL是INT 21H – AH=16H調用的返回值)并讓Msg_Index的值加1,然后判斷Msg_Index是否指向Hello_Msg的尾部了,是的話將Msg_Index置0。
  這樣,就完成了整個程序。

四、調試程序

  程序寫好了,當然就要編譯和運行。編譯通過,但程序運行后卻沒有任何效果。
  按理說,程序應該是沒有問題的,但為何沒有任何效果呢?我懷疑new_keyboard_io是不是沒其作用,如何檢查錯誤呢?用debug一步步跟蹤顯然不明智,于是我在這里加了一個斷點:

new_keyboard_io PROC FAR
  ASSUME CS:CSEG, DS:CSEG
    STI
      INT 03H        ; break point
    CMP AH, 00H        ; INT 16H - AH = 0 to catch

  編譯運行,并在debug用a命令寫入

mov ah, 10
mov al, 00
int 21

  手動調用INT 21H – AH=16H,希望能在程序中停住,看new_keyboard_io是否被執行了。但我在debug中一t(trace),整個debug就出問題了,原因不明,看來不能用這種方法試驗。
  那我就換一個方法,用一個沒有任何命令的new_keyboard_io作測試,代碼如下:

CSEG SEGMENT
  ASSUME CS:CSEG, DS:CSEG
  ORG 100H
Start:
  JMP Initialize
new_keyboard_io PROC FAR
  ASSUME CS:CSEG, DS:CSEG
    STI
      NOP
    IRET
new_keyboard_io ENDP
Initialize:
  ASSUME CS:CSEG, DS:CSEG
    MOV DX, OFFSET new_keyboard_io
    MOV AL, 16H
    MOV AH, 25H
    INT 21H

    MOV DX, OFFSET Initialize
    INT 27H

CSEG ENDS
  END Start

  編譯運行之后,任何按鍵輸入都不起作用了,看來new_keyboard_io還是被執行了的,那問題就出現在我寫的new_keyboard_io的代碼里面了。我查了查書,INT 21H – AH=00H是接受按鍵消息的啊。但我還發現了一個INT 21H – AH=10H也是接受鍵盤消息的,會不會DOS在提示符(c:\>)下用的是AH=10H呢?我馬上在原程序中加了一下代碼:

……
    CMP AH, 00H        ; INT 16H - AH = 0 to catch
    JE new_io_0        ; key-press func
;-------------------------------
; In the DOS prompt(C:>), DOS uses
; INT 16H - AH = 10H to get a char, not
; AH = 00H
    CMP AH, 10H        ; new added codes
    JE new_io_0
;-------------------------------
    ASSUME DS:nothing
    JMP old_keyboard_io    ; No catch, jump to old handler
……

  然后編譯運行,一切OK!看來是書上的代碼給錯了。(注:我只是在Win98的MS-DOS環境下調試的,不知道純DOS用的是AH=00H還是AH=10H)

五、參考書目

  《IBM PC Assembly Language and Programming(Fourth Edition)》, Peter Abel, Prentice Hall, 1998

  《DOS內存駐留程序設計與實例》,李振格等,北京航空航天大學出版社,1994

 

  附:打包下載

  trick.asm   匯編源程序
  trick.com   編譯好的com程序
  trick_d.asm  用于調試的源程序
  trick_d.com  編譯好的測試程

                                       Copyright © 2004 Security Angel Team [S4T] All Rights Reserved.

posted on 2009-09-25 18:03 Tim 閱讀(502) 評論(0)  編輯 收藏 引用 所屬分類: 匯編語言

<2011年7月>
262728293012
3456789
10111213141516
17181920212223
24252627282930
31123456

導航

統計

公告

本博客原創文章,歡迎轉載和交流。不過請注明以下信息:
作者:TimWu
郵箱:timfly@yeah.net
來源:m.shnenglu.com/Tim
感謝您對我的支持!

留言簿(9)

隨筆分類(173)

IT

Life

搜索

積分與排名

最新隨筆

最新評論

閱讀排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲一区二区三区在线观看视频| 亚洲一区中文| 美女主播一区| 亚洲欧美日韩一区二区三区在线| 亚洲激情视频在线| 国内成+人亚洲+欧美+综合在线| 国产精品www网站| 国产精品久久久一本精品| 欧美午夜在线| 国产一区二区三区的电影 | 一本色道久久88亚洲综合88| 亚洲精品在线观看视频| 一本色道88久久加勒比精品| 亚洲男女自偷自拍图片另类| 午夜欧美大片免费观看| 亚洲欧美日韩电影| 久久久青草青青国产亚洲免观| 久久久久看片| 亚洲精品美女免费| 欧美激情无毛| 在线亚洲电影| 久久久99精品免费观看不卡| 欧美国产日韩a欧美在线观看| 欧美特黄一级大片| 国产自产高清不卡| 正在播放亚洲一区| 久久在线91| 一本大道久久a久久综合婷婷| 欧美一区二区三区在线| 欧美日韩不卡| 午夜欧美视频| 蜜臀久久99精品久久久画质超高清 | 久久激情五月婷婷| 欧美高清你懂得| 国产欧美日韩中文字幕在线| 在线日韩欧美视频| 香蕉久久夜色精品| 最新国产成人在线观看| 欧美在线观看一区二区| 欧美日韩国产一区精品一区 | 久久国产精品久久国产精品| 欧美xx视频| 国产亚洲一区二区三区在线观看 | 午夜亚洲视频| 亚洲黄色片网站| 欧美综合国产| 欧美午夜视频网站| 亚洲人成网在线播放| 国产精品视频yy9299一区| 亚洲电影专区| 久久综合色一综合色88| 亚洲视频在线视频| 欧美福利视频一区| 在线欧美三区| 久久久久9999亚洲精品| 亚洲一区二区三区色| 欧美久久久久久蜜桃| 亚洲国产精品福利| 久久这里有精品15一区二区三区| 亚洲一区二区av电影| 欧美日韩亚洲一区在线观看| 亚洲精品久久久久| 亚洲国产精品久久久久婷婷老年| 久久久久久自在自线| 精品动漫av| 男女激情久久| 欧美chengren| 日韩亚洲一区二区| 亚洲精品一区二区三区樱花 | 亚洲午夜精品久久| 欧美丝袜第一区| 午夜亚洲福利在线老司机| 中文网丁香综合网| 欧美三级日韩三级国产三级 | 久久中文在线| 日韩天堂在线观看| 亚洲激情专区| 欧美日韩国产三区| 中文国产亚洲喷潮| 亚洲手机成人高清视频| 久久综合给合久久狠狠狠97色69| 国产亚洲福利一区| 噜噜噜躁狠狠躁狠狠精品视频| 久久理论片午夜琪琪电影网| 亚洲黑丝一区二区| 99在线精品观看| 国产午夜精品全部视频在线播放| 久久影院午夜论| 欧美伦理视频网站| 午夜久久99| 久热re这里精品视频在线6| 亚洲国产一区二区三区a毛片| 亚洲欧洲精品一区二区三区波多野1战4 | 亚洲神马久久| 亚洲主播在线| 韩日在线一区| 亚洲精品久久久久久久久久久| 欧美天堂亚洲电影院在线观看| 欧美专区福利在线| 久久综合一区| 亚洲视频电影在线| 欧美一区观看| 欧美日本精品| 久久噜噜亚洲综合| 欧美日韩一区二区高清| 久久av在线| 欧美日韩mv| 欧美激情一区在线观看| 国产日韩精品一区二区三区在线| 亚洲激情视频| 在线观看中文字幕亚洲| 亚洲欧美日韩成人| 亚洲素人一区二区| 免费永久网站黄欧美| 久久久久久网站| 国产欧美日韩激情| aa成人免费视频| 一二三四社区欧美黄| 久久综合导航| 久久综合色8888| 国产欧美精品一区二区三区介绍| 亚洲人成人99网站| 亚洲狠狠丁香婷婷综合久久久| 欧美一区影院| 欧美亚洲网站| 欧美视频久久| 欧美激情aⅴ一区二区三区| 国产一区二区高清| 一区二区欧美视频| 夜夜狂射影院欧美极品| 嫩模写真一区二区三区三州| 久久久久久久999| 国产色产综合产在线视频| 亚洲欧美国产日韩中文字幕| 亚洲欧美国产日韩天堂区| 欧美日韩亚洲一区二区三区四区| 欧美高清视频在线| 亚洲高清123| 免费成人黄色片| 欧美黑人一区二区三区| 亚洲国产另类 国产精品国产免费| 久久精品视频播放| 久久久青草青青国产亚洲免观| 国产日韩精品一区二区三区在线| 久久久噜噜噜久久| 国产综合色产| 久久亚洲精品欧美| 欧美xxx成人| 国内视频精品| 欧美黑人多人双交| 亚洲免费小视频| 国产亚洲精品久| 国产日韩精品一区二区浪潮av| 国产精品推荐精品| 亚洲精品系列| 欧美国产精品久久| 欧美激情在线观看| 久热精品在线视频| 久久精品免视看| 国产麻豆精品在线观看| 夜夜爽夜夜爽精品视频| 欧美日韩一区二区在线视频| 国产一区二区电影在线观看| 宅男66日本亚洲欧美视频| 亚洲另类视频| 亚洲无线观看| 欧美三级网址| 久久美女性网| 欧美一区二区三区免费在线看| 久久大逼视频| 久久久国产视频91| 亚洲伊人一本大道中文字幕| 欧美一区二区福利在线| 亚洲精品乱码久久久久久黑人| 久久久久99| 美女精品在线观看| 国产精品女人久久久久久| 欧美吻胸吃奶大尺度电影| 美女啪啪无遮挡免费久久网站| 亚洲区一区二| 久久精品国产在热久久| 日韩一级在线观看| 99精品久久免费看蜜臀剧情介绍| 亚洲精品中文字幕在线| 久久精品国产清自在天天线| 欧美1区2区| 久久精品99| 亚洲桃花岛网站| 亚洲精品字幕| 欧美电影在线观看| 亚洲国产欧美日韩| 国产精品99久久久久久宅男| 欧美国产精品中文字幕| 久久久www成人免费无遮挡大片| 国产精品国产三级国产普通话蜜臀 | 久久综合图片| 亚洲第一在线综合在线| 一本一本久久a久久精品综合妖精 一本一本久久a久久精品综合麻豆 | 亚洲你懂的在线视频| 欧美日本国产一区|