MASM32 как запихнуть в регистр\кинуть в стек(обычный, не FPU) 4х-байтовое число с плавающей запятой? пробовал так: mov eax,real4 ptr 45.4f mov eax,real4 ptr 45.4 mov eax,45.1 mov eax,45.1f mov eax,dword ptr 45.1f mov eax,dword ptr 45.1 пишет, мол ошибка, нэ знает, что это.(в эттаче скрин) можно засунуть в переменную, но это на 4 байта больше... и медленнее, и писать не удобно какой синтаксис должен быть?
Насколько помню, МАСМ не поддерживает загрузку вещественных чисел в РОНы, т.е. подходящего для решения этой задачи синтаксиса нет. Единственный выход -- ручками перевести в двоичное представление и грузить как обычную целую константу.
Только макросами это решается. Попробуй так. Код (Text): movr macro Register:REQ,Float4:REQ mov Register,0 org $-4 REAL4 Float4 endm movr edx,7.7e4
У меня есть решение! Для подобных целей когда-то написал макрос FLT(). Вот пример использования: Код (Text): mov eax,FLT(0.472) invoke glColor3f, FLT(0.23, 0.75),eax mov ecx,FLT(-0.056E+23) А вот и сам макрос (так и быть, пользуйтесь, дарю ): Код (Text): ;=============================================================== ;Реализация макроса FLT() (фрагмент макробиблиотеки kdvbase.inc) ;Автор: LShadow77 ;=============================================================== __?DigitsLine equ <0123456789> ;строка десятичных цифр __?SignLine equ <-+> ;знаки числа ;=============================================================== ;Макрос: INT2FLT() ;Назначение: приводит целую константу со знаком к формату FLOAT ;Параметры: ; IntNum - целое число со знаком ;=============================================================== INT2FLT MACRO IntNum:REQ __?FltResult = 0 IF (IntNum) NE 0 IF (IntNum) NE 80000000h __?FltSPart = (IntNum) SHR 31 __?FltTempNum = IntNum IF __?FltSPart EQ 1 __?FltTempNum = -__?FltTempNum ENDIF __?FltAbsNum = __?FltTempNum __?FltQPart = -1 WHILE __?FltTempNum NE 0 __?FltTempNum = __?FltTempNum SHR 1 __?FltQPart = __?FltQPart+1 ENDM IF __?FltQPart LT 24 __?FltMPart = (__?FltAbsNum SHL (23-__?FltQPart)) AND 007fffffh ELSE __?FltMPart = (__?FltAbsNum SHR (__?FltQPart-23)) AND 007fffffh ENDIF __?FltResult = (__?FltSPart SHL 31) OR ((__?FltQPart+127) SHL 23) OR __?FltMPart ELSE __?FltResult = 0CF000000h ENDIF ENDIF EXITM <__?FltResult> ENDM ;=============================================================== ;Макрос: @Raw25Mul24r() ;Назначение: перемножает две 24-битные мантиссы числа и возвращает ; старшие 25 бита произведения, а так же вычисляет бит ; коррекции на округление в зависимости от старшего из ; потеряных 23 бит результата ;Параметры: ; Num1 - первый множитель ; Num2 - второй множитель ;=============================================================== @Raw25Mul24r MACRO Num1:REQ,Num2:REQ __?Num1Lo = (Num1) AND 0fffh __?Num1Hi = (Num1) SHR 12 __?Num2Lo = (Num2) AND 0fffh __?Num2Hi = (Num2) SHR 12 __?Result = (__?Num1Lo*__?Num2Lo) SHR 12 __?Result = (__?Result+__?Num1Hi*__?Num2Lo+__?Num1Lo*__?Num2Hi) SHR 10 __?RoundBit = __?Result AND 1 __?Result = __?Result SHR 1 __?Result = __?Result+((__?Num1Hi*__?Num2Hi) SHL 1) EXITM <__?Result> ENDM ;=============================================================== ;Макрос: @FltMul() ;Назначение: перемножает два вещественных 32-битных числа ;Параметры: ; FltNum1 - первый множитель ; FltNum2 - второй множитель ;Примечание: неопределенность INF*0 трактуется как 0 ;=============================================================== @FltMul MACRO FltNum1:REQ,FltNum2:REQ __?FltResult = ((FltNum1) AND 80000000h) XOR ((FltNum2) AND 80000000h) IF ((FltNum1) AND 7fffffffh) NE 0 IF ((FltNum2) AND 7fffffffh) NE 0 IF ((FltNum1) AND 7f800000h) NE 7f800000h IF ((FltNum2) AND 7f800000h) NE 7f800000h __?FltQPart = ((FltNum1) SHR 23) AND 0ffh __?FltQPart = __?FltQPart+(((FltNum2) SHR 23) AND 0ffh)-127 __?FltMPart = ((FltNum1) AND 007fffffh) OR 00800000h __?FltMPart = @Raw25Mul24r(__?FltMPart,((FltNum2) AND 007fffffh) OR 00800000h) IF (__?FltMPart AND 01000000h) NE 0 __?FltQPart = __?FltQPart+1 __?RoundBit = __?FltMPart AND 1 ;new round correction __?FltMPart = __?FltMPart SHR 1 ENDIF __?FltMPart = __?FltMPart+__?RoundBit IF __?FltQPart GT 0 IF __?FltQPart LT 255 __?FltResult = __?FltResult OR (__?FltQPart SHL 23) OR \ (__?FltMPart AND 007fffffh) ELSE __?FltResult = __?FltResult OR 7f800000h ENDIF ENDIF ELSE __?FltResult = __?FltResult OR ((FltNum2) AND 7fffffffh) ENDIF ELSE __?FltResult = __?FltResult OR ((FltNum1) AND 7fffffffh) ENDIF ENDIF ENDIF EXITM <__?FltResult> ENDM ;=============================================================== ;Таблицы степеней десяти для 32-битных вещественных чисел ;=============================================================== __?FltTenPow0 equ 3F800000h ;1.0e0 __?FltTenPow1 equ 41200000h ;1.0e1 __?FltTenPow2 equ 42C80000h ;1.0e2 __?FltTenPow3 equ 447A0000h ;1.0e3 __?FltTenPow4 equ 461C4000h ;1.0e4 __?FltTenPow5 equ 47C35000h ;1.0e5 __?FltTenPow6 equ 49742400h ;1.0e6 __?FltTenPow7 equ 4B189680h ;1.0e7 __?FltTenPow8 equ 4CBEBC20h ;1.0e8 __?FltTenPow9 equ 4E6E6B28h ;1.0e9 __?FltTenPow10 equ 501502F9h ;1.0e10 __?FltTenPow11 equ 51BA43B7h ;1.0e11 __?FltTenPow12 equ 5368D4A5h ;1.0e12 __?FltTenPow13 equ 551184E7h ;1.0e13 __?FltTenPow14 equ 56B5E621h ;1.0e14 __?FltTenPow15 equ 58635FA9h ;1.0e15 __?FltTenPow16 equ 5A0E1BCAh ;1.0e16 __?FltTenPow17 equ 5BB1A2BCh ;1.0e17 __?FltTenPow18 equ 5D5E0B6Bh ;1.0e18 __?FltTenPow19 equ 5F0AC723h ;1.0e19 __?FltTenPow20 equ 60AD78ECh ;1.0e20 __?FltTenPow21 equ 6258D727h ;1.0e21 __?FltTenPow22 equ 64078678h ;1.0e22 __?FltTenPow23 equ 65A96816h ;1.0e23 __?FltTenPow24 equ 6753C21Ch ;1.0e24 __?FltTenPow25 equ 69045951h ;1.0e25 __?FltTenPow26 equ 6AA56FA6h ;1.0e26 __?FltTenPow27 equ 6C4ECB8Fh ;1.0e27 __?FltTenPow28 equ 6E013F39h ;1.0e28 __?FltTenPow29 equ 6FA18F08h ;1.0e29 __?FltTenPow30 equ 7149F2CAh ;1.0e30 __?FltTenPow31 equ 72FC6F7Ch ;1.0e31 __?FltTenPow32 equ 749DC5AEh ;1.0e32 __?FltTenPow33 equ 76453719h ;1.0e33 __?FltTenPow34 equ 77F684DFh ;1.0e34 __?FltTenPow35 equ 799A130Ch ;1.0e35 __?FltTenPow36 equ 7B4097CEh ;1.0e36 __?FltTenPow37 equ 7CF0BDC2h ;1.0e37 __?FltTenPow38 equ 7E967699h ;1.0e38 __?FltTenPowInv1 equ 3DCCCCCDh ;1.0e-1 __?FltTenPowInv2 equ 3C23D70Ah ;1.0e-2 __?FltTenPowInv3 equ 3A83126Fh ;1.0e-3 __?FltTenPowInv4 equ 38D1B717h ;1.0e-4 __?FltTenPowInv5 equ 3727C5ACh ;1.0e-5 __?FltTenPowInv6 equ 358637BDh ;1.0e-6 __?FltTenPowInv7 equ 33D6BF95h ;1.0e-7 __?FltTenPowInv8 equ 322BCC77h ;1.0e-8 __?FltTenPowInv9 equ 3089705Fh ;1.0e-9 __?FltTenPowInv10 equ 2EDBE6FFh ;1.0e-10 __?FltTenPowInv11 equ 2D2FEBFFh ;1.0e-11 __?FltTenPowInv12 equ 2B8CBCCCh ;1.0e-12 __?FltTenPowInv13 equ 29E12E13h ;1.0e-13 __?FltTenPowInv14 equ 283424DCh ;1.0e-14 __?FltTenPowInv15 equ 26901D7Dh ;1.0e-15 __?FltTenPowInv16 equ 24E69595h ;1.0e-16 __?FltTenPowInv17 equ 233877AAh ;1.0e-17 __?FltTenPowInv18 equ 219392EFh ;1.0e-18 __?FltTenPowInv19 equ 1FEC1E4Ah ;1.0e-19 __?FltTenPowInv20 equ 1E3CE508h ;1.0e-20 __?FltTenPowInv21 equ 1C971DA0h ;1.0e-21 __?FltTenPowInv22 equ 1AF1C901h ;1.0e-22 __?FltTenPowInv23 equ 19416D9Ah ;1.0e-23 __?FltTenPowInv24 equ 179ABE15h ;1.0e-24 __?FltTenPowInv25 equ 15F79688h ;1.0e-25 __?FltTenPowInv26 equ 14461206h ;1.0e-26 __?FltTenPowInv27 equ 129E74D2h ;1.0e-27 __?FltTenPowInv28 equ 10FD87B6h ;1.0e-28 __?FltTenPowInv29 equ 0F4AD2F8h ;1.0e-29 __?FltTenPowInv30 equ 0DA24260h ;1.0e-30 __?FltTenPowInv31 equ 0C01CEB3h ;1.0e-31 __?FltTenPowInv32 equ 0A4FB11Fh ;1.0e-32 __?FltTenPowInv33 equ 08A6274Ch ;1.0e-33 __?FltTenPowInv34 equ 0704EC3Dh ;1.0e-34 __?FltTenPowInv35 equ 0554AD2Eh ;1.0e-35 __?FltTenPowInv36 equ 03AA2425h ;1.0e-36 __?FltTenPowInv37 equ 02081CEAh ;1.0e-37 ;=============================================================== ;Макрос: FLTCAST() ;Назначение: возвращает двоичное значение вещественной ; 32-битной константы (ядро преобразований) ;Параметры: ; FltValue - вещественное число в десятичной записи ;=============================================================== FLTCAST MACRO _FltValue:REQ __?FltValue textequ <@CatStr(_FltValue)> ;для устранения некоторых глюков MASM32 __?FltValueLen sizestr __?FltValue IF __?FltValueLen NE 0 __?FltCurChar substr __?FltValue,__?FltValueLen,1 IFIDNI __?FltCurChar,<f> __?FltValueLen = __?FltValueLen-1 IF __?FltValueLen NE 0 __?FltValue substr __?FltValue,1,__?FltValueLen ENDIF ENDIF ENDIF __?FltCastResult = 0 IF __?FltValueLen NE 0 __?FltIndex = 1 __?FltBcdBuf textequ <> __?FltCurChar substr __?FltValue,1,1 IFIDN __?FltCurChar,<-> __?FltCastResult = 80000000h __?FltIndex = 2 ELSE IFIDN __?FltCurChar,<+> __?FltIndex = 2 ENDIF ENDIF __?FltCastState = 0 IF __?FltIndex EQ 2 IF __?FltValueLen EQ 1 __?FltCastState = 0ffh ;error ENDIF ENDIF IF __?FltCastState NE 0ffh __?FltCurChar substr __?FltValue,__?FltIndex,1 IF @InStr(1,%__?DigitsLine,%__?FltCurChar) EQ 0 IFIDN __?FltCurChar,<.> IF __?FltValueLen GT __?FltIndex __?FltCurChar substr __?FltValue,__?FltIndex+1,1 IF @InStr(1,%__?DigitsLine,%__?FltCurChar) EQ 0 __?FltCastState = 0ffh ;error ENDIF ELSE __?FltCastState = 0ffh ;error ENDIF ELSE __?FltCastState = 0ffh ;error ENDIF ENDIF ENDIF __?FltIsPoint = 0 __?FltNumPower = 0 WHILE __?FltCastState LT 80h IF __?FltIndex LE __?FltValueLen __?FltCurChar substr __?FltValue,__?FltIndex,1 ELSE __?FltCurChar textequ <__EOL__> ENDIF IF __?FltCastState EQ 0 ;skip zeros IFDIF __?FltCurChar,<0> IFIDN __?FltCurChar,<.> IF __?FltIsPoint EQ 0 __?FltIsPoint = 1 ELSE __?FltCastState = 0ffh ;error ENDIF ELSE IF @InStr(2,%__?DigitsLine,%__?FltCurChar) NE 0 __?FltBcdBuf textequ __?FltCurChar __?FltDigitCount = 1 __?FltNumPower = __?FltNumPower-__?FltIsPoint __?FltCastState = 1 ;read digits ELSE IFIDNI __?FltCurChar,<E> __?FltCastState = 2 ;start get exp part ELSE IFIDN __?FltCurChar,<__EOL__> __?FltCastState = 80h ;end of number read ELSE __?FltCastState = 0ffh ;error ENDIF ENDIF ENDIF ENDIF ELSE __?FltNumPower = __?FltNumPower-__?FltIsPoint ENDIF ELSEIF __?FltCastState EQ 1 ;read digits IF @InStr(1,%__?DigitsLine,%__?FltCurChar) NE 0 IF __?FltDigitCount LT 8 __?FltBcdBuf catstr __?FltBcdBuf,__?FltCurChar __?FltDigitCount = __?FltDigitCount+1 __?FltNumPower = __?FltNumPower-__?FltIsPoint ELSE IF __?FltIsPoint EQ 0 __?FltNumPower = __?FltNumPower+1 ENDIF ENDIF ELSE IFIDN __?FltCurChar,<.> IF __?FltIsPoint EQ 0 __?FltIsPoint = 1 ELSE __?FltCastState = 0ffh ;error ENDIF ELSE IFIDNI __?FltCurChar,<E> __?FltCastState = 2 ;start get exp part ELSE IFIDN __?FltCurChar,<__EOL__> __?FltCastState = 80h ELSE __?FltCastState = 0ffh ;error ENDIF ENDIF ENDIF ENDIF ELSEIF __?FltCastState EQ 2 ;start get exp part IF @InStr(1,%__?DigitsLine,%__?FltCurChar) NE 0 __?FltExpBuf textequ __?FltCurChar __?FltDigitCount = 1 __?FltCastState = 3 ;get exp part ELSE IF __?FltIndex LT __?FltValueLen __?FltDigitCount = 0 IFIDN __?FltCurChar,<-> __?FltExpBuf textequ <-> __?FltCastState = 3 ELSE IFIDN __?FltCurChar,<+> __?FltExpBuf textequ <+> __?FltCastState = 3 ELSE __?FltCastState = 0ffh ;error ENDIF ENDIF ELSE __?FltCastState = 0ffh ;error ENDIF ENDIF ELSEIF __?FltCastState EQ 3 ;get exp part IF @InStr(1,%__?DigitsLine,%__?FltCurChar) NE 0 IF __?FltDigitCount LE 9 __?FltExpBuf catstr __?FltExpBuf,__?FltCurChar __?FltDigitCount = __?FltDigitCount+1 ELSE __?FltCastState = 1ffh ;error - exp part too big ENDIF ELSE IFIDN __?FltCurChar,<__EOL__> __?FltNumPower = __?FltNumPower+(__?FltExpBuf) __?FltCastState = 80h ELSE __?FltCastState = 0ffh ;error ENDIF ENDIF ENDIF __?FltIndex = __?FltIndex+1 ENDM IF __?FltCastState EQ 80h IFNB __?FltBcdBuf __?FltAbsNum = INT2FLT(__?FltBcdBuf) IF __?FltNumPower GE 0 WHILE __?FltNumPower GT 38 __?FltAbsNum = @FltMul(__?FltAbsNum,__?FltTenPow38) __?FltNumPower = __?FltNumPower-38 ENDM __?FltAbsNum = @FltMul(__?FltAbsNum,@CatStr(__?FltTenPow,%__?FltNumPower)) ELSE __?FltNumPower = -__?FltNumPower WHILE __?FltNumPower GT 37 __?FltAbsNum = @FltMul(__?FltAbsNum,__?FltTenPowInv37) __?FltNumPower = __?FltNumPower-37 ENDM __?FltAbsNum = @FltMul(__?FltAbsNum,@CatStr(__?FltTenPowInv,%__?FltNumPower)) ENDIF __?FltCastResult = __?FltCastResult OR __?FltAbsNum IF __?FltAbsNum EQ 7f800000h .err <FLTCAST: number is out of range> ELSEIF __?FltAbsNum EQ 0 .err <FLTCAST: number is out of range> ENDIF ENDIF ELSEIF __?FltCastState EQ 0ffh .err <FLTCAST: syntax error> ELSE ;__?FltCastState EQ 1ffh .err <FLTCAST: exponential part too long> ENDIF ELSE .err <FLTCAST: need for number> ENDIF __?FltResult = __?FltCastResult EXITM <__?FltResult> ENDM ;=============================================================== ;Макрос: FLT() - наша цель :) ;Назначение: возвращает двоичное значение вещественной ; 32-битной константы, или список значений ;Параметры: ; FltValue1 - первое вещественное число в десятичной записи ; [FltValues] - остальные числа для списка ;=============================================================== FLT MACRO _FltValue1:REQ,_FltValues:VARARG __?FltArgsResult textequ <_FltValue1> __?FltArgsResult textequ %FLTCAST(__?FltArgsResult) __?FltValues textequ <_FltValues> IFNB __?FltValues %FOR CurFltValue,<__?FltValues> __?FltArgsResult catstr __?FltArgsResult,<,>,%FLTCAST(CurFltValue) ENDM ENDIF EXITM __?FltArgsResult ENDM Как-нибудь планирую выложить весь файл kdvbase.inc. Там много других полезных макросов, например DBL()
kernel16 именно в EAX? тогда так Код (Text): db 0B8h; ecx=0B9h,edx=0BAh,ebx=0BBh,esp=0BCh,ebp=0BDh,esi=0BEh,edi=0BFh dd 45.4
Код (Text): .586 .model flat, stdcall option casemap:none ; надо же хоть что-то в заголовке написать. потом пригодится. ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ; ЭТОТ МАКРОС ЕСТЬ В openGL исходниках на WASM.RU ; есть другие типы данных и их взаимный перевод ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ literal_float macro lit_float local local_float .data local_float real4 lit_float .code exitm <local_float> endm CFLT macro lit_float exitm <literal_float(lit_float)> endm ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .code start: mov eax,CFLT(45.4) ;и пихайте куда хотите, в регистр push CFLT(45.4) ;\в стек end start