Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.02.2013, 11:50   #11
intmain
Играюсь с Python
Форумчанин
 
Аватар для intmain
 
Регистрация: 12.12.2012
Сообщений: 340
По умолчанию

Цитата:
А printf не может выводить float, %f - это double.
разве? вот прекрасно выводит 1.0

Код:
#include <stdio.h>
#include <stdlib.h>

int main() 
{
    float f = 1.0f;

    printf("%f", f);
    
    system("pause");

    return 0;
}
Что ел то - в долг, что жил то - зря.
Для избранных. ))
Секретные разработки
intmain вне форума Ответить с цитированием
Старый 10.02.2013, 12:13   #12
intmain
Играюсь с Python
Форумчанин
 
Аватар для intmain
 
Регистрация: 12.12.2012
Сообщений: 340
По умолчанию

даже если в асме printf не в сихал вывести float значит мне нужно float преобразовать в double и вывести его, но как ?

float = 4 байта значит это dd ?
double = 8 байт = dq ?
Что ел то - в долг, что жил то - зря.
Для избранных. ))
Секретные разработки
intmain вне форума Ответить с цитированием
Старый 10.02.2013, 12:54   #13
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

В сишной проге float в таком случае преобразуется в double автоматически. Преобразовать можно, прогнав через FPU:
Код:
fld dword [...]
fstp qword [...]
Или инструкциями SSE2 ещё можно:
Код:
cvtss2sd xmm0, dword [...]
movsd qword [...], xmm0

Последний раз редактировалось Somebody; 10.02.2013 в 13:02.
Somebody вне форума Ответить с цитированием
Старый 10.02.2013, 13:30   #14
intmain
Играюсь с Python
Форумчанин
 
Аватар для intmain
 
Регистрация: 12.12.2012
Сообщений: 340
По умолчанию

вот что делает студия
Цитата:
float f = 1.0f;
004113CE fld1
004113D0 fstp dword ptr [f]

printf("%f", f);
004113D3 fld dword ptr [f]
004113D6 mov esi,esp
004113D8 sub esp,8
004113DB fstp qword ptr [esp]
004113DE push offset string "%f" (415744h)
004113E3 call dword ptr [__imp__printf (4182BCh)]
004113E9 add esp,0Ch
004113EC cmp esi,esp
004113EE call @ILT+315(__RTC_CheckEsp) (411140h)
а вот что я напридумывал
Код:
format PE console
entry main

include 'win32ax.inc'
;include 'PROC32.INC'

section '.code' code import writeable readable executable
        library kernel32, 'kernel32.dll', \
                msvcrt,   'msvcrt.dll'
        import kernel32, ExitProcess, 'ExitProcess',\
                         Sleep, 'Sleep'

        import msvcrt, printf, 'printf', \
                       scanf, 'scanf' , \
                       getch, '_getch'

main:
        stdcall sub1

        ;mov eax, [float_index]
        ;inc eax
        ;mov [float_index], eax
        add [float_index], 1
        ;promt to enter firts float
        cinvoke printf, param_promt, [float_index]
        ;reading user input as float
        cinvoke scanf, param_float, [float1]

        ; output float for check
        mov ebp,esp
        fld dword [float1]
        sub esp,8
        fstp qword [ebp-8]
        push param_float
        call printf
        add esp,12

        ;cinvoke printf, param_float, float1
        ;cinvoke scanf, param_string, val
        ;cinvoke printf, val
        ;cinvoke printf, hello
        cinvoke getch
        cinvoke ExitProcess, 0

proc sub1
     cinvoke printf, sub1_string
     ret
endp

;read-write
        val db '12', 0
        c dw 0
        float1 dd 0
        float2 dd 0
        float3 dd 0
        float_index dd 0;

;êîíñòàíòû
        hello db 'Hello world!', 10, 0
        sub1_string db 'this is asm proc',10, 0
        param_string db '%s', 0
        param_float db '%f',0
        param_promt db 'enter float %d: ', 0
не работает (
Что ел то - в долг, что жил то - зря.
Для избранных. ))
Секретные разработки
intmain вне форума Ответить с цитированием
Старый 10.02.2013, 13:52   #15
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

scanf надо адрес float1, а тут опять значение.
printf - это адрес в таблице импорта, где находится адрес функции, так что надо call [printf]. В cinvoke/invoke это уже учитывается: например, invoke func - это то же, что stdcall [func].
Хотя ExitProcess и не вернётся, всё же её надо invoke, а не cinvoke.
Somebody вне форума Ответить с цитированием
Старый 10.02.2013, 14:07   #16
intmain
Играюсь с Python
Форумчанин
 
Аватар для intmain
 
Регистрация: 12.12.2012
Сообщений: 340
По умолчанию

Цитата:
так что надо call [printf]
помогло, спасибо.

Код:
        ; output float for check
        mov ebp,esp
        fld dword [float1]
        sub esp,8
        fstp qword [ebp-8]
        push param_float
        stdcall [printf]
        add esp,12
щас думаю как ее в виде отдельной ф-ии оформить

я хочу уяснить для себя
[data] - это значение? но значением может быть адрес ф-й или переменной
data - это адрес по которому находиться значение ?
Что ел то - в долг, что жил то - зря.
Для избранных. ))
Секретные разработки

Последний раз редактировалось intmain; 10.02.2013 в 14:10.
intmain вне форума Ответить с цитированием
Старый 10.02.2013, 16:17   #17
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Код:
[data] - это значение? но значением может быть адрес ф-й или переменной
data - это адрес по которому находиться значение ?
В fasm - да. В других ассемблерах может быть по-другому.
Somebody вне форума Ответить с цитированием
Старый 14.02.2013, 11:49   #18
intmain
Играюсь с Python
Форумчанин
 
Аватар для intmain
 
Регистрация: 12.12.2012
Сообщений: 340
Вопрос

Новая проблемка.

Код:
format PE console
entry main

include 'win32ax.inc'
;include 'PROC32.INC'

section '.code' code import writeable readable executable
        library kernel32, 'kernel32.dll', \
                msvcrt,   'msvcrt.dll'
        import kernel32, ExitProcess, 'ExitProcess',\
                         Sleep, 'Sleep'

        import msvcrt, printf, 'printf', \
                       scanf, 'scanf' , \
                       getch, '_getch'

main:
        stdcall sub1

        ;mov eax, [float_index]
        ;inc eax
        ;mov [float_index], eax
        add [float_index], 2
        ;promt to enter firts float
        cinvoke printf, param_promt, [float_index]
        ;reading user input as float
        cinvoke scanf, param_float2, float1, float2

        ; output float for check
        mov ebp,esp
        fld dword [float1] ;save to st1
        fld dword [float2] ;save to st0

        sub esp, 8
        fst qword [ebp-8]
        sub esp, 8
        fst qword [ebp-16]

        fadd st0, st1



        push param_float2
        stdcall [printf]
        add esp, 20

        ;cinvoke printf, param_float, float1
        ;cinvoke scanf, param_string, val
        ;cinvoke printf, val
        ;cinvoke printf, hello
        cinvoke getch
        invoke ExitProcess, 0 ; return 0

;*****Functions************
proc sub1
     cinvoke printf, sub1_string
     ret
endp

;****VARs***********
;read-write
        val db '12', 0
        c dw 0
        float1 dd 0
        float2 dd 0
        float3 dd 0
        float_index dd 0;

;const
        hello db 'Hello world!', 10, 0
        sub1_string db 'this is asm proc',10, 0
        param_string db '%s', 0
        param_float db '%f',0
        param_float2 db '%f %f',0

        param_promt db 'enter float %d: ', 0
Хочу сложить два floata поэтому не выталкиваю их из fpu стека
Код:
        
fst qword [ebp-8]
...
Вместо
Код:
fstp qword [ebp-8]
...
Но тут возникает проблема на вывод идет только 2й флоат. Первого почему-то нету ?
если поставить fstp и закоментировать fadd st0, st1 то - все норм. В чем проблема, почему мне нельзя не выталкивать чтобы вывести их нормально?
Отлаживал с помошью OllyDbg, порядок заполнения fpu стека что с fstp что fst один и тот же, ввожу числа 1.1 и 2.2, получаю st1 = 1.1 st0 = 2.2.
Что ел то - в долг, что жил то - зря.
Для избранных. ))
Секретные разработки
intmain вне форума Ответить с цитированием
Старый 14.02.2013, 16:34   #19
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Код:
        sub esp, 8
        fst qword [ebp-8]
        sub esp, 8
        fst qword [ebp-16]
Так между этими fst стек не меняется - соответственно, в [ebp-8] и [ebp-16] оказывается одно и то же.
Somebody вне форума Ответить с цитированием
Старый 14.02.2013, 22:02   #20
intmain
Играюсь с Python
Форумчанин
 
Аватар для intmain
 
Регистрация: 12.12.2012
Сообщений: 340
По умолчанию

Цитата:
Так между этими fst стек не меняется - соответственно
Вы имеете ввиду fpu -стек (st0-st7) ? Точно, наверное проблема в этом.
а fst - st0 всегда сохраняет ? он может другие?)
Что ел то - в долг, что жил то - зря.
Для избранных. ))
Секретные разработки
intmain вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
scanf и матрица Berlioz Общие вопросы C/C++ 4 24.09.2012 15:12
Считывая нулей scanf nukede Общие вопросы C/C++ 3 05.04.2012 21:44
Проблема с функцией scanf() ichigo9911 Общие вопросы C/C++ 1 26.02.2012 21:12
доступ к переменным из scanf zl@dey Общие вопросы C/C++ 3 21.12.2011 13:49
аналог scanf() turtles Общие вопросы по Java, Java SE, Kotlin 1 09.04.2011 10:33