Вопрос № 17361: гДПЮБЯРБСИРЕ. оШРЮЪЯЭ МЮОХЯЮРЭ ОПНЦПЮЛЛС ДКЪ ПЮАНРШ Я ОНВРНИ, ЯРНКЙМСКЯЪ Я МЕПЕЬХЛНИ (ДКЪ ЛЕМЪ) ОПНАКЕЛНИ. мЕ ЛНЦС ОНМЪРЭ ЙЮЙ ОЕПЕЙНДХПНБЮРЭ РЕЛС ОХЯЭЛЮ - {Subject: =?koi8-r?B?8M/E08vB1snUxQ==?=}. оНМЪРМН ВРН ЙНДХПНБЙЮ koi8-r, МН ЙЮЙ ДЕИЯРБНБЮРЭ ДЮКЭ...Вопрос № 17363: Здравствуйте,господа эксперты.С праздником защитников отечества вас всех.
Не давно начал изучать асм под Win32, и попутно API. Написав простое приложение,
которое,должно выводить на экран окошко МеsageBox,далее должен 10 раз выполнятся цикл<b...Вопрос № 17395: Здравствуйте уважаемые эксперты.Снова возвращаюсь к вопросу 17363 Пепеписал приложение.
В качестве счетчика цикла исползовал esi.Под отладчиком вроде выполняется. А без отладчика
цикл,не выполняется.В чем дело?Заранее благодарен Юрий.Пример п...
Отправлен: 23.02.2005, 06:16
Вопрос задал: TSV (статус: Посетитель)
Всего ответов отправлено: 1
Отвечает: Вiктор
Здравствуйте, TSV!
с кодировкой вы явно накосячили.
{Subject: =?koi8-r?B?8M/E08vB1snUxQ==?=}. - ничего непонятно.
наверно вам пришло письмо, вы его сохранили в eml-формате, а потом
кодировка сбилась...
советую вам если уж такое дело: pishite translitom. togda budet ponyatno.
а вопрос советую повторить в кодировке win1251
Ответ отправил: Вiктор (статус: 2-ой класс)
Отправлен: 23.02.2005, 16:23
Вопрос № 17363
Здравствуйте,господа эксперты.С праздником защитников отечества вас всех.
Не давно начал изучать асм под Win32, и попутно API. Написав простое приложение,
которое,должно выводить на экран окошко МеsageBox,далее должен 10 раз выполнятся цикл
и выполнятся MessageBeep.Но у меня моя задумка не вышла."Поковырявшись" в отладчике
я понял,что многие библиотечные функции меняют ecx. Как мне быть? Юрий
Приложение:
Отправлен: 23.02.2005, 07:55
Вопрос задал: ua4aqc (статус: Посетитель)
Всего ответов отправлено: 5
Отвечает: Евгений Иванов
Здравствуйте, ua4aqc!
остаются неизменёнными только EBX, ESI, EDI, EBP.
остальные регистры изменяются, это, между прочим, написано в документации.
что делать?
просто сохраняй его
push ecx
Call WinAPI
pop ecx
или просто используй EBX
mov ebx,10h
L:
call Messagebeep
dec ebx
jnz L
Удачи!
Ответ отправил: Евгений Иванов (статус: Профессор)
Отправлен: 23.02.2005, 11:54
Отвечает: Undertaker
Здравствуйте, ua4aqc! Взаимно. Регистр ecx изменяют не библиотечные функции, как Вы предположили, а процедура Messagebeep, обнуляя на выходе его значение. Удалите строку 43 xor eax, eax.
Дополнение от Евгения Иванова:
Я думаю, что Undertaker имел ввиду XOR ECX,ECX
. И заметьте, что никаких предположений делать не нужно. Всё описано в документации, какие регистры изменяются, а какие не меняются.
Небольшой тест :)))
Согласен в тем, что надо смотреть документацию на тему, какие регистры меняются, а какие-нет. Список регистров, содержимое которых не меняется при вызове API функций: ebx, esi, edi, ebp и (при типе вызова stdcall) esp.
Bob Johnson
Ответ отправил: Undertaker (статус: 4-ый класс)
Отправлен: 23.02.2005, 12:36
Отвечает: AxMAD
Здравствуйте, ua4aqc!
Просто сделайте так:
L:
push ecx
call Messagebeep
pop ecx
loop L
Ответ отправил: AxMAD (статус: Студент)
Отправлен: 23.02.2005, 12:36
Отвечает: John Freeman
Здравствуйте, ua4aqc!
Так не юзай ecx - адрес в памяти _вроде_ такой конструкции:
counter db ah
:metka
call messagebeepproc
dec counter
jnz metka
Ответ отправил: John Freeman (статус: Специалист)
Отправлен: 23.02.2005, 14:52
Отвечает: Dark_Lord
Здравствуйте, ua4aqc!
Почти все "библиотечные" функции изменяют есх, так как по соглашениям stdcall процедура не изменяет ebx, esi, edi (, ebp, esp), остальные регистры не сохраняются. Но цикл не обязательно делать при помощи есх, например :
mov esi, 10h
L:
call Messagebeep
dec esi
jnz L
Или можно просто на время выполнения тела функции сохранять есх:
mov ecx,10h
L:
push ecx
call Messagebeep
pop ecx
dec ecx
jnz L
Ответ отправил: Dark_Lord (статус: Профессионал)
Отправлен: 23.02.2005, 17:00
Вопрос № 17395
Здравствуйте уважаемые эксперты.Снова возвращаюсь к вопросу 17363 Пепеписал приложение.
В качестве счетчика цикла исползовал esi.Под отладчиком вроде выполняется. А без отладчика
цикл,не выполняется.В чем дело?Заранее благодарен Юрий.Пример приветствуется.
Приложение:
Отправлен: 23.02.2005, 21:48
Вопрос задал: ua4aqc (статус: Посетитель)
Всего ответов отправлено: 3
Отвечает: John Freeman
Здравствуйте, ua4aqc! С esi то же самое - юзай просто переменную в памяти! ... вот уж неправда, esi не меняется. Просто дело в INT 3, которого в реальной программе быть не должно. Bob Johnson
Ответ отправил: John Freeman (статус: Специалист)
Отправлен: 23.02.2005, 22:45
Отвечает: Стас
Здравствуйте, ua4aqc!
Все работает, только вот INT3 убери - когда есть дебаггер в памяти управление передается ему, а когда его нет - сбой.
и метки нормально назови, просто чтонибудь вроде LOC1 и LOC2.
Ответ отправил: Стас (статус: Практикант)
Отправлен: 23.02.2005, 23:19
Отвечает: Undertaker
Здравствуйте, ua4aqc!
К своему стыду вынужден признать, что своим поспешным ответом на вопрос 17393 Вас дезинформировал. Примите мои извинения.
Приложение:
Ответ отправил: Undertaker (статус: 4-ый класс)
Отправлен: 24.02.2005, 15:20