📄 exid.asm
字号:
page 49,132
TITLE ExId - SImple Id Executors
;***
;exid.asm - executors for simple id references.
;
; Copyright <C> 1986, Microsoft Corporation
;
;Purpose:
;
; This module contains all exId executors.
;
; Simple variables may also be referenced by exVtRfxx executors.
; These are always nops, and are maintained with the nonspeed-
; critical nop executors.
;
; In general, these executors are very speed critical.
;
;
;****************************************************************************
.xlist
include version.inc
IncludeOnce architec
IncludeOnce context
IncludeOnce executor
IncludeOnce exint
IncludeOnce extort
IncludeOnce opaftqb4
IncludeOnce opid
IncludeOnce opstmt
IncludeOnce pcode
IncludeOnce pointers
IncludeOnce qbimsgs
IncludeOnce rtinterp
IncludeOnce scanner
IncludeOnce variable
.list
assumes cs, CODE
assumes es, NOTHING
assumes ss, DATA
RestoreVarTable equ <mov ds,cx>
sBegin CODE
subttl Public Load
;Added with [15]
;End of [15]
subttl Static Load
MakeExe exIdISLd2,opIdLd,ET_Imp
LODSWTX ;Pick up variable address operand
xchg ax,bx ;Move to base register
DbChk oVar,bx
push [pVarBx]
DispMac ;Dispatch to next executor
MakeExe exIdESLdI2,opIdLd,ET_I2
LODSWTX ;Pick up variable address operand
xchg ax,bx ;Move to base register
DbChk oVar,bx
push [pVarBx] ;Push the I2
DispMac ;Dispatch to next executor
MakeExe exIdESLdI4,opIdLd,ET_I4
SkipExHeader
MakeExe exIdISLd4,opIdLd,ET_Imp
LODSWTX
xchg ax,bx ;Move to base register
DbChk oVar,bx
push [pVarBx+2]
push [pVarBx]
DispMac
;Added with [18]
MakeExe exIdESLdR4,opIdLd,ET_R4
SkipExHeader
MakeExe exIdISLdR4,opIdLd,ET_Imp
LODSWTX
xchg ax,bx ;Move to base register
DbChk oVar,bx
fld dword ptr [pVarBx]
DispMac
MakeExe exIdESLdR8,opIdLd,ET_R8
SkipExHeader
MakeExe exIdISLdR8,opIdLd,ET_Imp
LODSWTX
xchg ax,bx ;Move to base register
DbChk oVar,bx
fld qword ptr [pVarBx]
DispMac
;End of [18]
subttl Common Load
MakeExe exIdECLdI2,opIdLd,ET_I2
SkipExHeader
MakeExe exIdICLd2,opIdLd,ET_Imp
LODSWTX ;Get oVar
xchg ax,bx
DbChk oVar,bx ; Check for valid oVar
mov ax,[pVarBx].COMREF_oValue ;Offset into common block
mov bx,[pVarBx].COMREF_oCommon ;oCommon
add bx,[grs.GRS_bdtComBlk.BD_pb] ;pCommon
mov bx,[bx].COM_bdValue.BD_pb ;Common block
add bx,ax ;Offset in block
push [bx]
DispMac
MakeExe exIdECLdI4,opIdLd,ET_I4
SkipExHeader
MakeExe exIdICLd4,opIdLd,ET_Imp
LODSWTX ;Get oVar
xchg ax,bx
DbChk oVar,bx ; Check for valid oVar
mov ax,[pVarBx].COMREF_oValue ;Offset into common block
mov bx,[pVarBx].COMREF_oCommon ;oCommon
add bx,[grs.GRS_bdtComBlk.BD_pb] ;pCommon
mov bx,[bx].COM_bdValue.BD_pb ;Common block
add bx,ax ;Offset in block
push [bx+2]
push [bx]
DispMac
;Added with [18]
MakeExe exIdECLdR4,opIdLd,ET_R4
SkipExHeader
MakeExe exIdICLdR4,opIdLd,ET_Imp
LODSWTX ;Get oVar
xchg ax,bx
DbChk oVar,bx ; Check for valid oVar
mov ax,[pVarBx].COMREF_oValue ;Offset into common block
mov bx,[pVarBx].COMREF_oCommon ;oCommon
add bx,[grs.GRS_bdtComBlk.BD_pb] ;pCommon
mov bx,[bx].COM_bdValue.BD_pb ;Common block
add bx,ax ;Offset in block
fld dword ptr [bx]
DispMac
MakeExe exIdECLdR8,opIdLd,ET_R8
SkipExHeader
MakeExe exIdICLdR8,opIdLd,ET_Imp
LODSWTX ;Get oVar
DbChk oVar,ax ; Check for valid oVar
xchg bx,ax
mov ax,[pVarBx].COMREF_oValue ;Offset into common block
mov bx,[pVarBx].COMREF_oCommon ;oCommon
add bx,[grs.GRS_bdtComBlk.BD_pb] ;pCommon
mov bx,[bx].COM_bdValue.BD_pb ;Common block
add bx,ax ;Offset in block
fld qword ptr [bx]
DispMac
;End of [18]
subttl Indirect Load
page
MakeExe exIdEILdI2,opIdLd,ET_I2
SkipExHeader
MakeExe exIdIILd2,opIdLd,ET_Imp
LODSWTX ;Get oVar
xchg ax,bx ;Move to base register
DbChk oVar,bx ; Check for valid oVar
GetpFrame ;Get pointer into frame
mov bx,[pFrame] ;Load address of variable
push [bx] ;Push the I2
DispMac
MakeExe exIdEILdI4,opIdLd,ET_I4
SkipExHeader
MakeExe exIdIILd4,opIdLd,ET_Imp
LODSWTX ;Get oVar
xchg ax,bx ;Move to base register
DbChk oVar,bx ; Check for valid oVar
GetpFrame ;Get pointer into frame
mov bx,[pFrame] ;Load address of variable
push [bx+2]
push [bx]
DispMac
;Start of [18]
MakeExe exIdEILdR4,opIdLd,ET_R4
SkipExHeader
MakeExe exIdIILdR4,opIdLd,ET_Imp
LODSWTX ;Get oVar
xchg ax,bx ;Move to base register
DbChk oVar,bx ; Check for valid oVar
GetpFrame ;Get pointer into frame
mov bx,[pFrame] ;Load address of variable
fld dword ptr [bx]
DispMac
MakeExe exIdEILdR8,opIdLd,ET_R8
SkipExHeader
MakeExe exIdIILdR8,opIdLd,ET_Imp
LODSWTX ;Get oVar
xchg ax,bx ;Move to base register
DbChk oVar,bx ; Check for valid oVar
GetpFrame ;Get pointer into frame
mov bx,[pFrame] ;Load address of variable
fld qword ptr [bx]
DispMac
;End of [18]
subttl Frame Load and Indirect Reference
page
; The executors for loading two byte and four byte frame variables are
; also used for references to indirect variables. For a load of a frame
; variable, the variable table contains the value which is pushed on the
; stack. For a reference to an indirect variable, the variable table
; contains the address which is then pushed on the stack. Since addresses
; are either two or four bytes, only these entries serve two purposes.
MakeExe exIdIIRfTyp,opIdLd,ET_Imp
LODSWTX ;Get oVar
xchg ax,bx ;Move to base register
DbChk oVar,bx ; Check for valid oVar
mov bx,[pVarBx] ;Get oFrame
add bx,bp ;oFrame to pFrame entry
push ds
push [bx]
DispMac
MakeExe exIdEIRfR8,opIdLd,ET_R8
SkipExHeader
MakeExe exIdEIRfSD,opIdLd,ET_SD
SkipExHeader
MakeExe exIdEIRfI4,opIdLd,ET_I4
SkipExHeader
MakeExe exIdEIRfR4,opIdLd,ET_R4
SkipExHeader
MakeExe exIdEFLdI2,opIdLd,ET_I2
SkipExHeader
MakeExe exIdIFLd2,opIdLd,ET_Imp
LODSWTX ;Get oVar
xchg ax,bx ;Move to base register
DbChk oVar,bx ; Check for valid oVar
GetpFrame ;Get pointer into frame
push [pFrame] ;Push the I2
DispMac
MakeExe exIdEFLdI4,opIdLd,ET_I4
SkipExHeader
MakeExe exIdIFLd4,opIdLd,ET_Imp
LODSWTX ;Get oVar
xchg ax,bx ;Move to base register
DbChk oVar,bx ; Check for valid oVar
GetpFrame ;Get pointer into frame
push [pFrame+2]
push [pFrame]
DispMac
;Added with [18]
MakeExe exIdEFLdR4,opIdLd,ET_R4
SkipExHeader
MakeExe exIdIFLdR4,opIdLd,ET_Imp
LODSWTX ;Get oVar
xchg ax,bx ;Move to base register
DbChk oVar,bx ; Check for valid oVar
GetpFrame ;Get pointer into frame
fld dword ptr [pFrame]
DispMac
MakeExe exIdEFLdR8,opIdLd,ET_R8
SkipExHeader
MakeExe exIdIFLdR8,opIdLd,ET_Imp
LODSWTX ;Get oVar
xchg ax,bx ;Move to base register
DbChk oVar,bx ; Check for valid oVar
GetpFrame ;Get pointer into frame
fld qword ptr [pFrame]
DispMac
;End of [18]
subttl Public Store
page
;Added with [15]
;End of [15]
subttl Static Store
page
MakeExe exIdESStSD,opIdSt,ET_SD
SkipExHeader
MakeExe exIdISStSD,opIdSt,ET_Imp
LODSWTX ;Get oVar
DbChk oVar,ax ; Check for valid oVar
add ax,di ;ax = pSdStore
push ax
CALLRT B$SASS,DispMov
MakeExe exIdISSt2,opIdSt,ET_Imp
LODSWTX ;Get oVar
xchg ax,bx ;Move to base register
DbChk oVar,bx ; Check for valid oVar
pop [pVarBx] ;Store stack in value
DispMac
MakeExe exIdESStI2,opIdSt,ET_I2
LODSWTX ;Get oVar
xchg ax,bx ;Move to base register
DbChk oVar,bx ; Check for valid oVar
pop [pVarBx] ;Store stack in value
DispMac
MakeExe exIdESStI4,opIdSt,ET_I4
SkipExHeader
MakeExe exIdISSt4,opIdSt,ET_Imp
LODSWTX ;Get oVar
xchg ax,bx ;Move to base register
DbChk oVar,bx ; Check for valid oVar
pop [pVarBx] ;Store stack in value
pop [pVarBx+2]
DispMac
;Added with [18]
MakeExe exIdESStR4,opIdSt,ET_R4
SkipExHeader
MakeExe exIdISStR4,opIdSt,ET_Imp
LODSWTX ;Get oVar
xchg ax,bx ;Move to base register
DbChk oVar,bx ; Check for valid oVar
fstp dword ptr [pVarBx]
fwait
DispMac
MakeExe exIdESStR8,opIdSt,ET_R8
SkipExHeader
MakeExe exIdISStR8,opIdSt,ET_Imp
LODSWTX ;Get oVar
xchg ax,bx ;Move to base register
DbChk oVar,bx ; Check for valid oVar
fstp qword ptr [pVarBx]
fwait
DispMac
;End of [18]
MakeExe exIdISStTyp,opIdSt,ET_Imp
LODSWTX ;Get oVar
DbChk oVar,ax ; Check for valid oVar
add ax,di ;oVar --> pVar
xchg di,ax ;Destination (points to value field)
mov bx,[di-VAR_value].VAR_oTyp ;Get oTyp
push ds
jmp MoveRec
subttl Common Store
page
MakeExe exIdECStI2,opIdSt,ET_I2
SkipExHeader
MakeExe exIdICSt2,opIdSt,ET_Imp
LODSWTX ;Get oVar
xchg ax,bx
DbChk oVar,bx ; Check for valid oVar
mov ax,[pVarBx].COMREF_oValue ;Offset into common block
mov bx,[pVarBx].COMREF_oCommon ;oCommon
add bx,[grs.GRS_bdtComBlk.BD_pb] ;pCommon
mov bx,[bx].COM_bdValue.BD_pb ;Common block
add bx,ax ;Offset in block
pop [bx]
DispMac
MakeExe exIdECStI4,opIdSt,ET_I4
SkipExHeader
MakeExe exIdICSt4,opIdSt,ET_Imp
LODSWTX ;Get oVar
xchg ax,bx
DbChk oVar,bx ; Check for valid oVar
mov ax,[pVarBx].COMREF_oValue ;Offset into common block
mov bx,[pVarBx].COMREF_oCommon ;oCommon
add bx,[grs.GRS_bdtComBlk.BD_pb] ;pCommon
mov bx,[bx].COM_bdValue.BD_pb ;Common block
add bx,ax ;Offset in block
pop [bx]
pop [bx+2]
DispMac
;Added with [18]
MakeExe exIdECStR4,opIdSt,ET_R4
SkipExHeader
MakeExe exIdICStR4,opIdSt,ET_Imp
LODSWTX ;Get oVar
xchg ax,bx
DbChk oVar,bx ; Check for valid oVar
mov ax,[pVarBx].COMREF_oValue ;Offset into common block
mov bx,[pVarBx].COMREF_oCommon ;oCommon
add bx,[grs.GRS_bdtComBlk.BD_pb] ;pCommon
mov bx,[bx].COM_bdValue.BD_pb ;Common block
add bx,ax ;Offset in block
fstp dword ptr [bx]
fwait
DispMac
MakeExe exIdECStR8,opIdSt,ET_R8
SkipExHeader
MakeExe exIdICStR8,opIdSt,ET_Imp
LODSWTX ;Get oVar
xchg ax,bx
DbChk oVar,bx ; Check for valid oVar
mov ax,[pVarBx].COMREF_oValue ;Offset into common block
mov bx,[pVarBx].COMREF_oCommon ;oCommon
add bx,[grs.GRS_bdtComBlk.BD_pb] ;pCommon
mov bx,[bx].COM_bdValue.BD_pb ;Common block
add bx,ax ;Offset in block
fstp qword ptr [bx]
fwait
DispMac
;End of [18]
MakeExe exIdECStSD,opIdSt,ET_SD
SkipExHeader
MakeExe exIdICStSD,opIdSt,ET_Imp
LODSWTX ;Get oVar
xchg ax,bx
DbChk oVar,bx ; Check for valid oVar
mov ax,[pVarBx].COMREF_oValue ;Offset into common block
mov bx,[pVarBx].COMREF_oCommon ;oCommon
add bx,[grs.GRS_bdtComBlk.BD_pb] ;pCommon
mov bx,[bx].COM_bdValue.BD_pb ;Common block
add bx,ax ;Offset in block
push bx ;Push pSD
CALLRT B$SASS,DispMov
MakeExe exIdICStTyp,opIdSt,ET_Imp
LODSWTX ;Get oVar
xchg ax,bx
DbChk oVar,bx ; Check for valid oVar
mov cx,[pVarBx].COMREF_oValue ;Offset into common block
mov ax,[pVarBx].COMREF_oCommon ;oCommon
mov bx,[pVarBx-VAR_value].VAR_oTyp ;Get oTyp
add ax,[grs.GRS_bdtComBlk.BD_pb] ;pCommon
xchg ax,di
mov di,[di].COM_bdValue.BD_pb ;Common block
add di,cx ;Offset in block
push ds
;ax = saved di
;bx = oTyp of record
;di = offset of destination
;[sp] = segment of destination
;[sp+4]:[sp+2] = pointer to source
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -