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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.09.2008, 21:33   #1
Dimon88
Пользователь
 
Регистрация: 18.10.2007
Сообщений: 41
По умолчанию Косяк в коде

Нужно что бы код работал следующим образом: запускаем, вводим угол, выщитывается синус, выводится результат, нажимаем Enter, выход. Мой код:
.
Код:
386
.model  flat, stdcall
option  casemap:none
include    \myasm\include\windows.inc
include    \myasm\include\kernel32.inc
include    \myasm\include\fpu.inc
includelib \myasm\lib\user32.lib
includelib \myasm\lib\kernel32.lib
includelib \myasm\lib\fpu.lib
BSIZE equ  30
.data
stdin      DWORD  ?
stdout      DWORD  ?
cWritten    DWORD  ?
cRead    DWORD  ?
buf         BYTE BSIZE dup (?)
.code
start:
invoke GetStdHandle,STD_INPUT_HANDLE
mov stdin,eax
invoke ReadConsole,stdin,ADDR buf,BSIZE,ADDR cRead,NULL
finit
fld buf   
fsin
invoke  GetStdHandle, STD_OUTPUT_HANDLE
mov     stdout, eax    
invoke  FpuFLtoA, 0, 10, ADDR buf, \
       SRC1_FPU or SRC2_DIMM
invoke  WriteConsoleA, stdout, ADDR buf, \
        BSIZE, ADDR cWritten, NULL
nop
invoke  ExitProcess, 0
end start
Надо найти ошибку, плиз...

Последний раз редактировалось rpy3uH; 18.09.2008 в 15:29.
Dimon88 вне форума Ответить с цитированием
Старый 17.09.2008, 21:53   #2
Dimon88
Пользователь
 
Регистрация: 18.10.2007
Сообщений: 41
По умолчанию

И еще не совсем понимаю строчку:
invoke FpuFLtoA, 0, 10, ADDR buf, SRC1_FPU or SRC2_DIMM
В справочниках по API не нашел описания
Dimon88 вне форума Ответить с цитированием
Старый 18.09.2008, 15:12   #3
Sweta
Форумчанин
 
Регистрация: 22.11.2007
Сообщений: 664
По умолчанию

К сожалению на буржуйском.

Код:
FpuFLtoA (
lpSrc1  //pointer to an 80-bit REAL number
lpSrc2  //pointer to, or value of, number of decimal digits to return

lpszDest //pointer to destination of result
uID  //ID flags for sources and format
)

uID
One of the SRC1_? flags must be OR'ed with only one of the SRC2_? flags and OR’ed with one of the STR_? flags. (The STR_REG flag does not need to be OR’ed if the string must be returned in decimal format; that is the default.)

uID Flag Meaning

SRC1_FPU Src is already on the FPU
SRC1_REAL Src is a pointer to an 80-bit REAL number

SRC2_DMEM Src2 is a pointer to a 32-bit unsigned integer
SRC2_DIMM Src2 is a 32-bit unsigned integer
Кроме этого какая ошибка возникает?
И чтобы консоль не закрывалась необходимо добавить функцию ожидания ввода символа или строки.
Неприятности приходят и уходят, а жизнь продолжается!

Последний раз редактировалось rpy3uH; 18.09.2008 в 15:30.
Sweta вне форума Ответить с цитированием
Старый 18.09.2008, 15:20   #4
Dimon88
Пользователь
 
Регистрация: 18.10.2007
Сообщений: 41
По умолчанию

Ругается на строчку:
fld buf
error A2070: invalid instruction operands
А что за функция ожидания ввода символа или строки?
Dimon88 вне форума Ответить с цитированием
Старый 18.09.2008, 15:33   #5
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

надо buf объявлять как DD или DQ.
и желательно писать так: fld [buf]
rpy3uH вне форума Ответить с цитированием
Старый 18.09.2008, 17:28   #6
Dimon88
Пользователь
 
Регистрация: 18.10.2007
Сообщений: 41
По умолчанию

Строчка:
fld [buf]
приводит к той же ошбке error A2070: invalid instruction operands
Dimon88 вне форума Ответить с цитированием
Старый 18.09.2008, 18:09   #7
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,405
По умолчанию

Цитата:
надо buf объявлять как DD или DQ.
Именно, только конкретно в вашем случае надо DT, так как далее вы используете функции из набора FPULIB, а они используют 80-ти битный float.

Вторая ошибка - вводите с консоли строку и её же пытатесь запихать в сопроцессор. Этот катер, не прокатит. Ну сделайте хотя-бы так:

Код:
invoke ReadConsole, stdin, addr [buf], BSIZE, addr [cRead], NULL
invoke  FpuAtoFL, addr buf, addr [J_temp], DEST_MEM
Третья ошибка- загрузили данные в сопроцессор, посчитали синус, а обратно выгрузить?

Подытожим:
вот это у меня работало

Код:
.386
.model  flat, stdcall
option  casemap:none
include    \masm32\include\user32.inc
include    \masm32\include\kernel32.inc
include    \masm32\include\fpu.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\fpu.lib
include    win32.inc

BSIZE equ  40
.data
stdin      DWORD  ?
stdout      DWORD  ?
cWritten    DWORD  ?
cRead    DWORD  ?
buf	db 40 dup(?)
J_temp	dt 10.000
.code
start:
invoke	GetStdHandle, STD_INPUT_HANDLE
mov	stdin, eax
invoke	GetStdHandle, STD_OUTPUT_HANDLE
mov	stdout, eax

invoke ReadConsole, stdin, addr [buf], BSIZE, addr [cRead], NULL
invoke  FpuAtoFL, addr buf, addr [J_temp], DEST_MEM

finit
fld	[J_temp]
fwait
fsin
fwait
fstp	[J_temp]

invoke	FpuFLtoA, addr [J_temp], 5, addr [buf], SRC1_REAL or SRC2_DIMM or STR_REG
invoke	WriteConsoleA, stdout, ADDR buf, BSIZE, ADDR cWritten, NULL
nop
invoke	ReadConsole,stdin,ADDR buf,BSIZE,ADDR cRead,NULL
invoke	ExitProcess, 0
end start
Ещё одну штуку интересную вспомнил - ReadConsole читает с консоли все вводимые символы, в том числе и 0Dh, 0Ah. А функция FpuAtoFl работает только с zero terminated строками. Предлагаю эту проблемму решить так:

Код:
invoke	ReadConsole, stdin, addr [buf], BSIZE, addr [cRead], NULL
mov	eax, offset [buf]
add	eax, [cRead]
sub	eax, 2
mov	byte ptr [eax], 0
invoke	FpuAtoFL, addr [buf], addr [J_temp], DEST_MEM
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru

Последний раз редактировалось rpy3uH; 18.09.2008 в 18:47.
Ulex вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
косяк с DVD-ROMом( marshall Компьютерное железо 17 29.08.2008 20:45
Помогите исправить косяк в задаче на динамические переменные списки Taisja Помощь студентам 2 31.05.2008 21:49
Нахождение эйлерова цикла, косяк vendigo Общие вопросы C/C++ 1 22.11.2007 14:14
косяк при организации итерационных вычислений redfield Microsoft Office Excel 3 04.09.2007 21:35
Косяк Sanctuar Помощь студентам 1 18.06.2007 07:36