![]() |
eXeL@B —› Вопросы новичков —› Помогите найти ошибку!!! |
Посл.ответ | Сообщение |
|
Создано: 28 мая 2007 20:02 · Личное сообщение · #1 Доброго дня. Заинтересовал ассемблер, взял статью с www.wasm.ru/print.php?article=1022001, все получаестя(потихоньку въезжаю), но когда че то не получается наступает ступор. Проблема в том что когда запускаю файл которы просто рисует точку на экране в графическом режиме под ДОС и ждет нажатия клавиши, у меня почему то начинает мерцать экран(как-будто перелистывается), при этом я вижу эту точку, если нажимаю клавишу то выскакивает с ощибкой "Процессор NTVDM обнаружил недопустимую инструкцию. ........................" Может проблема в том что работаю на ноуте??? как исправить, или что почитать!!! ![]() ![]() |
|
Создано: 29 мая 2007 01:10 · Личное сообщение · #2 |
|
Создано: 29 мая 2007 07:53 · Личное сообщение · #3 |
|
Создано: 29 мая 2007 11:09 · Личное сообщение · #4 |
|
Создано: 29 мая 2007 12:35 · Личное сообщение · #5 |
|
Создано: 30 мая 2007 14:40 · Поправил: Bitfry · Личное сообщение · #6 Abram пишет: смещение 100h, сморю через codeview, показывает 1275:0100 сначало Вот строчка из CV: 0ACD:0119 660F840A01 JE 0228
Обрати внимание на адрес 0228 перехода. Тебе разве туда надо? Так получается из-за того, что ты (или компилятор) неверно сформировал машинную команду для данной команды ассемблера. Разберём по байтам: 66 – префикс размера операнда Когда выполняется код в 16-битном режиме (а com-файлы по определению 16-битные), этот префикс заставляет воспринимать операнды в текущей команде как 32-битные. Если режим 32-бита, то наоборот – операнд становится 16-битный. Пример: Одни и те же байты будут трактоваться по-разному. 16-битный режим дизассемблирования: 00000000: 66B8AAAAAAAA mov eax,0AAAAAAAA
32-битный режим дизассемблирования: 00000000: 66B8AAAA mov ax,0AAAA
Таким образом, в 16-битном режиме для 16-битного операнда, префикс вообще не нужен. Кроме того, в случае с командой je её единственный операнд является адресом, а для адресов существует специальный префикс - префикс размера адреса (67h). Так что 66 здесь не к селу не к городу. Дальше идёт опкод команды - 0F84. Это опкод ближнего перехода. Переходы бывают: короткими (в приделах EIP/IP + длина команды + знаковый байт); ближними (в приделах EIP/IP + длина команды + знаковый WORD/DWORD); дальними (загрузка нового сегмента и значения EIP/IP). В данном случае хватит короткого перехода (74 вместо 0F84). Потом один байт + к EIP. Всё команда закончена! ----- Всем привет, я вернулся ![]() |
|
Создано: 30 мая 2007 15:54 · Поправил: Headerx · Личное сообщение · #7 а в этом коде мне непонятно что делает и для чего предназначены эти инструкции (я их выделил жирным шрифтом) ; ===========[ Program Entry Point ]=========== 00401000 6A00 PUSH 00H ; lpModuleName 00401002 E8 E3020000 CALL KERNEL32!GetModuleHandleA 00401007 A3 4C304000 MOV DWORD PTR DS:[0040304CH], EAX ![]() |
|
Создано: 30 мая 2007 16:11 · Личное сообщение · #8 Headerx, это шутка такая? Или ты не в ту тему попал. Headerx пишет: 00401000 6A00 PUSH 00H ; lpModuleName 00401002 E8 E3020000 CALL KERNEL32!GetModuleHandleA 00401007 A3 4C304000 MOV DWORD PTR DS:[0040304CH], EAX = invoke GetModuleHandle, NULL mov hInstance,eax Headerx пишет: 0040102E C745D0 30000000 MOV DWORD PTR SS:[EBP-30H],00000030H = mov wc.cbSize,SIZEOF WNDCLASSEX ----- Всем привет, я вернулся ![]() |
|
Создано: 30 мая 2007 16:24 · Поправил: Headerx · Личное сообщение · #9 |
|
Создано: 30 мая 2007 17:47 · Поправил: Icelot · Личное сообщение · #10 Эти команды помещают в переменную hInstance (которая по адресу 0040304CH) dword значение - хендл возвращенный в EAX API-функцией GetModuleHandleA: The GetModuleHandle function returns a module handle for the specified module if the file has been mapped into the address space of the calling process. чего тут не ясно может быть еще? ----- radio uno in ibisa ... ![]() |
|
Создано: 30 мая 2007 17:53 · Личное сообщение · #11 |
|
Создано: 30 мая 2007 18:56 · Поправил: Icelot · Личное сообщение · #12 DS:[xxxxxxxx] DS-это сегмент [xxxxxxxx] - это смещение в нём Двоеточие это не оператор, так принято просто указывать адреса. Хотя в PM это уже не имеете прежнего значения. З.Ы. Headerx ты или издеваешься или тебе срочно нужно -> сюда <- http://www.bitfry.narod.ru/ Cегменты и смещения http://bitfry.narod.ru/11.htm#bit11 - поточнее. ----- radio uno in ibisa ... ![]() |
|
Создано: 31 мая 2007 16:53 · Личное сообщение · #13 Icelot пишет: З.Ы. Headerx ты или издеваешься или тебе срочно нужно -> сюда <- может это ты издеваешься, ты чо думаеш что я никогда не открывал учебник по асму? это тебе не html или бэсик которые можно освоить за 3 дня а высшее исскуство. я уже освоил ее на %=25, а остальное освоить будет труднее. но нет ничего невозможного. у любого возникают вопросы. ![]() |
|
Создано: 01 июня 2007 08:33 · Личное сообщение · #14 |
![]() |
eXeL@B —› Вопросы новичков —› Помогите найти ошибку!!! |