Вопрос № 56284: Здравствуйте. Написал программу, которая копирует 40 байт из файла fff в файл ddd. В итоге эти 40 байт копируются, но выскакивает критическая ошибка. Не подскажете из-за чего ? ...Вопрос № 56285: Здравствуйте. Не подскажете как правильно пользоваться штукой invoke . У меня постоянно выскакивают ошибки. Может потому что я использую Assembler Constructor ?...
Вопрос № 56.284
Здравствуйте. Написал программу, которая копирует 40 байт из файла fff в файл ddd. В итоге эти 40 байт копируются, но выскакивает критическая ошибка. Не подскажете из-за чего ?
Приложение:
Отправлен: 21.09.2006, 22:32
Вопрос задал: Whiteman (статус: Посетитель)
Всего ответов: 2 Мини-форум вопроса >>> (сообщений: 2)
Отвечает: ADSota
Здравствуйте, Whiteman!
А чему равен регистр ES при запуске? При запуске ES=CS и ты читаешь файл в область PSP, а там по смещению 0Ah [ES:0a] находиться адрес, по которому передается управление после завершения программы... И вообще после 22 байта там 18 байт недокументированной досовской информации, которая затирается... Просто нужно подобрать другой буфер для данных...
--------- Открыть глаза навстречу солнцу
Ответ отправил: ADSota (статус: Специалист)
Ответ отправлен: 22.09.2006, 09:21
Отвечает: ENS
Здравствуйте, Whiteman!
Нужно конкретно указывать для каких целей ты открываешь файл.
XOR AL,AL ; чтение
MOV AL,01; запись
MOV AL,02 ; все вместе
А вообще советую проверять на ошибки (после прерывания вставь обработку ошибки jc).
Надеюсь я тебе помог.
Ответ отправил: ENS (статус: 2-ой класс)
Ответ отправлен: 22.09.2006, 16:11
Вопрос № 56.285
Здравствуйте. Не подскажете как правильно пользоваться штукой invoke . У меня постоянно выскакивают ошибки. Может потому что я использую Assembler Constructor ?
Отправлен: 21.09.2006, 22:34
Вопрос задал: Whiteman (статус: Посетитель)
Всего ответов: 3 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: Pinkbyte
Здравствуйте, Whiteman!
По мне лучше не пользоваться специальными редакторами - круче фара для миня ничего нет, хотя это дело вкуса. Для правильного использования invoke нужно сначала обьявить прототип... То есть если имеете скажем API ExitProcess, то нужно сделать следующее(ExitProcess имеет 1 параметр типа DWORD - код выхода процесса)
ExitProcess PROTO :DWORD
А затем в теле программы использовать invoke так:
invoke ExitProcess,0 ; к примеру...
Однако для стандартных API существуют инклуд файлы, т. что если вам нужно подключить прототипы ф-ций библиотеки kernel32.dll используйте строчку вида
include путь_к_masm32includekernel32.inc
Вот и ВСЕ!
--------- Нейтральность - высшее достижение сознания
Ответ отправил: Pinkbyte (статус: 1-ый класс)
Ответ отправлен: 22.09.2006, 00:59
Отвечает: Jekyll
Здравствуйте, Whiteman!
Invoke'ом пользоватся очень легко. Можете представить invoke, как аналог инструкции call, разница в том, что invoke - это макрос, и ему можно передавать параметры, а можно и не передавать :))
Пример:
Функция Sleep:
void Sleep(
DWORD dwMilliseconds
);
можно вызвать как:
push 10000
call Sleep
так и :
invoke Sleep,1000
или так :)
push 1000
invoke Sleep
ps. если вы бы написали ошибки, которые у вас появляются, то ответ был бы более полон
Ответ отправил: Jekyll (статус: 1-ый класс)
Ответ отправлен: 22.09.2006, 13:17
Отвечает: ENS
Здравствуйте, Whiteman!
Не знаю от чего там у тебя ошибки. Но invoke пользуются так:
invoke SomeFunc,third,second,first
SomeFunc название функции или процедуры, параметр third кладется в стек последним, а first первым. Глянь эквивалент:
Push first
Push second
Push third
Call SomeFunc.
Надеюсь я тебе помог.
Ответ отправил: ENS (статус: 2-ой класс)
Ответ отправлен: 22.09.2006, 16:12