庞大资源库的计算机教程网站!
设为首页
加入收藏
总编信箱
投稿或申请专栏请先 [登 陆]
首页 操作系统 程序设计 图形图像 媒体动画 机械电子 WEB开发 数 据 库 办公系列 路由技术 网络原理 网络应用
认证考试 安全技术
首页>程序设计>汇编语言>相关源码>正文
资料搜索
Google搜索
Google
返回上级列表

推荐文章

快速保存网页中所有图片的方法
Windows中让光驱巧妙“隐身”技
防范非法用户入侵Win 2000/XP系
两款比较典型的ASP木马防范方法
有关表格边框的css语法整理
Windows XP中可以被禁用的服务
SQL Server导出导入数据方法
Javascript所有对象的属性的获
网页(HTML)中的特殊字符
与篮球共舞,尽显模式本色
QQ病毒的手工清除方法
Photoshop为极品美女打造性感睫
天衣无缝:IIS与PHP水火也相容
SQL Server存储过程编写和优化

汇编的的各类源码--DOSMAC

 作者:本站收集   日期:2005-8-1 15:39:16
字号选择〖 〗/ 双击滚屏 单击停止   
;
; Macro file for MSDOS.
;

SUBTTL BREAK a listing into pages and give new subtitles
PAGE
BREAK   MACRO   subtitle
        SUBTTL  subtitle
        PAGE
ENDM

BREAK <I_NEED: declare a variable external, if necessary, and allocate a size>

;
; declare a variable external and allocate a size
;
I_NEED  MACRO   sym,len
    CODE    ENDS
    DATA    SEGMENT BYTE PUBLIC 'DATA'

    IFIDN   <len>,<WORD>
        EXTRN   &sym:WORD
    ELSE
        IFIDN   <len>,<DWORD>
            EXTRN   &sym:DWORD
        ELSE
           EXTRN   &sym:BYTE
        ENDIF
    ENDIF

    DATA    ENDS
    CODE    SEGMENT BYTE PUBLIC 'CODE'
ENDM

;
; call a procedure that may be external.  The call will be short.
;
invoke  MACRO   name
&.xcref
    add_ext name,near
&.cref
    CALL    name
ENDM

PAGE
;
; jump to a label that may be external.  The call will be near.
;
transfer    MACRO   name
&.xcref
    add_ext name,near
&.cref
    JUMP    name
ENDM

;
; get a short address in a word
;
short_addr  MACRO   name
    IFDIF   <name>,<?>
&.xcref
        add_ext name,near
&.cref
        DW  OFFSET DOSGROUP:name
    ELSE
        DW  ?
    ENDIF
ENDM

;
; get a long address in a dword
;
long_addr   MACRO   name
&.xcref
    add_ext name,far
&.cref
    DD  name
ENDM

;
; declare a PROC near or far but PUBLIC nonetheless
;
procedure   MACRO   name,distance
        PUBLIC  name
name    PROC    distance
ENDM

PAGE
;
; define a data item to be public and of an appropriate size/type
;
I_AM    MACRO   name,size
    PUBLIC  name

    IFIDN <size>,<WORD>
        name    DW  ?
    ELSE
        IFIDN <size>,<DWORD>
            name    DD  ?
        ELSE
            IFIDN <size>,<BYTE>
                name    DB  ?
            ELSE
                name    DB  size DUP (?)
            ENDIF
        ENDIF
    ENDIF
ENDM

PAGE
;
; play games with a possible external.  Create a new
; macro for the symbol and text, and string it together
; with a central invoker
;

.xcref
.xcref  ?i
.xcref def_mac
.xcref  ?z0
.xcref  add_ext
.cref

IF1
    ?i=0
ENDIF

?z0 macro
endm

;
; add an external declaration to s with type t if it is not defined
;
add_ext macro   s,t
&.xcref
&.xcref ?&s
&.cref
    IFNDEF   ?&s
        ?i = ?i + 1
        def_mac     ?z&%?i,?z&%(?i-1),s,t
    ENDIF
endm

;
; define a macro called that possibly externals s:t and then calls macro n
;
def_mac macro   m,n,s,t
&.xcref
&.xcref  ?&s
&.xcref  m
&.cref
m   macro
    ifndef s
        extrn s:&t
    endif
    purge m
    purge ?&s
    n
endm
?&s macro
&endm
endm

;
; call the macro chain
;
do_ext  macro
&.xcref
    expand_mac  ?z%?i
&.cref
endm

PAGE
expand_mac macro m
    m
endm

;
; define an entry in a procedure
;
entry macro name
    PUBLIC  name
name:
endm

BREAK <ERROR - print a message and then jump to a label>

error macro code
    local a
.xcref
    MOV AL,code
    transfer    SYS_RET_ERR
.cref
ENDM

BREAK <JUMP - real jump that links up shortwise>
;
; given a label <lbl> either 2 byte jump to another label <lbl>_J
; if it is near enough or 3 byte jump to <lbl>
;

jump    macro lbl
    local a
.xcref
    a:
    ifndef lbl&_J                       ; is this the first invocation
        JMP lbl
    ELSE
        IF lbl&_J GE $
            JMP lbl
        ELSE
            IF ($-lbl&_J) GT 126            ; is the jump too far away?
                JMP lbl
            ELSE                            ; do the short one...
                JMP lbl&_J
            ENDIF
        ENDIF
    ENDIF
endm

BREAK <RETURN - return from a function>

return  macro
    local a
.xcref
a:
    RET
ret_l = a
endm

BREAK <CONDRET - conditional return>

makelab macro l,cc,ncc
    j&ncc   a                           ; j<NCC> a:
    return                              ; return
    a:                                  ; a:
    ret_&cc = ret_l                     ; define ret_<CC> to be ret_l
endm

condret macro   cc,ncc
    local   a,b
    ifdef   ret_l                       ; if ret_l is defined
        if (($ - ret_l) le 126) and ($ gt ret_l)
                                        ;     if ret_l is near enough then
            a:  j&cc    ret_l           ;         a: j<CC> to ret_l
            ret_&cc = a                 ;         define ret_<CC> to be a:
        else
            makelab a,cc,ncc
        endif
    else
        ifdef   ret_&cc                     ; if ret_<CC> defined
            if (($ - ret_&cc) le 126) and ($ gt ret_&cc)
                                            ;     if ret_<CC> is near enough
                a:  j&cc    ret_&cc         ;         a: j<CC> to ret_<CC>
                ret_&cc = a                 ;         define ret_<CC> to be a:
            else
                makelab a,cc,ncc
            endif
        else
            makelab a,cc,ncc
        endif
    endif
endm
;condret macro   cc,ncc
;    local   a,b
;    ifdef   ret_l                       ; if ret_l is defined
;        if (($ - ret_l) le 126) and ($ gt ret_l)
;                                        ;     if ret_l is near enough then
;            a:  j&cc    ret_l           ;         a: j<CC> to ret_l
;            ret_&cc = a                 ;         define ret_<CC> to be a:
;            exitm
;        endif
;    endif
;    ifdef   ret_&cc                     ; if ret_<CC> defined
;        if (($ - ret_&cc) le 126) and ($ gt ret_&cc)
;                                        ;     if ret_<CC> is near enough
;            a:  j&cc    ret_&cc         ;         a: j<CC> to ret_<CC>
;            ret_&cc = a                 ;         define ret_<CC> to be a:
;            exitm
;        endif
;    endif
;    j&ncc   a                           ; j<NCC> a:
;    return                              ; return
;    a:                                  ; a:
;    ret_&cc = ret_l                     ; define ret_<CC> to be ret_l
;endm

BREAK <RETZ - return if zero, links up shortwise if necessary>

retz    macro
    condret z,nz
endm

BREAK <RETNZ - return if not zero, links up shortwise if necessary>

retnz   macro
    condret nz,z
endm

BREAK <RETC - return if carry set, links up shortwise if necessary>

retc    macro
    condret c,nc
endm

BREAK <RETNC - return if not carry, links up shortwise if necessary>

retnc   macro
    condret nc,c
endm

上一篇:汇编的的各类源码--DOSSYM    下一篇:汇编的的各类源码--DEV  
[发送给好友]  [关闭窗口]  [返回顶部]   转载请注明来源:www.it00.com   
特别声明: 本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作者。文章版权归文章原始作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转载的文章有版权问题请联系编辑人员,我们尽快予以更正。
责任编辑: 原点 投稿作者: 本站收集
信息来源: 网络 录入时间: 2005-8-1 15:39:16
关于我们 - 广告服务 - 版权申明 - 网站地图 - 联系方式 - 总编信箱 - 会员投稿