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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.12.2010, 22:16   #1
Devil21RUS
Пользователь
 
Регистрация: 03.12.2010
Сообщений: 13
Восклицание Не могу найти ошибку в коде написанном на FASM

Задача состоит в том чтобы в консоли ввести число , нажать ентер и на выводе получить значение синуса этого числа в рад(по моему).
Основной код (решение задачи работает правильно. Проблема с вводом, число которое вводишь с клавиатуры уходит неизвестно куда, и ответ выводит только нули. Помогите пожалуйста.
P.S. Код компиллируется.
Код:
; Программа вычисления sin (x)

format PE CONSOLE 4.0
entry start

include 'C:\fasmw16925\INCLUDE\win32a.inc'  ; подключаем win32a



section '.data' data readable writeable ; Секция ввода данных
        X   dq  ? ; Вводимое число в градусах


section '.code' code readable executable ; Секция кода вычисления sin и перевода числа в строку
start:

                invoke AllocConsole
                invoke GetStdHandle, STD_INPUT_HANDLE
                mov [in_handle], eax
                invoke GetStdHandle, STD_OUTPUT_HANDLE
                mov [out_handle], eax
                invoke WriteConsole, [out_handle], text, 17, 0 ; выводится сообщение о введении числа
                invoke ReadConsole, [in_handle], buf1, 4, NULL    ; Принимается число


    finit ;устанавливаем контекст FPU в его значении по умолчанию
    fld [X] ;задвигаем значение с плавающей точкой стек регистров FPU
    fsin ;Вычисление синуса
    fstp [X]; сохраняем число обратно в [X]
    mov eax, dword[X]; готовим к выводу

    cinvoke printf,ffmt,fX,dword[X],dword[X+4]; ввыводим

    stdcall waitforchar ; вызываем процесс waitforchar
    invoke  ExitProcess,0; выход из процесса

;   преобразования числа для дальнейшего вывода в консоли

proc waitforchar ; Описание процесса waitforchar
   cinvoke printf, strfmt, CRLF
   cinvoke printf, strfmt, msg
   cinvoke getchar
   ret
endp ; конец процесса

section '.data' data readable writeable
    ffmt      db  '%s = %.10f',0 ; используеться как формат вывода числа
    fX        db  'BbI4EcJIeHHbIu sin',0 ; сообщение
    CRLF      db  '',13,10,0  ; возвращает и переводит строки
    strfmt    db  '%s',0
    msg       db  'PUSH ENTER',0 ;  Закрытие консоли
    text      db  'Enter an number' ,0 ; Адрес строки
    in_handle dd ?
    out_handle dd ?
    buf1 dd ?


section '.idata' import data readable writeable

library kernel32,'kernel32.dll',\
        user32,  'user32.dll',\
        msvcrt,  'msvcrt.dll'

include 'C:\fasmw16925\INCLUDE\api\kernel32.inc' ; Подключение kernel32
include 'C:\fasmw16925\INCLUDE\api\user32.inc' ; Подключение user32

import msvcrt,\
       printf, 'printf',\
       getchar,'getchar'
И пожалуйста не давайте мне ссылки на мануалы, мне нужна помощь в конкретной ситуации чтобы разобраться в том куда делось число и как и откуда его воткнуть в X чтобы выходил нормальный ответ.
Devil21RUS вне форума Ответить с цитированием
Старый 11.12.2010, 23:03   #2
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,405
По умолчанию

Цитата:
число которое вводишь с клавиатуры уходит неизвестно куда, и ответ выводит только нули. Помогите пожалуйста.
Всмысле неизвестно куда? Никуда оно у вас не уходит.
Во первых - buf1 (как раз туда и уходит) в четыре байта, а учитывая 0D, 0a два, это маловато для ввода числа флоат.
Во вторых - ввели в buf1, а в сопроцессор загрузили [X], ну так ноль и получился.
В третьих - раз уж вы использовали msvcrt, то сам бог велел scanf_ом число считывать.
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru
Ulex вне форума Ответить с цитированием
Старый 11.12.2010, 23:54   #3
Devil21RUS
Пользователь
 
Регистрация: 03.12.2010
Сообщений: 13
По умолчанию

Я буф 1 пытался загрузить в х не вышло, fscan не знаю просто как использовать, если не сложно можешь написать замену куска через fscan
Код:
                invoke AllocConsole
                invoke GetStdHandle, STD_INPUT_HANDLE
                mov [in_handle], eax
                invoke GetStdHandle, STD_OUTPUT_HANDLE
                mov [out_handle], eax
                invoke WriteConsole, [out_handle], text, 17, 0 ; выводится сообщение о введении числа
                invoke ReadConsole, [in_handle], buf1, 4, NULL    ; Принимается число
Вот вместо этого куска
Devil21RUS вне форума Ответить с цитированием
Старый 12.12.2010, 00:19   #4
Devil21RUS
Пользователь
 
Регистрация: 03.12.2010
Сообщений: 13
По умолчанию

Помоги пожалуйста, очень надо.
Devil21RUS вне форума Ответить с цитированием
Старый 12.12.2010, 01:31   #5
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,405
По умолчанию

Блин, я сейчас выпал.
Написал, проверяю - забиваю значение X в калькулятор. Ну дальше посчитать sin, без задней мысли запоминаю чего там калькулятор насчитал. Забиваю то-же самое значение X в эту программку, смотрю - не совпадает. Где-то в программе ошибка!! И так битый час, я уже вообще в непонятках. А потом, не, оказывается на калькуляторе забыл градусы в радианы переключить. Ржака!!

Хотя всё равно чёт червь закрался. Кто из спецов гляньте, правильно вообще, или нет (я на fasm_e третий раз в жизни писал).
И, кстати, у меня вопрос, есть в fasme 80-ти битный тип данных (по типу dt в масм_е)? Ну чтоб прям FPU по максимуму. Или надо как-то извращаться?

Devil21RUS, на градусы сам переделаешь.

Код:
start:
    invoke AllocConsole
    invoke GetStdHandle, STD_INPUT_HANDLE
    mov [in_handle], eax
    invoke GetStdHandle, STD_OUTPUT_HANDLE
    mov [out_handle], eax
    invoke WriteConsole, [out_handle], text, 18, 0
    cinvoke scanf, scffmt, X_inp
    finit
    fld [X_inp]
    fsin
    fstp [X]
    cinvoke printf, ffmt, dword[X], dword[X+4]
    invoke  ExitProcess,0

section '.data' data readable writeable
    ffmt      db  'AAAA sin = %lf',0
    CRLF      db  '',13,10,0
    strfmt    db  '%s',0
    msg       db  'PUSH ENTER',0
    text      db  'Enter an number - ' ,0
    scffmt    db  '%f',0
    in_handle dd ?
    out_handle dd ?
    X dq 0, 0, 0
    X_inp dd 0
    buf1 db 128 dup (?)
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru
Ulex вне форума Ответить с цитированием
Старый 12.12.2010, 01:52   #6
Devil21RUS
Пользователь
 
Регистрация: 03.12.2010
Сообщений: 13
По умолчанию Спасибо большое

Спасибо но почемуто при компиляции ругается на
X dq 0, 0, 0
Пишет типо: Error: symbol already defined
чё с этим делать?
Devil21RUS вне форума Ответить с цитированием
Старый 12.12.2010, 02:18   #7
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,405
По умолчанию

Ну вы, блин, даёте. По русски же написано:
-символ уже определен
Я все данные собрал в одну секцию '.data', а у вас их было две, а зачем? Удалите один лишний X и будет счастье.
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru
Ulex вне форума Ответить с цитированием
Старый 12.12.2010, 02:23   #8
Devil21RUS
Пользователь
 
Регистрация: 03.12.2010
Сообщений: 13
По умолчанию Убирал

Убираешь вырисовывается ещё одна проблема
Вот что в окне ошибки выдаёт
Error: undefined symbol 'scanf'
Instruction:
call[scanf]
Devil21RUS вне форума Ответить с цитированием
Старый 12.12.2010, 04:52   #9
Devil21RUS
Пользователь
 
Регистрация: 03.12.2010
Сообщений: 13
По умолчанию Решено.

Проблема решена. СПАСИБО!
Devil21RUS вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не могу найти ошибку в коде!!! Прога элементарная!Помощ нужна! Fresh_MaN Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 11.04.2010 11:13
кто может исправить ошибку в моем коде написанном на С++ Андрей777 Общие вопросы C/C++ 7 10.04.2010 22:49
Матрицы. ОЧЕНЬ ВАЖНО !!! Не могу найти ошибку в коде pasha92 Помощь студентам 0 24.12.2009 20:19
не могу найти ошибку в коде pavelstraut Общие вопросы C/C++ 5 24.07.2009 23:20
Не могу найти ошибку в коде! Natasha666 Помощь студентам 1 20.05.2009 09:27