Вопросец начинающего ;)

Тема в разделе "WASM.BEGINNERS", создана пользователем Scr1pt_, 15 мар 2007.

  1. Scr1pt_

    Scr1pt_ New Member

    Публикаций:
    0
    Регистрация:
    14 мар 2007
    Сообщения:
    34
    При попытке записи в регистр ah двоичного числа 11111111b, всё проходит нормально:
    Код (Text):
    1. mov ah, 11111111b
    Но почему тогда при попытке записи в этот же регистр этого же числа, только в шестнадцатиричной форме:
    Код (Text):
    1. mov ah, FFh
    Транслятор выводит ошибку??
    Код (Text):
    1.       7 0000  8A 26 0000                      mov ah, FFh
    2. **Error** 1.ASM(7) Undefined symbol: FFH
    Транслятор: Turbo Assembler Version 4.1 Copyright (c) 1988, 1996 Borland International

    Объясните, пожалуйста. И не пинайте сразу я только начинаю.
     
  2. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    Если число начинается с буквы, в начале должен идти 0! Пиши mov ah,0FFh
     
  3. Scr1pt_

    Scr1pt_ New Member

    Публикаций:
    0
    Регистрация:
    14 мар 2007
    Сообщения:
    34
    Сенкс! Всё понял. Я дурак. :)

    Тут ещё один вопрос хочется спросить: можно ли просто так писать в extended регистры, т.е. eax/ebx/ecx/edx...

    У меня так почему-то не получается:

    Код (Text):
    1.       7 0000  C7 06 0000 FFFF                 mov eax, 0FFFFh
    2. **Error** 1.ASM(7) Undefined symbol: EAX
    Может я что-то делаю не так и здесь какой-нибудь фокус нужен? Как вообще можно что-либо записать в старшие 16 бит вышеназванных регистров?
     
  4. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    Можно, но, видимо, ты используешь досовский тасм. В досе только 16-битные регистры. Скачай Tasm32, а еще лучше - Masm32.
     
  5. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    А этот твой турбо ассемблер точно поддерживает 32-х разрядные регистры?
     
  6. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Scr1pt_
    возможно просто не хватает директивы .386
    а если дело все таки в ооочень старом асме, то
    Код (Text):
    1. db 66h
    2. mov ax, 5678h
    3. dw 1234h
    4. ; это mov eax, 12345678h
    5.  
    6. ; или
    7. db 67h
    8. mov [ax], 25
    9. dw 0
    10. ; это mov [eax], 25
    11.  
    12. ; или
    13. dw 6667h
    14. mov [ax], bx
    15. ; это mov [eax], ebx
     
  7. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    Y_Mur, ну так только поли(мета)морфики писать :) Хотя вариант очень даже интересный
     
  8. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    Еще вариант, если в начале файла стоит .286 или ничего не указано (команды 8086), то перед 32-разрядной инструкцией ставится .386, а после нее .286
    Код (Text):
    1.  .286
    2. .model tiny
    3. .....
    4. .386
    5. movsd
    6. .286
     
  9. Scr1pt_

    Scr1pt_ New Member

    Публикаций:
    0
    Регистрация:
    14 мар 2007
    Сообщения:
    34
    2 Mikl__ : Спасибо, с .386 всё заработало.

    2 MSoft : Скачал tasm32 5.0 http://wasm.ru/tools/7/tasm5plus.zip, но он проблему не решает!

    2 Y_Mur : Попробовал твой код, вроде работает. Но я всё равно не могу объяснить как. Можешь написать небольшие комментарии к коду, если не трудно?
     
  10. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    Scr1pt_
    Лучше поставь masm или fasm
     
  11. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Scr1pt_
    А загляни в листинге или дизассемблере - чем отличается под ДОС c директивой .386
    mov ax, ... и mov eax, .... :)))
    Я просто вручную дописал недостающие кусочки кода :))
    66h - префикс 32 битных данных
    67h - ... адреса
    только под windoй смысл у этих префиксов обратный ;)
    Когда то ооочень давно на асм вставках в TP6 это сильно выручало :))
     
  12. Scr1pt_

    Scr1pt_ New Member

    Публикаций:
    0
    Регистрация:
    14 мар 2007
    Сообщения:
    34
    Листинг:
    Код (Text):
    1.      10     0009  66| B8 0000FFFF                mov eax, 0ffffh
    А что в листинге обозначает прямая вертикальная черта после 66, никто не подскажет? Отделение префикса от самой команды?

    И что значит в этом коде:

    Код (Text):
    1. db 67h
    2. mov [ax], 25
    3. dw 0
    4. ; это mov [eax], 25
    регистр, взятый в квадратные скобки?

    Мой тасм подобного не поддерживает...

    Код (Text):
    1.      11     0007  C7 0019                        mov [ax], 25
    2. *Warning* 1.ASM(11) Argument needs type override
    3. **Error** 1.ASM(11) Illegal indexing mode
     
  13. Scr1pt_

    Scr1pt_ New Member

    Публикаций:
    0
    Регистрация:
    14 мар 2007
    Сообщения:
    34
    Извините, я ошибся. Просто думал, что если компилятор 32-х разрядный, то при использовании 32-х разрядных регистров не надо впереди ставить директиву .386. Ошибся.

    Тогда чем вообще отличаются 32-х и 16-ти разрядные компиляторы?
     
  14. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    .386 Указывает для какого процессора компилишь, он как известно 32 разрядный, а .286 16 разрядный.

    На 286 32 разрядные регистры не прокатят.
    А если директивы нет, вроде вообще под 8086 компилит.
     
  15. Scr1pt_

    Scr1pt_ New Member

    Публикаций:
    0
    Регистрация:
    14 мар 2007
    Сообщения:
    34
    Ну это понятно. Но всё же вопрос немного по-другому стоит...
     
  16. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Scr1pt_
    А мне кажется что ответ на этот вопрос очевиден, 16-ти не умеет компилить для 32 разряд процов, соответственно .386 не поймёт -).
     
  17. Scr1pt_

    Scr1pt_ New Member

    Публикаций:
    0
    Регистрация:
    14 мар 2007
    Сообщения:
    34
    Мой tasm 5.0 16-разряден. И он отлично понимает .386.

    Или я ошибаюсь?
     
  18. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    С чего ты это взял. Он вполне 32 разряден, и даже умеет компилить под win 95, которая тоже 32 разрядная.
    Я же сказал что по дефолту он компилит под 8086. (16 разрядов).
     
  19. Scr1pt_

    Scr1pt_ New Member

    Публикаций:
    0
    Регистрация:
    14 мар 2007
    Сообщения:
    34
    Блин, я вообще запутался.
    В чём различие между tasm и tasm32, если оба они могут компилить и под 32, и соответственно и 16 разрядов?
     
  20. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Да ё моё. tasm 5.0 - Я имею ввиду пакет, в котом есть и tasm и tasm32. У тебя что tasm понимает 32 разрядные инструкции?