digits EQU 4 ORG 100H start: MOV SI,Doubles main: FLD QWORD [SI] FST DWORD [TEMP] MOVUPS XMM0,[TEMP] CALL PrintFloat CALL @F DB ' CVTT/PACKUSWB/USWB:$' @@: POP DX MOV AH,9 INT 21H CVTTPS2DQ XMM1,XMM0 PACKUSWB XMM1,XMM1 PACKUSWB XMM1,XMM1 MOVD EAX,XMM1 CALL PrintNumB CALL @F DB ' CVT/PACKUSWB/USWB:$' @@: POP DX MOV AH,9 INT 21H CVTPS2DQ XMM1,XMM0 PACKUSWB XMM1,XMM1 PACKUSWB XMM1,XMM1 MOVD EAX,XMM1 CALL PrintNumB CALL @F DB ' CVT/PACKSSDW/USWB:$' @@: POP DX MOV AH,9 INT 21H CVTPS2DQ XMM1,XMM0 PACKSSDW XMM1,XMM1 PACKUSWB XMM1,XMM1 MOVD EAX,XMM1 CALL PrintNumB CALL newLine ADD SI,8 CMP SI,Last JB main newLine: MOV DL,13 MOV AH,2 INT 21H MOV DL,10 MOV AH,2 INT 21H RETN PrintNumB: MOV AH,0 MOVZX EAX,AX PrintNum: PUSHA SUB CX,CX .1: SUB EDX,EDX MOV EBX,10 DIV EBX ADD DL,'0' PUSH DX INC CX TEST EAX,EAX JNZ .1 .2: POP DX MOV AH,2 INT 21H LOOP .2 POPA RETN PrintFloat: FSTCW WORD [TEMP2] FSTCW WORD [TEMP] OR BYTE [TEMP+1],0CH FLDCW WORD [TEMP] FLDZ ; 0 Float FCOMIP ST0,ST1; Float JNA .1 MOV DL,'-' MOV AH,2 INT 21H FCHS ; Absfloat .1: FLD ST0 ; Absfloat Absfloat FRNDINT ; int Absfloat FSUB ST1,ST0 ; int frac FISTP DWORD [TEMP] ; frac MOV EAX,[TEMP] CALL PrintNum MOV DL,'.' MOV AH,2 INT 21H MOV BX,digits .2: FIMUL DWORD [Plus10] ;farc*10 FLD ST0 ; farc*10 farc*10 FRNDINT ; int farc*10 FSUB ST1,ST0 ; int frac FISTP DWORD [TEMP] ; frac MOV EAX,[TEMP] CALL PrintNum FLD TWORD [Epsilon] ; Epsilon frac FCOMIP ST0,ST1; frac JNB .3 DEC BX JNZ .2 MOV DL,'+' MOV AH,2 INT 21H .3: FSTP ST0 ; - FLDCW WORD [TEMP2] RETN Doubles: DQ 0.5 DQ 1.75 DQ 34.0 DQ 255.55 DQ 256.0 DQ 256.14 DQ 65536.0 DQ 16777216.0 DQ -1.0 DQ -257.0 DQ -0.01 DQ -65536.0 DQ -16777216.0 Last: Plus10 DD 10 Epsilon DT 0.0000000000001 TEMP: DD 0 TEMP2: DD 0