?? macros.inc
字號(hào):
COMMENT ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
MACROS.INC created Apr 3, 1989
Copyright (C) 1989-1992, Datalight Inc.
All Rights Reserved
General macros for interfacing assembly with C Code.
Works equally well with Microsoft and Borland C (all
versions).
MACRO DESCRIPTIONS:
------------------
cBegCode ; open the code segment (CODE)
cEndCode ; close the code segment
cBegData ; open the data segment (DATA)
cEndData ; close the data segment
cBegUdata ; open the uninitialized data seg (BSS)
cEndUdata ; close udata segment
c_func ; declares a function callable from C
c_endp ; declare ending of a function
c_callm ; calls a C function
c_public ; declares a c public
c_extrn ; declares a "C" external
c_extrnP ; declares an external function
largeCODE ; TRUE if M, L or H model
largeDATA ; TRUE if C, L or H model
P ; offset of first parameter on stack
GOFFSET ; DGROUP:xxxx (offset of a variable within DGROUP)
COFFSET ; CS:xxxx (offset within the current CODE segment)
AN EXAMPLE:
-------------------
cBegCode
c_func name ; C function declaration name()
PUSH BP
MOV BP,SP
if largeDATA
MOV ES,P+4[BP] ; some code dependant on large data
endif
.
.
MOV AX,P[BP] ; get first argument (word)
MOV BX,P+2[BP] ; get next argument (word)
.
callm a_routine ; call a C routine from assembly
MOV BX,AX ; return value (if any) is in AX
.
POP BP
RET
c_endp name
CEndCode
END
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ^
; <<<<< if no model chosen, default to SMALL >>>>>
IFNDEF memS
IFNDEF memM
IFNDEF memL
IFNDEF memC
IFNDEF memH
memL = 1
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
; <<<<< Print a Message on Pass 1 >>>>>
out1 MACRO msg
IFDEF ??version
%out msg
ELSE
IF1
%out msg
ENDIF
ENDIF
ENDM
; <<<<< Model setup macro >>>>>
setsize MACRO name,codesize,datasize
IFDEF name
IF name
largeCODE = codesize
largeDATA = datasize
ENDIF
ENDIF
ENDM
; <<<<< based on memory model, set code/data sizes >>>>>
setsize memS, 0,0 ; <Small Model>
setsize memM, 1,0 ; <Medium Model>
setsize memC, 0,1 ; <Compact Model>
setsize memL, 1,1 ; <Large Model>
setsize memH, 1,1 ; <Huge Model>
; <<<<< Model display macro >>>>>
outif MACRO name,msg
IFDEF name
IF name
out1 <* &msg>
ENDIF
ENDIF
ENDM
; <<<<< CODE segment declaration >>>>>
cBegCode MACRO
_TEXT SEGMENT WORD PUBLIC 'CODE'
ASSUME CS:_TEXT
ENDM
cEndCode MACRO
_TEXT ENDS
ENDM
; <<<<< DATA segment declarations >>>>>
cBegData MACRO
DGROUP GROUP _DATA
_DATA SEGMENT WORD PUBLIC 'DATA'
_DATA ENDS
_DATA SEGMENT
ASSUME DS:DGROUP
ENDM
cEndData MACRO
_DATA ends
ENDM
cBegUdata MACRO
DGROUP GROUP _BSS
_BSS SEGMENT WORD PUBLIC 'BSS'
ASSUME DS:DGROUP
ENDM
cEndUdata MACRO
_BSS ENDS
ENDM
IF largeCODE
P equ 6
ELSE
P equ 4
ENDIF
c_func MACRO name
public _&name
IF largeCODE
_&name PROC FAR
ELSE
_&name PROC NEAR
ENDIF
name EQU _&name
ENDM
c_endp MACRO name
_&name ENDP
ENDM
c_callm MACRO name
IF largeCODE
CALL FAR PTR _&name
ELSE
CALL NEAR PTR _&name
ENDIF
name EQU _&name
ENDM
c_public MACRO a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z
ifnb <a> ; recursive check for blank argument
public _&a
a EQU _&a
ifnb <b>
c_public b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z
endif
endif
ENDM
c_extrn MACRO a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z
ifnb <a> ; recursive check for blank argument
extrn _&a:b
a EQU _&a
ifnb <c>
c_extrn c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z
endif
endif
ENDM
c_extrnP MACRO name
ifnb <name>
IF largeCODE
extrn _&name:far
ELSE
extrn _&name:near
ENDIF
name EQU _&name
endif
ENDM
c_label MACRO name,xxx
ifnb <name>
PUBLIC _&name
_&name LABEL xxx
name EQU _&name
endif
ENDM
c_labelP MACRO name
ifnb <name>
PUBLIC _&name
IF largeCODE
_&name LABEL FAR
ELSE
_&name LABEL NEAR
ENDIF
name EQU _&name
endif
ENDM
; <<<<< offset macros (relative to DGROUP not segment) >>>>>
GOFFSET EQU <OFFSET DGROUP:>
COFFSET EQU <OFFSET _TEXT:>
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -