Вопрос № 23949: Здравствуйте, уважаемые эксперты!
У меня к вам такой вопрос. У меня есть устройство (ИК приёмник), подключаемое к COM порту. Если загрузить Windows, а затем вместо подключённого к этому порту модема подключить устройство, моя программа не работет...Вопрос № 23962: Здраствуйте.
Мне нужно в имени файла отсечь расширение, для этого я ищу точку и заменяю ее 0 . Но почему-то компилятор ругается на это:
ShowFileInfo proc uses edi esi row:DWORD,lpFind:DWORD
LOCAL lvi:LV_ITEM
mov esi,lpFind...Вопрос № 23971: Помогите пожалуста разобраться с таким примером:
есть программа и это программа должна сама себя изменить вернее часть себя : я пытаюсь так (все для win 32) :
..........
start:
.......
m: dec ecx
........
....... mov...
Вопрос № 23.949
Здравствуйте, уважаемые эксперты!
У меня к вам такой вопрос. У меня есть устройство (ИК приёмник), подключаемое к COM порту. Если загрузить Windows, а затем вместо подключённого к этому порту модема подключить устройство, моя программа не работет(в частности ф-ция WaitCommEvent). Но если запустить программу, работающую с этим устройством(WinLIRC), то она работает и моя программа после неё работает. В чём может быть проблеммa? Пробовал открывать-закрывать порт, ф-ции PurgeComm, SetCommMask но всё безрезультатно! Помогите! Спасибо за ответы!
Отправлен: 24.07.2005, 07:28
Вопрос задал: Ермаков Алексей (статус: Посетитель)
Всего ответов отправлено: 1
Отвечает: Ddeedd
Здравствуйте, Ермаков Алексей!
Конечно я абсолютно не уверен в результате, но можно еще попробовать сделать SetupComm - эта функция должна полностью переинициализировать девайс, порулить GetCommConfig и SetCommConfig/SetDefaultCommConfig, попереустанавливать DCB через GetCommState/SetCommState. Если вдруг в процессе обмена данными была ошибка, то надо её сбросить путем ClearCommError перед любыми последующими действиями. Надо убедиться, что перед использованием WaitCommEvent стоит нужная маска событий, которую можно поставить через SetCommMask.
Может быть, чего-нибудь да будет.
Ответ отправил: Ddeedd (статус: 2-ой класс)
Отправлен: 24.07.2005, 14:02
Вопрос № 23.962
Здраствуйте.
Мне нужно в имени файла отсечь расширение, для этого я ищу точку и заменяю ее 0 . Но почему-то компилятор ругается на это:
ShowFileInfo proc uses edi esi row:DWORD,lpFind:DWORD
LOCAL lvi:LV_ITEM
Отправлен: 24.07.2005, 11:54
Вопрос задал: Sager (статус: 1-ый класс)
Всего ответов отправлено: 2
Отвечает: Ddeedd
Здравствуйте, Sager!
Надобно указать размер операнда, т.к. когда в память пихаешь непосредственное значение, непонятно, какого оно размера. Надо писать так:
sub edi, dword ptr [esi].cFileName ; здесь нормальные компилеры не воняют, т.к. и
; так все ясно, но TASM и прочие борландовские требуют строгости
mov byte ptr [edi], 0 ; здесь нужно указать byte, т.к. символы однобайтовые
; аналогично:
mov dword ptr [esi].cFileName, edi
Но вообще, мне непонятны действия:
после scasb edi указывает на байт после точки, после sub edi,.. и dec edi - в edi - длина строки до точки, но зачем тогда делать mov [edi], 0?
Надо это сделать до sub edi, ..., но после dec edi
А зачем делать mov [esi].cFileName, edi - т.е. портить указатель на начало строки - вообще тайна для меня.
;========== замечание от Евгения Иванова ====
здесь нужно находить адрес точки.
для этого отнимается от найденного адреса точки адрес начала строки!
================
Ответ отправил: Ddeedd (статус: 2-ой класс)
Отправлен: 24.07.2005, 13:39 Оценка за ответ: 5
Отвечает: Евгений Иванов
Здравствуйте, Sager!
ты вот так кури!
lea eax,[esi].cFileName
sub edi, eax
вообще-то отнимать не нужно ;)
хотя делать нужно именно так.
но попробуй просто так сделать
mov [edi],0
--------- Что имеем - не храним, потерявши - плачем
Ответ отправил: Евгений Иванов (статус: Профессор)
Отправлен: 27.07.2005, 21:09
Вопрос № 23.971
Помогите пожалуста разобраться с таким примером:
есть программа и это программа должна сама себя изменить вернее часть себя : я пытаюсь так (все для win 32) :
..........
start:
.......
m: dec ecx
........
....... mov eax,cs
mov ds,ax
mov eax,offset m
mov ecx,90h
mov [eax],ecx
end .....
но программа при выполнении выдаёт ошибку
Отправлен: 24.07.2005, 18:47
Вопрос задал: Kurbatov maksim Georgievich (статус: Посетитель)
Всего ответов отправлено: 2
Отвечает: Ddeedd
Здравствуйте, Kurbatov maksim Georgievich!
По адресу метки "m" находится однобайтовая инструкция "dec ecx" с кодом 49h, которую прога хочет забить на другую однобайтовую инструкцию "nop" она же "xchg eax, eax" с кодом 90h, проблема в том, что команда "mov [eax], ecx" изменяет 4 байта а не 1 - т.е. портит еще 3 байта последующего кода, т.е. решением будет код:
start:
.......
m: dec ecx
........
....... mov eax,cs
mov ds,ax
mov eax,offset m
mov cl,90h
mov [eax],cl ; или "mov byte ptr [eax], cl" - для некоторый компилеров только так
Если ошибка, конечно, именно в этом.
Ответ отправил: Ddeedd (статус: 2-ой класс)
Отправлен: 24.07.2005, 19:39
Отвечает: Евгений Иванов
Здравствуйте, Kurbatov maksim Georgievich!
в сегмент кода ничего писать нельзя, только читать и выполнять.
--------- Что имеем - не храним, потерявши - плачем
Ответ отправил: Евгений Иванов (статус: Профессор)
Отправлен: 27.07.2005, 19:06