程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 匯編語言 >> 匯編源碼系列之hdr

匯編源碼系列之hdr

編輯:匯編語言

這個都是過去DOS時代的匯編源碼,雖然已經過去了,但是對於學習匯編還是有幫助的,匯編語言只是程序員一門基礎語言,大多人掌握即可,不一定要深入研究.......

    PAGE  60, 132
TITLE  HDR   22-Feb-85    Device Driver Header          |
;-----------------------------------------------------------------------|
;                                    |
;    Device Driver Library                      |
;        Device Driver Header                  |
;                                    |
;-----------------------------------------------------------------------|
;    REVISION HISTORY                        |
;                                    |
; Number  DD-MMM-YY       WHO          WHY       |
;-------|---------------|-----------------------|-----------------------|
; 0.0  |  22-Feb-85  | Frank Whaley     | Initial Release    |
;-----------------------------------------------------------------------|
    PAGE
;-----------------------------------------------------------------------|
;    Equates                             |
;-----------------------------------------------------------------------|
StkSiz EQU   2048          ; local stack size
    PAGE
;-----------------------------------------------------------------------|
;    Group Selection                         |
;-----------------------------------------------------------------------|
PGROUP Group  PROG, TAIL
DGROUP Group  DATA, DTAIL
PROG  Segment Para Public 'PROG'
PROG  EndS
DATA  Segment Para Public 'DATA'   ; define first
DATA  EndS
    Assume CS:PROG, DS:DATA, ES:DATA, SS:DATA
    PAGE
;-----------------------------------------------------------------------|
;    Program Segment                         |
;-----------------------------------------------------------------------|
PROG  Segment Para Public 'PROG'
    Extrn  Init:Near,   MediaChe:Near, BuildBPB:Near
    Extrn  IoCtlIn:Near,  Input:Near,   ndInput:Near
    Extrn  InputSta:Near, InputFlu:Near, Output:Near
    Extrn  OutVerif:Near, OutStatu:Near, OutFlush:Near
    Extrn  IoCtlOut:Near, DevOpen:Near,  DevClose:Near
    Extrn  RemMedia:Near
    ORG   0
HDR   Proc  Far
;-----------------------------------------------------------------------|
;    Device Header                          |
;-----------------------------------------------------------------------|
    DD   -1           ; -> next device
;    DW   theAttribute      ; you must enter attribute field
    DW   8000H          ; character only device
    DW   Strategy        ; -> device strategy
    DW   Interrupt        ; -> device interrupt
;    DB   theName         ; you must put something here
    DB   "MON   "       ; mono
;-----------------------------------------------------------------------|
;    Code Segment Variables                     |
;-----------------------------------------------------------------------|
RHptr  DD   (?)           ; -> Request Header
ssEntry DW   (?)           ; entry SS
spEntry DW   (?)           ; entry SP
    PAGE
;-----------------------------------------------------------------------|
;    Device Strategy                         |
;                                    |
;    ENTRY : ES:BX -> Request Header                 |
;                                    |
;    EXIT : Request Header copied to ReqHdr             |
;        all registers preserved                 |
;                                    |
;-----------------------------------------------------------------------|
Strategy:
    MOV   Word Ptr CS:RHptr,BX  ; save request header ptr
    MOV   Word Ptr CS:RHptr + 2,ES
    PUSHF              ; (+1) save the world
    PUSH  ES           ; (+2)
    PUSH  DS           ; (+3)
    PUSH  SI           ; (+4)
    PUSH  DI           ; (+5)
    PUSH  CX           ; (+6)
    PUSH  BX           ; (+7)
    MOV   SI,BX
    MOV   BX,ES
    MOV   DS,BX          ; DS:SI -> Request Header
    MOV   BX,Offset PGROUP:TAIL
    MOV   CL,4
    SHR   BX,CL
    MOV   CX,CS
    ADD   BX,CX
    MOV   ES,BX
    MOV   DI,Offset DGROUP:ReqHdr ; ES:DI -> ReqHdr
    CLD
    XOR   CH,CH
    MOV   CL,[SI]
    REP   MOVSB          ; copy Request Header
    POP   BX           ; (+6) restore
    POP   CX           ; (+5)
    POP   DI           ; (+4)
    POP   SI           ; (+3)
    POP   DS           ; (+2)
    POP   ES           ; (+1)
    POPF              ; (+0)
    RET
    PAGE
;-----------------------------------------------------------------------|
;    Device Interrupt                        |
;                                    |
;    ENTRY : anything                        |
;                                    |
;    EXIT : all registers preserved                 |
;                                    |
;-----------------------------------------------------------------------|
Interrupt:
    PUSH  DS           ; (+1) save the world
    PUSH  ES           ; (+2)
    PUSH  AX           ; (+3)
    PUSH  BX           ; (+4)
    PUSH  CX           ; (+5)
    PUSH  DX           ; (+6)
    PUSH  SI           ; (+7)
    PUSH  DI           ; (+8)
    PUSH  BP           ; (+9)
    MOV   CS:ssEntry,SS      ; save entry SS
    MOV   CS:spEntry,SP      ; and SP
    MOV   AX,Offset PGROUP:TAIL  ; set our DS, SS, BP, and SP
    MOV   CL,4
    SHR   AX,CL
    MOV   CX,CS
    ADD   AX,CX
    MOV   BX,Offset DGROUP:MyStack
    MOV   DS,AX
    MOV   ES,AX
    MOV   SS,AX
    MOV   SP,BX
    MOV   BP,BX
    ;
    ; call our function
    ;
    MOV   AL,ReqHdr + 2      ; AL = Command Code
    SHL   AL,1
    CBW
    MOV   SI,Offset DGROUP:FuncTab
    ADD   SI,AX
    CALL  Word Ptr [SI]
    ;
    ; copy back Request Header
    ;
    LES   DI,RHptr        ; ES:DI -> original space
    MOV   SI,Offset DGROUP:ReqHdr ; DS:SI -> our (updated) copy
    CLD
    XOR   CH,CH
    MOV   CL,[SI]
    REP   MOVSB          ; copy Request Header
    MOV   SS,CS:ssEntry      ; restore original stuff
    MOV   SP,CS:spEntry
    POP   BP           ; (+8) restore
    POP   DI           ; (+7)
    POP   SI           ; (+6)
    POP   DX           ; (+5)
    POP   CX           ; (+4)
    POP   BX           ; (+3)
    POP   AX           ; (+2)
    POP   ES           ; (+1)
    POP   DS           ; (+0)
    RET
HDR   EndP
PROG  EndS
TAIL  Segment Public 'PROG'      ; for finding end of code segment
TAIL  EndS
    PAGE
;-----------------------------------------------------------------------|
;    Data Segment                          |
;-----------------------------------------------------------------------|
DATA  Segment Para Public 'DATA'
    Public ReqHdr
    DB   StkSiz DUP (?)     ; our stack, overflows into code
MyStack Label  Word
FuncTab Label Word
    DW   Offset PGROUP:Init
    DW   Offset PGROUP:MediaChe
    DW   Offset PGROUP:BuildBPB
    DW   Offset PGROUP:IoCtlIn
    DW   Offset PGROUP:Input
    DW   Offset PGROUP:ndInput
    DW   Offset PGROUP:InputSta
    DW   Offset PGROUP:InputFlu
    DW   Offset PGROUP:Output
    DW   Offset PGROUP:OutVerif
    DW   Offset PGROUP:OutStatu
    DW   Offset PGROUP:OutFlush
    DW   Offset PGROUP:IoCtlOut
    DW   Offset PGROUP:DevOpen
    DW   Offset PGROUP:DevClose
    DW   Offset PGROUP:RemMedia
ReqHdr DB   256 DUP (?)       ; copy of Request Header
DATA  EndS
DTAIL  Segment Public 'DATA'      ; for finding end of data segment
DTAIL  EndS
    END   HDR           ; of HDR.ASM


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved