Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: программирование на языке Assembler


Информационный Канал Subscribe.Ru

РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Assembler

Выпуск № 200
от 29.07.2005, 21:50

Администратор:Калашников О.А.
В рассылке:Подписчиков: 249, Экспертов: 17
В номере:Вопросов: 3, Ответов: 5


Вопрос № 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

mov esi,lpFind
assume esi:ptr WIN32_FIND_DATA
mov lvi.imask,LVIF_TEXT+LVIF_PARAM
push row
pop lvi.iItem
mov lvi.iSubItem,0
lea edi,[esi].cFileName
mov ecx,128
xor eax,eax
mov al,2eh
repne scasb
sub edi,[esi].cFileName ; error:invalid instruction operand
dec edi
mov [edi],0 ; error:invalid instruction operand
mov [esi].cFileName,edi; error:invalid instruction operand

....
ShowFileInfo endp
Отправлен: 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


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2005, RusFAQ.ru, Россия, Москва. Все права защищены.
Идея, дизайн, программирование, авторское право: Калашников О.А.

Яндекс


Subscribe.Ru
Поддержка подписчиков
Другие рассылки этой тематики
Другие рассылки этого автора
Подписан адрес:
Код этой рассылки: comp.soft.prog.faq
Отписаться
Вспомнить пароль

В избранное