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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.02.2013, 22:36   #21
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Большая часть инструкций FPU работает с st(0). В данном случае можно fst делать сразу после fld, а так вообще есть fxch, которая довольно дёшево обходится по скорости, так что их можно много использовать, чтобы в st(0) было то, что надо.
Somebody вне форума Ответить с цитированием
Старый 15.02.2013, 00:39   #22
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], 1
        ;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 st(0)
        sub esp, 8          ;add offset stack
        fst qword [ebp-16]  ;save st0 to mem
        ;fdecstp
        fld dword [float2]  ;save to st(0)
        sub esp, 8          ;add offset stack
        fst qword [ebp-8]   ;save st0 to mem

        ;print input floats
        push param_float2
        stdcall [printf]
        add esp,20


        ; sub of floats st0 = st0 + st1
        fadd st0, st1
        ;print sum
        mov ebp,esp
        sub esp, 8
        fstp qword [ebp-8]  ;save st0 to mem
        push param_sum
        stdcall [printf]
        add esp,12




        ;cinvoke printf, param_float, float1
        ;cinvoke scanf, param_string, val
        ;cinvoke printf, val
        ;cinvoke printf, hello
        cinvoke getch
        invoke 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_float2 db '%f %f',0
        param_sum db 10, 'sum of floats: %f', 0

        param_promt db 'enter float %d: ', 0
Что ел то - в долг, что жил то - зря.
Для избранных. ))
Секретные разработки
intmain вне форума Ответить с цитированием
Старый 16.02.2013, 15:23   #23
intmain
Играюсь с Python
Форумчанин
 
Аватар для intmain
 
Регистрация: 12.12.2012
Сообщений: 340
По умолчанию

Пытаюсь понять как задаются структуры с параметрами инициализации, но ничего не выходит.
Вот структура
Код:
;struct types
struct vec3, xx , yy, zz
       x dd xx
       y dd yy
       z dd zz
ends
А вот так инициализирую её
Код:
vector vec3 1, 2, 3
FASM ругается на ошибку( Как надо?
Что ел то - в долг, что жил то - зря.
Для избранных. ))
Секретные разработки
intmain вне форума Ответить с цитированием
Старый 16.02.2013, 21:50   #24
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Читай документацию. По-моему, тут перепутаны синтаксисы struc и struct. struc - встроенный макрос; struct - макрос из macro/struct.inc, который делает объявление структур похожим на masm/tasm.
Код:
struc vec3 xx, yy, zz
{
       x dd xx
       y dd yy
       z dd zz
}
vector vec3 1, 2, 3
Код:
struct vec3
       x dd ?
       y dd ?
       z dd ?
ends
vector vec3 1, 2, 3
Somebody вне форума Ответить с цитированием
Старый 19.02.2013, 19:13   #25
intmain
Играюсь с Python
Форумчанин
 
Аватар для intmain
 
Регистрация: 12.12.2012
Сообщений: 340
Вопрос

У меня так и не получилось вывести заранее инициализированный вектор флоатов, думал что проблема в самом выводе - сделал ввод через scanf - выводит.

Вопрос: И все-таки что нужно сделать чтобы выводились флоаты которые уже заданы в программе?

Вопрос 2: Я долго мучился прежде чем у меня получилось вывести вектор своей функцией (print_vec3), потом где-то прочитал что структуры лучше передавать как указатель в регистре (ebx), вот в связи с этим не могли бы вы рассказать подробнее как правильно передавать структуры и возвращать их? почему именно ebx? и куда их ложит cinvoke/invoke в таком случае?

Может такое можно записать несколько компактней с cinvoke?
Код:
       push ebx ;save old ebx value
       mov ebx, v ; move to ebx addres of v
       stdcall print_vec3, v ;call print vec
       pop ebx ;restore old ebx



Полный Код.
Код:
format PE console
entry main

include 'win32ax.inc'
include 'macro/struct.inc'
;include 'struct.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:

       cinvoke scanf, param_float3, v.x, v.y, v.z

       ;push esp
       mov ebp, esp

       ;push vector

       fld dword [v.x]  ;save to st(n)
       fld dword [v.y]  ;save to st(n)
       fld dword [v.z]  ;save to st(n)

       sub esp, 8
       fstp qword [ebp-8]  ;save st0 to mem and pop

       sub esp, 8
       fstp qword [ebp-16]  ;save st0 to mem and pop

       sub esp, 8
       fstp qword [ebp-24]  ;save st0 to mem and pop

       ;print input floats
       push param_float3
       stdcall [printf]
       add esp,28
       ;pop esp

       ;new line
       cinvoke printf, param_delimiter


       push ebx ;save old ebx value
       mov ebx, v ; move to ebx addres of v
       stdcall print_vec3, v ;call print vec
       pop ebx ;restore old ebx

       ; pause on exit
       cinvoke getch
       invoke ExitProcess, 0 ;return 0

proc sub1
     cinvoke printf, sub1_string
     ret
endp

proc print_vec3 c, vec
        ;push ebp
        ;mov ebp,esp
        fld dword [ebx]  ;save to st(n)
        fld dword [ebx+4]  ;save to st(n)
        fld dword [ebx+8]  ;save to st(n)

        sub esp, 8
        fstp qword [ebp-8]  ;save st0 to mem
        sub esp, 8
        fstp qword [ebp-16]  ;save st0 to mem
        sub esp, 8
        fstp qword [ebp-24]  ;save st0 to mem

        ;print input floats
        push param_float3
        stdcall [printf]
        add esp,28
        ret
endp


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

;struct types
struct vec3
       x dd 11
       y dd 22
       z dd 33
ends
        v vec3 1, 2, 3
;êîíñòàíòû
        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_float3 db '%f %f %f',0
        param_delimiter db 10,'===========================',10,0

        param_sum db 10, 'sum of floats: %f', 0

        param_promt db 'enter float %d: ', 0
Что ел то - в долг, что жил то - зря.
Для избранных. ))
Секретные разработки
intmain вне форума Ответить с цитированием
Старый 20.02.2013, 17:53   #26
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Цитата:
v vec3 1, 2, 3
1, 2, 3 - целые. Может быть, 1.0, 2.0, 3.0?
Цитата:
как правильно передавать структуры и возвращать их? почему именно ebx? и куда их ложит cinvoke/invoke в таком случае?
Что значит, как "правильно"? Как захочется. Если каким-то не своим функциям, то в зависимости от соглашения о вызовах. Так вообще просто указатель, в том числе есть надо вернуть структуру - тогда указатель на структуру, в которую писать результат. Почему тут именно ebx - непонятно. invoke со структурой - никак.
Если переменные назвать, будет меньше проблем... Если по-высокоуровневому (хоть и с лишним копированием данных):
Код:
proc print_vec3 vec
locals
        x dq ?
        y dq ?
        z dq ?
endl
        mov edx, [vec]
        fld dword [edx + vec3.x]
        fstp [x]
        fld dword [edx + vec3.y]
        fstp [y]
        fld dword [edx + vec3.z]
        fstp [z]
        cinvoke printf, param_float3, double [x], double [y], double [z]
        ret
endp
(Хотя в таком варианте больше подойдёт vprintf.)
Если с учётом конкретной ситуации:
Код:
proc print_vec3 vec
locals
        x dq ?
        y dq ?
        z dq ?
endl
        mov edx, [vec]
        fld dword [edx + vec3.x]
        fstp [x]
        fld dword [edx + vec3.y]
        fstp [y]
        fld dword [edx + vec3.z]
        fstp [z]
        cinvoke printf, param_float3
        ret
endp
Как насчёт чтения fasm.pdf? Там много интересного.

Последний раз редактировалось Somebody; 20.02.2013 в 17:56.
Somebody вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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