tasm

Тема в разделе "WASM.BEGINNERS", создана пользователем XshStasX, 18 дек 2010.

  1. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    Я конечно извеняюсь...
    НО как на тасме записать следующие:
    Код (Text):
    1. lea ax,[sp+4]
    2. mov [ax],cx
    ?
    тасм пишет на обе инструкции :
    Illegal indexing mode.
     
  2. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    XshStasX
    Может так
    Код (Text):
    1. LEA AX,WORD PTR SS:[ESP+4]
    2. MOV WORD PTR DS:[EAX],CX
     
  3. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    _sheva740
    Аналогичная ошибка,
    только регистры ЕАХ,ЕSP сменил на ах,sp.
     
  4. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    Так не меняй.
    Код (Text):
    1. .386
    2. .model flat, stdcall
    3. option casemap: none
    4.    include \masm32\include\windows.inc
    5.    include \masm32\include\kernel32.inc
    6.    includelib \masm32\lib\kernel32.lib
    7. ;----------------------------------------------
    8. .code
    9. start:
    10.     lea ax,[esp+4]
    11.     mov [eax],cx
    12.     invoke  ExitProcess, 0
    13. ;----------------------------------------------
    14. end start
    Вообще в чем задача?
     
  5. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    _sheva740
    приложение 16 битное.
    по этому регистры без Е
     
  6. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    XshStasX
    Дык вот
    Код (Text):
    1. ; fasm example of writing 16-bit COM program
    2.  
    3.     org 100h            ; code starts at offset 100h
    4.     use16               ; use 16-bit code
    5.  
    6. display_text = 9
    7.  
    8.     lea ax,[esp+4]
    9.     mov [eax],cx
    10.  
    11.  
    12.     mov ah,display_text
    13.     mov dx,hello
    14.     int 21h
    15.  
    16.     int 20h
    17.  
    18. hello db 'Hello world!',24h
    Или Е - как знак зверя )
     
  7. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    не знал что в 16битной программе доступны регистры
    esp,eax . . .
    поставил esp,eax - все ок ).
     
  8. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    XshStasX
    так в Win32 ah, al и т.д. наряду с eax и т.д. тоже доступны.
     
  9. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    _sheva740
    вот прикольно.
    lea ax, [esp+4];в старшей части eax - мусор т.к. старшая часть esp не определена
    mov [eax], cx;запишет хрен знает куда т.к. sp и esp адресуются относительно ss, а eax относительно ds и в старшей части eax мусор
    правильнее изменить регистр на bp
    Код (Text):
    1. push bp
    2. mov bp, sp
    3. mov [bp+6], cx
    4. pop bp
     
  10. newbie

    newbie New Member

    Публикаций:
    0
    Регистрация:
    2 дек 2008
    Сообщения:
    1.246
    на кой хрен юзать мёртвый тасм? масма или фасма не хватает?
     
  11. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    newbie
    и зачем играть в DukeNukem 3D? Doom3 и Сталкера не хватает?
    P.S. В 2 последние не играл извините, если сравниваю не правильно, но они вроде бы все шутеры.
     
  12. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    max7C4
    Это да.
    Но кто знает что ему надо, может жесткий
    антиэмуль пишет?
     
  13. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    COD4->Крушение->Саботаж->АК-47 + Barretta за плечем если что
    вот чего не хватает!
    :)))
     
  14. newbie

    newbie New Member

    Публикаций:
    0
    Регистрация:
    2 дек 2008
    Сообщения:
    1.246
    Как будто кто то в него играет. Давно забыли и выкинули. Очнись
     
  15. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    newbie
    за себя говорите. GTA и DN еще как живы!!!
     
  16. krabz

    krabz New Member

    Публикаций:
    0
    Регистрация:
    26 май 2010
    Сообщения:
    135
    а по теме, там наверняка дело в выбранном процессоре.
    в 16-битном тасме, насколько я помню по дефолту стоит 8086 и для индексирования в нём не все регистры можно было использовать. si и di - точно можно, наверное также sp и bp.

    а можно поставить в начале кодеса .286 или .386 и использовать любые.
     
  17. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    В общем наткнулся на забавное шаманство с регистрами
    Такой код работает отлично:
    Код (Text):
    1.     mov cx,ax    
    2.     mov ax,WORD PTR STACK_[bp].cur
    3.     add ax,2
    4.     mov WORD PTR ds:STACK_[bp].cur,ax
    5.     mov ax,cx
    Но стоит его заменить на :
    Код (Text):
    1. add WORD PTR ds:STACK_[bp].cur,2
    Получаем "процесор NTVDM выполнил недопустимую инструкцию".
    А вот такой код:
    Код (Text):
    1. add WORD PTR ds:STACK_[bp].cur,-2
    работает...
    В чем может быть проблема? ведь запись в итоге идет по одному и томуже адрессу.
    Регистры сегментов в порядке.

    Причем сообщение появляется только после
    Код (Text):
    1.    MOV Ax,4C00H
    2.    INT 21H
     
  18. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    Сегмент ds доступен на запись ?
     
  19. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    Надо писать проще. Без выкидонов. Это что имеется в виду: Word ptr ds:STACK_[bp].cur? Даже не так - что имелось в виду когда писалось STACK_[bp].cur? лично я НЕ понимаю такое без залезания в мануалы :)
    И у меня сомнения насчет тасма - он точно вот это воспринимает так, как вы хотели?

    А по поводу ошибки только 2 варианта:
    1) у вас рвется инструкция. То, во что компилируется, оказывается в принципе неверным. Поэтому +2 и -2 на самом деле при выполнении оказываются не операндами той команды, какую вы хотели, а кодом другой команды. И то, что происходит потом, чисто случайно в случае FE (то есть -2) завершается нормально. А в случае 02 - окончательно сбивается и находит где-то недопустимую инструкцию.
    2) слово STACK наводит на мысли, что переменная где-то в стеке. Если вы увеличиваете что-то в стеке на 2, то... если ЭТО оказывается не вашей переменной, а адресом возврата, то ... дальнейшее выполнение программы может стать совершенно непредсказуемым. Вообще, если уменьшаете, то же. Но вот так вот байты легли.

    Набей nop'ов между командами. Если не хочешь в отладчике посмотреть, пошагово (что должно было быть первым действием, до вопроса на форумах) - добавь в код по 3 раза nop между всеми командами :)) тогда практически любой разрыв инструкций восстановится на однобайтовых командах к нормальному. Ну как "нормальному"... к более предсказуемому.

    Зы: и да, сегмент DS доступен на запись, и сегментный регистр доступен на запись.
     
  20. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    XshStasX
    Эта команда выполняет следующее ax=ss:STACK_[bp].cur
    Эта команда выполняет следующее ds:STACK_[bp].cur=ax
    вы уверены, что
    аналогично предыдущему коду
    PS: Экзешник + исходник в студию