📄 opers.asm
字号:
@@3: Invoke Cond2Number
xchg si,di
Invoke Cond2Number
xchg si,di
OrdinalOper label near
mov al,[di].exLocation
mov ah,[si].exLocation
cmp ax,elAddress+elImmediate*256
je @@4
cmp ax,elImmediate+elAddress*256
jne @@6
cmp Oper,opPlus
jne @@6
call SwapOperands
@@4: test [di].exMisc,efSeg
jnz @@6
mov dx,[si].exValue.Offs
mov al,Oper
cmp al,opPlus
je @@5
cmp al,opMinus
jne @@6
neg dx
@@5: add [di].exValue.Offs,dx
ret
@@6: Invoke LoadAddress
xchg si,di
Invoke LoadAddress
xchg si,di
mov al,[di].exModifier
mov ah,[si].exModifier
Invoke IntExtension
cmp Oper,opAnd
jae @@7
test al,emX
jnz @@7
and al,emSigned
or al,emX
@@7: push ax
Invoke ConvertOrdinal
xchg si,di
pop ax
Invoke ConvertOrdinal
xchg si,di
call SwapIfNeeded
cmp Oper,opEqual
jb @@9
test [di].exModifier,emXX
jnz @@8
call IntCompare
jmp short @@14
@@8: call LongCompare
jmp short @@14
@@9: test [di].exModifier,emXX
jz @@10
mov al,erAX+erDX
Invoke FreeRegs
lea bx,LongOps
jmp short @@13
@@10: cmp Oper,opTimes
jne @@11
cmp [si].exLocation,elImmediate
jne @@11
Invoke UseExpr
mov al,lvAX
mov cx,[si].exValue.W0
Invoke Scale
jmp short @@14
@@11: mov al,erAX+erDX
cmp Oper,opDiv
je @@12
cmp Oper,opMod
je @@12
mov al,erAX
@@12: Invoke FreeRegs
lea bx,WordOps
@@13: mov al,Oper
xor ah,ah
shl ax,1
shl ax,1
add bx,ax
mov dx,cs:[bx+2]
xchg si,di
call word ptr cs:[bx]
xchg si,di
@@14: Invoke DoneExpr
mov al,[si].exRegsUsed
or [di].exRegsUsed,al
ret
BooleanOper endp
IOrdinalOper proc near
cmp Oper,opEqual
jb @@2
mov ax,[di].exValue.W2
add ah,80h
mov dx,[si].exValue.W2
add dh,80h
cmp ax,dx
jne @@1
mov ax,[di].exValue.W0
cmp ax,[si].exValue.W0
@@1: jmp CheckCondition
@@2: call LongArith
jmp SetValue
IOrdinalOper endp
LongArith proc near
mov bl,Oper
xor bh,bh
shl bx,1
push cs:@@1[bx]
mov ax,[di].exValue.W0
mov dx,[di].exValue.W2
mov cx,[si].exValue.W0
mov bx,[si].exValue.W2
ret
@@1 dw @@Add
dw @@Sub
dw @@Mul
dw @@Div
dw @@Mod
dw @@Shl
dw @@Shr
dw @@And
dw @@Or
dw @@Xor
@@Add: add ax,cx
adc dx,bx
ret
@@Sub: sub ax,cx
sbb dx,bx
ret
@@Mul: Chain MulLong
@@Div: Chain DivLong
@@Mod: Invoke DivLong
mov ax,cx
mov dx,bx
ret
@@Shl: and cx,1fh
jz @@3
@@2: shl ax,1
rcl dx,1
loop @@2
@@3: ret
@@Shr: and cx,1fh
jz @@5
@@4: shr dx,1
rcr ax,1
loop @@4
@@5: ret
@@And: and ax,cx
and dx,bx
ret
@@Or: or ax,cx
or dx,bx
ret
@@Xor: xor ax,cx
xor dx,bx
ret
LongArith endp
SetValue proc near
mov [di].exValue.W0,ax
mov [di].exValue.W2,dx
Invoke FitConstType
mov [di].exModifier,al
ret
SetValue endp
WordOps dw WordAdd,4000h ; add, inc
dw WordAdd,4828h ; sub, dec
dw WordMul,20f7h ; mul
dw WordDiv,30f7h ; div
dw WordMod,30f7h ; div
dw WordShl,0e0d1h ; shl
dw WordShl,0e8d1h ; shr
dw WordAnd,20h ; and
dw WordAnd,8 ; or
dw WordAnd,30h ; xor
WordAdd proc near
cmp [di].exLocation,elImmediate
jne WordAnd
mov ax,[di].exValue.W0
dec ax
jz @@1
dec ax
jnz WordAnd
call @@1
@@1: mov al,dh
Chain PutByte
WordAdd endp
WordAnd proc near
Chain PutArOpAX
WordAnd endp
WordDiv proc near
cmp [di].exLocation,elImmediate
jne DivMod
mov cx,[di].exValue.W0
jcxz @@1
Chain BackScale
@@1: mov ax,62
Chain CompileError
WordDiv endp
DivMod proc near
test [di].exModifier,emSigned
jz @@1
or dh,8 ; idiv
@@1: test [di].exModifier,emUnsigned
jz @@2
mov ax,0d231h ; xor dx,dx
Invoke PutWord
jmp short @@3
@@2: mov al,99h ; cwd
Invoke PutByte
@@3: cmp [di].exLocation,elImmediate
jne @@4
push dx
mov al,lvCX
Invoke LoadValue
pop dx
WordMul label near
@@4: Invoke AddReg
or [di].exRegsUsed,erDX
ret
DivMod endp
WordMod proc near
call DivMod
mov al,92h ; xchg ax,dx
Chain PutByte
WordMod endp
WordShl proc near
cmp [di].exLocation,elImmediate
jne @@2
cmp [di].exValue.B0,1
jne @@1
mov ax,dx
Chain PutWord
@@1: test CompilerOptions,co286Code
jz @@2
mov ax,dx
and al,0efh
Invoke PutWord
mov al,[di].exValue.B0
Chain PutByte
@@2: push dx
mov al,lvCX
Invoke LoadValue
pop ax
or al,2
Chain PutWord
WordShl endp
IntCompare proc near
cmp [di].exLocation,elMemory
jne @@1
cmp [si].exLocation,elImmediate
jne @@1
Invoke UseExpr
mov ax,[si].exValue.W0
mov dl,38h ; cmp
Invoke PutArOpRMImm
jmp short @@4
@@1: mov al,erAX
Invoke FreeRegs
cmp [si].exLocation,elImmediate
jne @@3
cmp [si].exValue.W0,0
jne @@3
mov ax,0c009h ; or ax,ax
test [di].exModifier,emX
jnz @@2
mov ax,0c008h ; or al,al
@@2: Invoke PutWord
jmp short @@4
@@3: xchg si,di
mov dl,38h ; cmp
Invoke PutArOpAX
xchg si,di
@@4: lea bx,SignedConds
test [di].exModifier,emUnsigned
jz @@5
lea bx,UnsignedConds
@@5: jmp SetCondition
IntCompare endp
LongOps dw LongAdd,1000h ; add, adc
dw LongAdd,1828h ; sub, sbb
dw LongMul,_LongMul
dw LongMul,_LongDiv
dw LongMod,_LongDiv
dw LongMul,_LongShl
dw LongMul,_LongShr
dw LongAdd,20h ; and
dw LongAdd,8 ; or
dw LongAdd,30h ; xor
LongAdd proc near
push dx
Invoke PutArOpAX
mov ax,2
Invoke SwapSegOfs
pop dx
or dh,dh
jz @@1
mov dl,dh
Chain PutArOp
@@1: Chain PutLogOp
LongAdd endp
LongMul proc near
push dx
mov al,lvCX
Invoke LoadValue
pop ax
Chain PutSystemCall
LongMul endp
LongMod proc near
call LongMul
mov ax,0c889h ; mov ax,cx
Invoke PutWord
mov ax,0da89h ; mov dx,bx
Chain PutWord
LongMod endp
LongCompare proc near
xor ax,ax
mov Chain1,ax
mov Chain2,ax
cmp [si].exLocation,elImmediate
jne @@4
mov ax,[si].exValue.W0
or ax,[si].exValue.W2
jnz @@3
mov al,Oper
cmp al,opEqual
je @@1
cmp al,opNotEqual
jne @@3
@@1: cmp [di].exLocation,elMemory
jne @@2
Invoke UseExpr
and [di].exModifier,not emXX
mov al,lvAX
Invoke LoadReg
add [di].exValue.Offs,2
mov dx,8 ; or
Invoke PutArOpAX
or [di].exRegsUsed,erAX
jmp short @@5
@@2: Invoke UseExpr
mov ax,0d009h ; or ax,dx
Invoke PutWord
jmp short @@5
@@3: cmp [di].exLocation,elMemory
jne @@4
Invoke UseExpr
add [di].exValue.Offs,2
mov ax,[si].exValue.W2
mov dl,38h ; cmp
Invoke PutArOpRMImm
call TwoConditions
sub [di].exValue.Offs,2
mov ax,[si].exValue.W0
mov dl,38h ; cmp
Invoke PutArOpRMImm
jmp short @@5
@@4: mov al,erAX+erDX
Invoke FreeRegs
xchg si,di
mov ax,2
Invoke SwapSegOfs
mov dl,38h ; cmp
Invoke PutArOp
call TwoConditions
mov ax,-2
Invoke SwapSegOfs
mov dl,38h ; cmp
Invoke PutArOpAX
xchg si,di
@@5: lea bx,UnsignedConds
call SetCondition
mov ax,Chain1
mov [di].exChain1,ax
mov ax,Chain2
mov [di].exChain2,ax
ret
LongCompare endp
TwoConditions proc near
mov bl,Oper
xor bh,bh
shl bx,1
mov ax,cs:@@3[bx-opEqual*2]
or al,al
jz @@1
push ax
lea bx,Chain1
Invoke PutJmp
pop ax
@@1: mov al,ah
or al,al
jz @@2
lea bx,Chain2
Chain PutJmp
@@2: ret
@@3 dw cdNotEqual*256
dw cdNotEqual
dw cdGreater+cdLess*256
dw cdLess+cdGreater*256
dw cdGreater+cdLess*256
dw cdLess+cdGreater*256
TwoConditions endp
SwapIfNeeded proc near
mov al,Oper
cmp al,opEqual
jae @@1
cmp al,opPlus
je @@1
cmp al,opTimes
je @@1
cmp al,opAnd
je @@1
cmp al,opOr
je @@1
cmp al,opXor
jne @@2
@@1: cmp [si].exLocation,elImmediate
je @@2
cmp [di].exLocation,elImmediate
je SwapOperands
cmp [si].exRegsUsed,0
je @@2
cmp [di].exRegsUsed,0
je SwapOperands
cmp [si].exRegsUsed,erAll
je @@2
cmp [di].exRegsUsed,erAll
je SwapOperands
@@2: ret
SwapIfNeeded endp
SwapOperands proc near
mov cx,size TExpr shr 1
@@1: mov ax,[si]
xchg ax,[di]
mov [si],ax
add di,2
add si,2
loop @@1
sub di,size TExpr
sub si,size TExpr
mov al,Oper
cmp al,opSlash
je @@2
cmp al,opGreater
jb @@2
xor Oper,1
@@2: ret
SwapOperands endp
SetCondition proc near
mov al,Oper
sub al,opEqual
segcs xlat
_SetCondition label near
mov [di].exLocation,elCondition
mov [di].exModifier,emBoolean
mov [di].exMisc,al
l4b7f: xor ax,ax
mov [di].exChain1,ax
l4b84: mov [di].exChain2,ax
Chain CastBoolean
SetCondition endp
UnsignedConds db cdEqual,cdNotEqual,cdAfter,cdBelow,cdNotBelow,cdNotAfter
SignedConds db cdEqual,cdNotEqual,cdGreater,cdLess,cdNotLess,cdNotGreater
CheckCondition proc near
lahf
mov bl,Oper
xor bh,bh
shl bx,1
shl bx,1
add bx,offset @@1-opEqual*4
mov al,1
sahf
jmp bx
@@1: jz @@3
jmp short @@2
jnz @@3
jmp short @@2
ja @@3
jmp short @@2
jb @@3
jmp short @@2
jae @@3
jmp short @@2
jbe @@3
@@2: mov al,0
StoreBoolean label near
@@3: cbw
cwd
mov [di].exModifier,emBoolean
mov [di].exValue.W0,ax
mov [di].exValue.W2,dx
Chain CastBoolean
CheckCondition endp
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -