📄 asminstr.inc
字号:
cmp [si].aRegNum.B1,rgAX
jne @@2
cmp [si].aRegNum.B0,szWord
ja @@2
jne @@1
call GetOpcode
inc Opcode
call PutWordOperand
jmp short @@2
@@1: call ByteOperand
jnz @@2
call GetOpcode
call PutByteOperand
@@2: ret
@ArOpRD endp
@IncR16 proc near
cmp ah,tREG
jne @@1
cmp [si].aRegNum.B0,szWord
jne @@1
call GetOpcode
mov al,[si].aRegNum.B1
or Opcode,al
xor ax,ax
@@1: ret
@IncR16 endp
@PopSr proc near
mov cl,rgCS
jmp short @@1
@PushSr label near
mov cl,-1
@@1: cmp ah,tREG
jne @@2
cmp [si].aRegNum.B0,szSreg
jne @@2
cmp [si].aRegNum.B1,cl
je @@3
call GetOpcode
mov al,[si].aRegNum.B1
mov cl,3
shl al,cl
or Opcode,al
xor ax,ax
@@2: ret
@@3: inc ax
ret
@PopSr endp
@FstswAX proc near
cmp ah,tREG
jne @@4
cmp [si].aRegNum,rgAX*256+szWord
jne @@4
@Foper label near
mov al,0
_Foper label near
xchg ax,dx
call PutPrefixes
call OpcodeLength
mov dh,0
test byte ptr Options,3
jnz @@1
mov dh,1
@@1: mov cx,cs:[bx+2]
cmp cl,1
ja @@2
mov dh,cl
inc bx
dec ax
jmp @@1
@@2: cmp cl,9bh
jne @@3
xor dh,dh
@@3: or cl,dl
mov ah,ch
mov bl,eFloat
mov bh,DefPrefix
mov DefPrefix,0
or bh,dh
call Put
dec ax
mov Pending,al
mov Opcode,ah
xor ax,ax
@@4: ret
@FstswAX endp
@F_Tbyte proc near
mov cx,szTbyte*256+szTbyte
jmp short @@2
@Fild label near
mov cx,szQword*256+szQword
jmp short @@2
@Fiadd label near
mov cx,szDword*256+szWord
jmp short @@2
@Fstsw label near
cmp [si].aSize,0
jne @@1
mov [si].aSize,2
@@1: mov cx,szWord*256+szWord
jmp short @@2
@F_RM label near
mov cx,szDword*256+szQword
@@2: cmp ah,tMEM
jne @@4
push cx
call GetRM
pop cx
jnz @@4
mov al,0
cmp SizeBit,ch
je @@3
cmp SizeBit,cl
jne @@4
or al,4
@@3: call _Foper
call PutOperRM
@@4: ret
@F_Tbyte endp
@Fstenv proc near
mov cx,14
jmp short @@1
@Fsave label near
mov cx,94
@@1: cmp [si].aSize,cx
je @@2
cmp [si].aSize,0
jne @@3
@@2: cmp ah,tMEM
jnz @@3
call GetRM
jnz @@3
call @Foper
call PutOperRM
@@3: ret
@Fstenv endp
@F_STi proc near
mov al,tREG
jmp short @@1
@F_STSTi label near
xchg si,di
xchg al,ah
@F_STiST label near
cmp [di].aRegNum,0*256+szST
jne @@2
@@1: cmp ax,tREG*256+tREG
jne @@2
cmp [si].aRegNum.B0,szST
jne @@2
call @Foper
mov al,[si].aRegNum.B1
or Opcode,al
xor ax,ax
@@2: ret
@F_STi endp
PureMem proc near
call GetRM
jnz @@1
cmp PureMemFlag,1
@@1: ret
PureMem endp
GetRM8_16 proc near
call GetRM
jnz @@1
test al,not szWord
@@1: ret
GetRM8_16 endp
GetRM16 proc near
call GetRM
jnz @@1
cmp al,szWord
@@1: ret
GetRM16 endp
GetRM proc near
mov ax,[si].aAddr.Offs
mov FixupAddr.Offs,ax
mov ax,[si].aAddr.Segm
mov FixupAddr.Segm,ax
mov FixupOffs,0
mov DefPrefix,0
cmp [si].aType,tREG
je @@6
cmp [si].aType,tMEM
jne @@8
mov al,[si].aHalf
or al,al
jnz @@1
inc ax
@@1: mov DwordFixup,al
mov ax,6*256+1
mov bl,[si].aRegs
and bx,rfBX+rfBP+rfSI+rfDI
jz @@3
mov ah,cs:@@9[bx-1]
or ah,ah
jns @@2
jmp InvRegErr
@@2: dec ax
@@3: mov PureMemFlag,al
mov cx,[si].aValue.W0
mov FixupOffs,cx
mov cl,sz???
mov bx,[si].aSize
cmp bx,10
ja @@4
mov cl,cs:@@10[bx]
@@4: mov SizeBit,cl
mov RMBits,ah
mov ah,[si].aSeg
or ah,ah
jz @@7
mov al,3eh
cmp PureMemFlag,1
je @@5
test [si].aRegs,rfBP
jz @@5
mov al,36h
@@5: cmp al,ah
je @@7
mov DefPrefix,ah
jmp short @@7
@@6: mov PureMemFlag,0
mov ax,[si].aRegNum
or ah,0c0h
mov RMBits,ah
cmp al,szWord
ja @@8
mov SizeBit,al
@@7: xor ax,ax
@@8: mov al,SizeBit
ret
@@9 db 5,4,-1,6,3,2,-1,7,1,0,-1,-1,-1,-1,-1
@@10 db sz???,szByte,szWord,sz???
db szDword,sz???,sz???,sz???
db szQword,sz???,szTbyte
GetRM endp
SignedByte proc near
cmp [di].aType,tNUMBER
jne @@1
cmp [di].aHalf,0
jne @@1
mov al,[di].aValue.B0
cbw
cwd
cmp ah,[di].aValue.B1
jne @@1
cmp dx,[di].aValue.W2
@@1: ret
SignedByte endp
ByteOperand proc near
call WordOperand
jnz @@2
cmp [di].aHalf,0
jne @@2
or dx,dx
js @@1
or ah,ah
ret
@@1: mov dx,ax
cbw
cmp ax,dx
@@2: ret
ByteOperand endp
WordOperand proc near
cmp [di].aType,tNUMBER
jne @@1
mov ax,[di].aValue.W0
cwd
cmp [di].aValue.W2,dx
je @@1
xor dx,dx
cmp [di].aValue.W2,dx
je @@1
jmp OutOfRangeErr
@@1: ret
WordOperand endp
PutReg1 proc near
mov al,[si].aRegNum.B1
jmp short @@1
PutReg2 label near
mov al,[di].aRegNum.B1
@@1: shl al,1
shl al,1
shl al,1
or RMBits,al
ret
PutReg1 endp
GetOpcode proc near
call PutPrefixes
mov al,DefPrefix
or al,al
jz @@1
call PutByte
@@1: call _GetOpcode
inc Pending
mov Opcode,al
ret
GetOpcode endp
_GetOpcode proc near
call OpcodeLength
xchg ax,cx
dec cx
jz @@2
js @@2
@@1: call @@2
call PutByte
loop @@1
@@2: mov al,cs:[bx+2]
inc bx
ret
_GetOpcode endp
PutPrefixes proc near
lea bx,Prefixes
@@1: xor ax,ax
add al,ss:[bx]
jz @@2
call PutByte
inc bx
jmp @@1
@@2: ret
PutPrefixes endp
PutPending proc near
push ax
xor ax,ax
xchg al,Pending
or al,al
jz @@1
mov al,Opcode
call PutByte
@@1: pop ax
ret
PutPending endp
ZeroWord proc near
cmp [di].aHalf,0
jne @@1
call WordOperand
jnz @@1
or ax,ax
@@1: ret
ZeroWord endp
PutWordOperand proc near
mov bh,[di].aHalf
or bh,bh
jnz @@1
call WordOperand
jz PutWord
ret
@@1: mov bl,eFixup
mov cx,[di].aValue.W0
mov dx,[di].aValue.W2
mov ax,[di].aAddr.Offs
mov TempAddr.Offs,ax
mov ax,[di].aAddr.Segm
mov TempAddr.Segm,ax
call Put
ret
PutWordOperand endp
PutByteOperand proc near
call ByteOperand
jz PutByte
ret
PutByteOperand endp
PutWord proc near
call PutByte
xchg al,ah
PutByte label near
call PutPending
push bx
push cx
mov bl,eByte
mov cx,ax
call Put
pop cx
pop bx
ret
PutWord endp
Put proc near
call PutPending
push si
mov si,CodeCount
cmp si,11*size TCodeBuffer
jne @@1
jmp SyntaxErr
@@1: mov CodeBuffer[si].cType,bx
mov CodeBuffer[si].cValue.W0,cx
mov CodeBuffer[si].cValue.W2,dx
push TempAddr.Offs
pop CodeBuffer[si].cAddr.Offs
push TempAddr.Segm
pop CodeBuffer[si].cAddr.Segm
add CodeCount,size TCodeBuffer
pop si
cmp ax,ax
ret
Put endp
PutMemRef proc near
mov ax,FixupOffs
mov cx,FixupAddr.Offs
or cx,FixupAddr.Segm
jz PutWord
xchg ax,cx
xor dx,dx
mov bl,eFixup
mov bh,DwordFixup
mov ax,FixupAddr.Offs
mov TempAddr.Offs,ax
mov ax,FixupAddr.Segm
mov TempAddr.Segm,ax
jmp Put
PutMemRef endp
PutOperRM proc near
mov SizeBit,szByte
PutSizeOperRM label near
call OpcodeAttrs
and al,38h
or RMBits,al
cmp DirectionBit,0
je PutSizeRegRM
ret
PutOperRM endp
PutRegRM proc near
mov SizeBit,szByte
PutSizeRegRM label near
mov al,SizeBit
or al,DirectionBit
or Opcode,al
mov al,RMBits
mov ah,al
and ax,0c7c0h
cmp al,0c0h
je @@5
cmp PureMemFlag,1
je @@3
mov cx,FixupAddr.Offs
or cx,FixupAddr.Segm
jnz @@2
mov cx,FixupOffs
cmp ah,6
je @@1
jcxz @@5
@@1: mov ax,cx
cbw
cmp ax,cx
je @@4
@@2: or RMBits,80h
@@3: call @@5
call PutMemRef
jmp short @@7
@@4: or RMBits,40h
call @@5
mov ax,FixupOffs
jmp short @@6
@@5: mov al,RMBits
@@6: call PutByte
@@7: cmp SizeBit,szTbyte
ja @@8
xor ax,ax
@@8: ret
PutRegRM endp
OpcodeLength proc near
call OpcodeAttrs
and ax,3
inc ax
ret
OpcodeLength endp
OpcodeAttrs proc near
mov bx,OpcodePtr
mov al,cs:[bx+1]
ret
OpcodeAttrs endp
even
Opcodes dw @Nop,@PushD16,@PushD8,@Lea
dw @OutDX,@OutD8,@InDX,@InD8
dw @XchgRAX,@XchgAXR,@Int,@Enter
dw @ArOpRD,@MovRD,@JmpRM16,@JmpFar
dw @JmpRM32,@Jcc,@JmpNear,@MovMAcc
dw @MovAccM,@Ret,@RetnD16,@Invalid
dw @PushSr,@PopSr,@IncR16,@Lgdt
dw @Lar,@Arpl,@Imul286,@MovSrRM
dw @MovRMSr,@MovRMR,@XchgRMR,@PopRM
dw @ArOpRMD,@MovRMD,@IncRM,@Lds
dw @Shift,@Foper,@FstswAX,@F_STi
dw @F_STiST,@F_STSTi,@F_RM,@F_Tbyte
dw @Fstsw,@Fiadd,@Fild,@Fstenv
dw @Fsave,@Invalid
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -