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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.01.2010, 02:07   #1
devilmm
 
Регистрация: 28.11.2009
Сообщений: 6
По умолчанию Запись\Открытие файла на Assembler

Всем доброго времени суток!
Недавно, очень потребовался низко уровневый вывод в файл. Но знаний в асм мало, поэтому прошу, помогите! компилятор находит ошибки, хотя вроде бы все правильно (но если ошибки, значит косяков много) =(((

<code>
...
//Открываем файл
push 0
push File_Attribute_Normal
push Open_Always
push 0
push 0
push Generic_Write
push offset fname
call CreatefileA
cmp eax,0ffffffffh // Тут выдается ошибка (текст ошибки в конце поста)
je @@exit
mov hFile,eax

//Опр.размер
push hFile
push 0
call GetFileSize
mov sz,eax

//устанавливаем указатель в файле
push hFile
push sz
push 0
push File_Begin
call SetFilePointer

//Собственно пишем данные в файл
push 0
push offset ZapisanoBytes
push len
push str
push hFile
call Writefile
cmp eax,0
jz @@exit

//Закрываем файл
push hFile
call Closehandle
...
</code>

Ошибка следующая:
" Project1.exe raised exception class EAccessViolation with message 'Access violation at address 7C9012B4' in module ntdll.dll. Read of address ffffffffc ....."

Если, кто знает в чем дело отпишитесь, очень нужна помощь.

Пишу на Дельфи, м\б дело в нем, хотя м\б этот код сам по себе не правильно написан, если так то подскажите что-нибудь.....
devilmm вне форума Ответить с цитированием
Старый 17.01.2010, 02:27   #2
Xatr
Форумчанин
 
Аватар для Xatr
 
Регистрация: 17.09.2008
Сообщений: 349
По умолчанию

если open_always, то он должен открывать существующий файл. Чтобы создать новый - CREATE_NEW
создаёт файл и пишет в нём строку. только всё время переписывает 2 первых символа.
Код:
.386
.model flat,stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\kernel32.lib
.data?
d dd ?
o db ?
r dd ?
.const
fname db "1.txt",0
ab db "11",0
.code
start:
invoke CreateFileA,offset fname,GENERIC_WRITE,0,0,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,0
mov d,eax
invoke GetFileSize,0,eax
invoke SetFilePointer,FILE_BEGIN,0,addr r,d
invoke WriteFile,d,offset ab,2,offset o,0
invoke CloseHandle,d
invoke ExitProcess,0
end start
если чем помог, поставьте отзыв на весы

Последний раз редактировалось Xatr; 17.01.2010 в 02:44.
Xatr вне форума Ответить с цитированием
Старый 17.01.2010, 02:39   #3
Goodwin98
equ asm
Участник клуба
 
Аватар для Goodwin98
 
Регистрация: 02.05.2009
Сообщений: 1,605
По умолчанию

Цитата:
cmp eax,0ffffffffh
А дельфи вообще понимает такую запись шестнадцатеричных чисел ?
М/б нужно 0xffffffff или даже просто -1 написать ?

devilmm, Можешь exe'шник кинуть ?
Какой вопрос - такой ответ. Не забываем пользоваться поиском, гуглом.
Помощь в выполнении работ по ассемблеру ICQ:2725322O4

Последний раз редактировалось Goodwin98; 17.01.2010 в 02:43.
Goodwin98 вне форума Ответить с цитированием
Старый 17.01.2010, 02:41   #4
devilmm
 
Регистрация: 28.11.2009
Сообщений: 6
По умолчанию

Ну это понятно. Файл присутсвует, в который надо записывать. Все равно тоже самое, даже если его нету, уже и это проверил.. =))

вот весь код, м\б тут где-то есть ошибка..хотя вроде все ок...:
<code>
procedure TForm1.Button1Click(Sender: TObject);
var
ZapisanoBytes : Cardinal;
hFile: Thandle;
str:PAnsiChar;
len: integer;
sz: DWORD;
fname: PAnsiCHAR;

begin
fname:='C:\log.txt';
str:='fuck';
len:=length(str);

asm
//Открываем файл
push 0
push File_Attribute_Normal
push Open_Always
push 0
push 0
push Generic_Write
push offset fname
call CreatefileA
cmp eax,0ffffffffh // Тут выдается ошибка (текст ошибки в конце поста)
je @@exit
mov hFile,eax

//Опр.размер
push hFile
push 0
call GetFileSize
mov sz,eax

//устанавливаем указатель в файле
push hFile
push sz
push 0
push File_Begin
call SetFilePointer

//Собственно пишем данные в файл
push 0
push offset ZapisanoBytes
push len
push str
push hFile
call Writefile
cmp eax,0
jz @@exit

//Закрываем файл
push hFile
call Closehandle

@@exit:
push 0
call ExitProcess
end;
end;
</code>
devilmm вне форума Ответить с цитированием
Старый 17.01.2010, 02:52   #5
devilmm
 
Регистрация: 28.11.2009
Сообщений: 6
По умолчанию

если установить -1 , то выдается аналогичная ошибка при выполнении процедуры. Но прога компилится и в принципе полет нормальный.

если так 0xffffffffh, то он воспринимает это, как необъявленную переменную.

Судя по всему да, скорее всего воспринимает. Компилирует программу без ошибок. Только когда идет выполнение процедуры. Выдается собственно ошибка чтения памяти.


Ща сек, откомпилю.. =)))

Давай почту)) или залить куда-нить?

Последний раз редактировалось devilmm; 17.01.2010 в 02:56.
devilmm вне форума Ответить с цитированием
Старый 17.01.2010, 02:57   #6
Goodwin98
equ asm
Участник клуба
 
Аватар для Goodwin98
 
Регистрация: 02.05.2009
Сообщений: 1,605
По умолчанию

на форуме прикрепи или залей на какой-нибудь ghost.ru , dump.ru
Какой вопрос - такой ответ. Не забываем пользоваться поиском, гуглом.
Помощь в выполнении работ по ассемблеру ICQ:2725322O4
Goodwin98 вне форума Ответить с цитированием
Старый 17.01.2010, 03:10   #7
devilmm
 
Регистрация: 28.11.2009
Сообщений: 6
По умолчанию

Вот ссылка:на компилиную горе прогу:
http://dump.ru/file/4150810

очень извиняюсь .что так долго ...
GPRS дает о себе знать... и размер проги(((
devilmm вне форума Ответить с цитированием
Старый 17.01.2010, 03:17   #8
Goodwin98
equ asm
Участник клуба
 
Аватар для Goodwin98
 
Регистрация: 02.05.2009
Сообщений: 1,605
По умолчанию

Там вместо имени файла в стек заносится какая-то фигня, а именно ffffffffc. Так что играйся с push offset fname
Какой вопрос - такой ответ. Не забываем пользоваться поиском, гуглом.
Помощь в выполнении работ по ассемблеру ICQ:2725322O4
Goodwin98 вне форума Ответить с цитированием
Старый 17.01.2010, 03:23   #9
devilmm
 
Регистрация: 28.11.2009
Сообщений: 6
По умолчанию

окей.. спасибо большое.. сейчас чего-нибудь поделаю с этим... )
devilmm вне форума Ответить с цитированием
Старый 17.01.2010, 05:57   #10
--=SaNitinDG=-
Пользователь
 
Регистрация: 14.01.2010
Сообщений: 61
По умолчанию

Цитата:
call CreatefileA
cmp eax,0ffffffffh // Тут выдается ошибка (текст ошибки в конце поста)
[/QUOTE]
Может так надо

Цитата:
INVOKE CreateFile, ADDR szFile, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL

.IF eax != INVALID_HANDLE_VALUE

Какой то код
.else

INVOKE MessageBox, hWin, abbr Open_the_file_Error, ADDR szErrorTitle, MB_ICONWARNING

.ENDIF

Извинюсь тупанул что то мне уже везде Ассемблер мерещится
Опыт не пропьешь если он есть=)))

Последний раз редактировалось --=SaNitinDG=-; 17.01.2010 в 07:55.
--=SaNitinDG=- вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
открытие файла vo_sa Общие вопросы C/C++ 7 25.06.2009 11:23
Открытие файла и создание графика на основе чисел из файла Simon..14 Общие вопросы C/C++ 8 09.06.2009 10:18
Открытие файла Veiron Общие вопросы Delphi 2 27.02.2008 03:12
Открытие файла Lexakazanskij Паскаль, Turbo Pascal, PascalABC.NET 9 01.11.2007 22:27