📄 pmprint.asm
字号:
MOV CL,8
PRNTNIBS: POP EAX
CALL PCH
DEC CL
JNZ PRNTNIBS
POP EDX
POP ECX
POP EAX
RET
PHD ENDP
;Print unsigned WORD in AX as decimal.
PUW PROC NEAR
PUSH EAX
PUSH EBX
PUSH ECX
PUSH EDX
AND EAX,0FFFFH
XOR CL,CL
MOV EBX,10
CALCDIGS: XOR EDX,EDX
DIV BX
PUSH EDX
INC CL
OR EAX,EAX
JNZ CALCDIGS
PRNTDIGS: POP EAX
ADD AL,48
CALL PCH
DEC CL
JNZ PRNTDIGS
POP EDX
POP ECX
POP EBX
POP EAX
RET
PUW ENDP
;Print unsigned DWORD in EAX as decimal.
PUD PROC NEAR
PUSH EAX
PUSH EBX
PUSH ECX
PUSH EDX
XOR CL,CL
MOV EBX,10
CALCDIGS: XOR EDX,EDX
DIV EBX
PUSH EDX
INC CL
OR EAX,EAX
JNZ CALCDIGS
PRNTDIGS: POP EAX
ADD AL,48
CALL PCH
DEC CL
JNZ PRNTDIGS
POP EDX
POP ECX
POP EBX
POP EAX
RET
PUD ENDP
;Print signed WORD in AX as decimal.
PSW PROC NEAR
PUSH EAX
OR AX,AX
JNS PABS
PUSH EAX
MOV AL,"-"
CALL PCH
POP EAX
NEG AX ;Calculate absolute value
PABS: CALL PUW ;Print absolute value
POP EAX
RET
PSW ENDP
;Print signed DWORD in EAX as decimal.
PSD PROC NEAR
PUSH EAX
OR EAX,EAX
JNS PABS
PUSH EAX
MOV AL,"-"
CALL PCH
POP EAX
NEG EAX ;Calculate absolute value
PABS: CALL PUD ;Print absolute value
POP EAX
RET
PSD ENDP
;Print ST of FPU using format code in AX. AH = number of postdecimal characters
;including sign (if negative). AL = number of predecimal characters. Fractions
;are printed with leading zero provided that AH > 0. Can print numbers
;absolutely smaller than 10 ^ 18. Can print up to 18 predecimal places. Will
;fill entire print field with "*" if postdecimal field is too small. Will fill
;entire print field with ">" if number absolutely greater than 10 ^ 18.
FPST PROC NEAR PUBLIC
LOCAL NOHIDIGITS:DWORD
LOCAL NOLODIGITS:DWORD
LOCAL OLDCWORD:WORD
LOCAL NEWCWORD:WORD
LOCAL HIDIGITS[10]:BYTE
LOCAL LODIGITS[10]:BYTE
PUSH EAX
PUSH ECX
PUSH EDX
PUSH ESI
PUSH EDI
XOR ECX,ECX ;Save format codes
MOV CL,AL
MOV NOLODIGITS,ECX
MOV CL,AH
MOV NOHIDIGITS,ECX
FLD ST ;See if number of high digits greater than 18
FABS
FCOM QWORD PTR CS:SCALEFAC
FSTSW AX
SAHF
JAE OVERFLOW
FSTCW OLDCWORD ;Set RC to truncate
MOV AX,OLDCWORD
OR AX,0C00H
MOV NEWCWORD,AX
FLDCW NEWCWORD
FLD ST(1) ;Save high digits
FBSTP TBYTE PTR HIDIGITS[0]
FLD ST ;Calculate and save low digits
FRNDINT
FLDCW OLDCWORD
FSUB
FMUL QWORD PTR CS:SCALEFAC
XOR AL,AL
XOR EDI,EDI
MOV ESI,8
FBSTP TBYTE PTR LODIGITS[0]
GETHIDIGIT: IF (@WordSize EQ 4)
OR AL,HIDIGITS[ESI] ;Find first nonzero digit
ELSE
OR AL,HIDIGITS[SI]
ENDIF
JNZ CALCHIORDER
DEC ESI
JNS GETHIDIGIT
XOR ESI,ESI ;There are no nonzero high digits
OR CL,CL ;See if a leading zero can be added to fraction
JZ CHKSIGN
INC ESI ;Add leading zero
JMP CHKSIGN
CALCHIORDER: MOV EDI,ESI
INC ESI ;Convert ESI to number of high digits
ADD ESI,ESI
AND AL,0F0H ;See if highest digit is in odd position
JNZ CHKSIGN
DEC ESI
CHKSIGN: MOV DL,HIDIGITS[9] ;Get sign byte
OR DL,DL
JNS CALCSPACES
INC ESI ;Account for "-"
CALCSPACES: SUB ECX,ESI ;Calculate number of leading spaces
JB SMALLFLD
JE PRNTSIGN
MOV AL," "
PRNTSPACES: CALL PCH
DEC ECX
JNZ PRNTSPACES
PRNTSIGN: OR DL,DL
JNS PRNTHIDIGITS
MOV AL,"-"
CALL PCH
DEC ESI
JZ PRNTDEC
PRNTHIDIGITS: IF (@WordSize EQ 4)
MOV DL,HIDIGITS[EDI]
ELSE
MOV DL,HIDIGITS[DI]
ENDIF
TEST ESI,01H
JNZ ODDDIGIT
HIDIGITLOOP: MOV AL,DL
SHR AL,4
ADD AL,48
CALL PCH
ODDDIGIT: MOV AL,DL
AND AL,0FH
ADD AL,48
CALL PCH
DEC EDI
JS PRNTDEC
IF (@WordSize EQ 4)
MOV DL,HIDIGITS[EDI]
ELSE
MOV DL,HIDIGITS[DI]
ENDIF
JMP HIDIGITLOOP
PRNTDEC: MOV ECX,NOLODIGITS
OR ECX,ECX
JZ EXIT
MOV AL,"."
CALL PCH
MOV EDI,8
LODIGITLOOP: IF (@WordSize EQ 4)
MOV DL,LODIGITS[EDI]
ELSE
MOV DL,LODIGITS[DI]
ENDIF
MOV AL,DL
SHR AL,4
ADD AL,48
CALL PCH
DEC ECX
JZ EXIT
MOV AL,DL
AND AL,0FH
ADD AL,48
CALL PCH
DEC ECX
JZ EXIT
DEC EDI
JNS LODIGITLOOP
EXIT: POP EDI
POP ESI
POP EDX
POP ECX
POP EAX
RET
FILLFLD: MOV ECX,NOLODIGITS
OR ECX,ECX
JNZ CALCNOCHARS
INC ECX
CALCNOCHARS: ADD ECX,NOHIDIGITS
PRNTCHAR: CALL PCH
DEC ECX
JNZ PRNTCHAR
JMP EXIT
SMALLFLD: MOV AL,"*"
JMP FILLFLD
OVERFLOW: FSTP ST ;Pop absolute value of number
MOV AL,">"
JMP FILLFLD
ALIGN 4
SCALEFAC:
DQ 43ABC16D674EC800H ;10 ^ 18
FPST ENDP
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -