Я конечно извеняюсь... НО как на тасме записать следующие: Код (Text): lea ax,[sp+4] mov [ax],cx ? тасм пишет на обе инструкции : Illegal indexing mode.
Так не меняй. Код (Text): .386 .model flat, stdcall option casemap: none include \masm32\include\windows.inc include \masm32\include\kernel32.inc includelib \masm32\lib\kernel32.lib ;---------------------------------------------- .code start: lea ax,[esp+4] mov [eax],cx invoke ExitProcess, 0 ;---------------------------------------------- end start Вообще в чем задача?
XshStasX Дык вот Код (Text): ; fasm example of writing 16-bit COM program org 100h ; code starts at offset 100h use16 ; use 16-bit code display_text = 9 lea ax,[esp+4] mov [eax],cx mov ah,display_text mov dx,hello int 21h int 20h hello db 'Hello world!',24h Или Е - как знак зверя )
_sheva740 вот прикольно. lea ax, [esp+4];в старшей части eax - мусор т.к. старшая часть esp не определена mov [eax], cx;запишет хрен знает куда т.к. sp и esp адресуются относительно ss, а eax относительно ds и в старшей части eax мусор правильнее изменить регистр на bp Код (Text): push bp mov bp, sp mov [bp+6], cx pop bp
newbie и зачем играть в DukeNukem 3D? Doom3 и Сталкера не хватает? P.S. В 2 последние не играл извините, если сравниваю не правильно, но они вроде бы все шутеры.
а по теме, там наверняка дело в выбранном процессоре. в 16-битном тасме, насколько я помню по дефолту стоит 8086 и для индексирования в нём не все регистры можно было использовать. si и di - точно можно, наверное также sp и bp. а можно поставить в начале кодеса .286 или .386 и использовать любые.
В общем наткнулся на забавное шаманство с регистрами Такой код работает отлично: Код (Text): mov cx,ax mov ax,WORD PTR STACK_[bp].cur add ax,2 mov WORD PTR ds:STACK_[bp].cur,ax mov ax,cx Но стоит его заменить на : Код (Text): add WORD PTR ds:STACK_[bp].cur,2 Получаем "процесор NTVDM выполнил недопустимую инструкцию". А вот такой код: Код (Text): add WORD PTR ds:STACK_[bp].cur,-2 работает... В чем может быть проблема? ведь запись в итоге идет по одному и томуже адрессу. Регистры сегментов в порядке. Причем сообщение появляется только после Код (Text): MOV Ax,4C00H INT 21H
Надо писать проще. Без выкидонов. Это что имеется в виду: Word ptr ds:STACK_[bp].cur? Даже не так - что имелось в виду когда писалось STACK_[bp].cur? лично я НЕ понимаю такое без залезания в мануалы И у меня сомнения насчет тасма - он точно вот это воспринимает так, как вы хотели? А по поводу ошибки только 2 варианта: 1) у вас рвется инструкция. То, во что компилируется, оказывается в принципе неверным. Поэтому +2 и -2 на самом деле при выполнении оказываются не операндами той команды, какую вы хотели, а кодом другой команды. И то, что происходит потом, чисто случайно в случае FE (то есть -2) завершается нормально. А в случае 02 - окончательно сбивается и находит где-то недопустимую инструкцию. 2) слово STACK наводит на мысли, что переменная где-то в стеке. Если вы увеличиваете что-то в стеке на 2, то... если ЭТО оказывается не вашей переменной, а адресом возврата, то ... дальнейшее выполнение программы может стать совершенно непредсказуемым. Вообще, если уменьшаете, то же. Но вот так вот байты легли. Набей nop'ов между командами. Если не хочешь в отладчике посмотреть, пошагово (что должно было быть первым действием, до вопроса на форумах) - добавь в код по 3 раза nop между всеми командами ) тогда практически любой разрыв инструкций восстановится на однобайтовых командах к нормальному. Ну как "нормальному"... к более предсказуемому. Зы: и да, сегмент DS доступен на запись, и сегментный регистр доступен на запись.
XshStasX Эта команда выполняет следующее ax=ss:STACK_[bp].cur Эта команда выполняет следующее ds:STACK_[bp].cur=ax вы уверены, что аналогично предыдущему коду PS: Экзешник + исходник в студию