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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.01.2011, 13:54   #1
AntonK8
 
Регистрация: 31.03.2008
Сообщений: 3
По умолчанию Проблема с float в Ассемблере

Помогите, пожалуйста. Возникла проблема с действительными числами. Вот программа, которая записывает 4 целых числа в файл. Программа полностью рабочая.
Код:
.8086
public _main
Extrn _scanf:proc
Extrn _printf:proc
.model small
.stack 100h
.data
n equ 4
a dw ?
format1 db "%d",0
fname db "numsint.bin",0
handle dw ?
msg1 db "Vvedit massiv koeficientiv:",13,10,'$'
msg2 db "Error",13,10,'$'
.code
.startup
LOCALS
_main proc near
call CreateFile
call WriteFile
ret
_main endp
.exit 0

CreateFile Proc near
mov ah,3ch
mov cx,0
lea dx,fname
int 21h
jc @@1
mov handle,ax
ret
@@1: call Error
ret
CreateFile endp

WriteFile proc near
mov ah,9h
lea dx,msg1
int 21h
mov cx,n
@@1: 
push cx
push offset a
push offset format1
call _scanf
add sp,4
mov ah,40h
mov bx,handle
mov cx,2
lea dx,a
int 21h
jc @@2
pop cx
loop @@1
ret
@@2:
Call Error
ret
WriteFile endp

Error proc near
mov ah,9h
lea dx,msg2
int 21h
ret
Error endp
End
Нужно ее переделать для работы с действительными числами. Вот мой вариант:
Код:
.8087
public _main
Extrn _scanf:proc
Extrn _printf:proc
.model small
.stack 100h
.data
n equ 4
a dd ?
format1 dw "%f",0
fname db "nums.bin",0
handle dw ?
msg1 db "Vvedit massiv koeficientiv:",13,10,'$'
msg2 db "Error",13,10,'$'
.code
.startup
LOCALS
FINIT
_main proc near
call CreateFile
call WriteFile
ret
_main endp
.exit 0

CreateFile Proc near
mov ah,3ch
mov cx,0
lea dx,fname
int 21h
jc @@1
mov handle,ax
ret
@@1: call Error
ret
CreateFile endp

WriteFile proc near
mov ah,9h
lea dx,msg1
int 21h
mov cx,n
@@1: 
push cx
push offset a
push offset format1
call _scanf
add sp,6 
mov ah,40h
mov bx,handle
mov cx,type a
lea dx,a
int 21h
jc @@2
pop cx
loop @@1
ret
@@2:
Call Error
ret
WriteFile endp

Error proc near
mov ah,9h
lea dx,msg2
int 21h
ret
Error endp

End
Первое число я ввожу, и программа сообщает “Ошибка при записи запись устройство PRN
Abort(стоп), Retry(повтор), Ignore(пропуск), Fail(сброс)”
В файл не записывается ничего.
Кажется, проблема явно с
Код:
push offset a
push offset format1
call _scanf
add sp,6
Потому что имею сомнения, правильно ли я очистил стек, и можно ли было вообще вносить в стек действительные числа?? Я плохо в этом разбираюсь. Помогите, пожалуйста, очень надо сделать.
AntonK8 вне форума Ответить с цитированием
Старый 06.01.2011, 14:45   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Это обязательно в DOS делать? Прерываниями?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 06.01.2011, 15:47   #3
AntonK8
 
Регистрация: 31.03.2008
Сообщений: 3
По умолчанию

Желательно прерываниями. Но не обязательно. Как я понял, Вы намекаете на то что стоит воспользоватся С-функциями для записи в файл? Сам я так еще не делал. Но такой способ в моем варианте допустим. Можете помочь?

Может у кого то есть какие то предложения? Сегодня к сожалению последний день для решения этой проблемы.

Последний раз редактировалось Stilet; 07.01.2011 в 12:02.
AntonK8 вне форума Ответить с цитированием
Старый 07.01.2011, 12:38   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

В общем если пригодится пользуйся на здоровье
Код:
format PE console
entry start
 
include 'D:\fasmw16726\INCLUDE\win32a.inc'
 
section '.data' data readable writeable
member dq 2.5
member2 dq 0.0
message db '%2.3f',0
f db 'c:\1\file.real',0
fl dd ?
bwr dd ?

section '.code' code readable executable

start:
  invoke CreateFile,f,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_ARCHIVE,0 ;
  mov [fl],eax
  invoke WriteFile,[fl],member,10,bwr,0
  invoke CloseHandle,[fl]

  invoke CreateFile,f,GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_ARCHIVE,0 ;
  mov [fl],eax
  invoke ReadFile,[fl],member2,10,bwr,0
  invoke CloseHandle,[fl]

  cinvoke printf,message,member2
  cinvoke getch
; INVOKE аналогичный макрос для STDCALL-функций. 
  invoke ExitProcess,0

section '.idata' import data readable
library kernel,'kernel32.dll',\
        msvcrt20,'msvcrt20.dll'
 
import kernel,\
       ExitProcess,'ExitProcess',\
       CreateFile,'CreateFileA',\
       WriteFile,'WriteFile',\
       ReadFile,'ReadFile',\
       CloseHandle,'CloseHandle'
 
import msvcrt20,\
       printf,'printf',\
       getch,'_getch'
Тут только с printf может быть косяк
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема со стеком в проге на ассемблере T(h)rasher Помощь студентам 23 26.09.2010 17:18
Не могу вернуть float из процедуры на ассемблере в си yukas Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 9 14.05.2010 04:08
FLOAT TO TRING И STRING TO FLOAT!! MelKiY_bad C++ Builder 6 07.05.2010 14:31
проблема с массивами в ассемблере student2010 Помощь студентам 1 21.01.2010 19:16
Проблема с работой с файлами на ассемблере ed_ward Помощь студентам 1 04.01.2010 18:29