⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pmprint.asm

📁 DOS保护模式下汇编程序设计.zip
💻 ASM
📖 第 1 页 / 共 2 页
字号:
               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 + -