О размерности операндов

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

  1. Guru_of_Zen

    Guru_of_Zen Member

    Публикаций:
    0
    Регистрация:
    21 янв 2010
    Сообщения:
    288
    Например имеем такой код:

    Код (Text):
    1.       .DATA
    2.  
    3. BYTE_0  DB    25H
    4.  
    5. ... ... ...
    6.  
    7.       .CODE
    8.  
    9. MOV AX, @data
    10. MOV DS, AX
    11.  
    12. ... ... ...
    13.  
    14. A1:
    15.  
    16. XOR AX, AX
    17. MOV AX, 25H            ; допустимая операция
    18.  
    19.  
    20. A2:
    21.  
    22. XOR AX, AX
    23. MOV AX, BYTE_0    ;      ???
    24.  
    25. A3:
    26.  
    27. XOR AX, AX
    28. MOV BX, OFFSET BYTE_0
    29. MOV AX, [BX]          ;     ???
    30.  
    31.  
    32. A4:
    33.  
    34. MOV AX, 534H          ;
    35. MOV BYTE_0, AX       ; недопустимая операция
    36. MOV [BX], AX           ; недопустимая операция
    37.  
    38. ... ... ...
    Понятно, что если операнд непосредственный (A1:), то ассемблер дополнит 25Н до 0025Н и поместит 00H в АН, а 25H в AL. Итого AX = 0025H.

    Но интересно как дело обстоит в случае с прямым обращением к памяти (А2:) и в случае с непрямым обращением к памяти (А3:) ? Тоже дополнится нулями до требуемой приемником размерности или же подобные операции недопустимы (как например А4:) ?

    Иными словами, вопрос можно сформулировать иначе:

    что происходит, если размерность операнда-источника меньше, чем операнда-приемника (при любой адресации) ?
     
  2. qwe8013

    qwe8013 New Member

    Публикаций:
    0
    Регистрация:
    28 май 2009
    Сообщения:
    198
    недопустимая операция за исключением movzx например.
     
  3. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    Guru_of_Zen
    Это ты асм с си перепутал :)
    В асме не бывает разных размеров операндов, кроме как если задано явно (MOVSX, например).
     
  4. PowerASM

    PowerASM New Member

    Публикаций:
    0
    Регистрация:
    27 мар 2010
    Сообщения:
    59
    Guru_of_Zen
    A2: Асм скажет, что размеры не допустимы
    A3: Асм ничего не скажет, а в AX будет помещены два подряд идущих байта из ячеек памяти адресуемых bx (иными словами эта команда полностью выглядит так mov ax, word [bx] и не важно, что mov bx, offset byte_0, да хоть qword)
    A4: что касается 3 команды (mov [bx], ax), то это допустимая операция и содержимое ah будет автоматически записано по адресу bx+1 и не важно, что это byte_0

    запомните: в ассемблере только вы определяете, что делает программа. компилятору должно быть максимально побоку (масм с этим не согласится и по этой причине начинать лучше с него, а когда надоест писать offset'ы переходите на что-нибудь еще. например fasm или nasm, хотя первое я (лично я) предпочитаю больше чем второе)
     
  5. Guru_of_Zen

    Guru_of_Zen Member

    Публикаций:
    0
    Регистрация:
    21 янв 2010
    Сообщения:
    288
    Всем большое спасибо.
    Но PowerASM'y спасибо побольше :)
     
  6. Guru_of_Zen

    Guru_of_Zen Member

    Публикаций:
    0
    Регистрация:
    21 янв 2010
    Сообщения:
    288
    PowerASM
    Это понятно; просто для себя хотел уточнить все возможные можно/нельзя; в действительности же я допустим даже MOV AX, 25H писать не стану. Только MOV AX, 0025H :) Как бы для наглядности, чтоб видеть чем оперируешь.
     
  7. Phuntik

    Phuntik New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2008
    Сообщения:
    318
    Guru_of_Zen
    Ну, это ненадолго, скорее всего. Потом 00 станут ненужными.
     
  8. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.890
    Guru_of_Zen
    я же вам говорил, рановато вы этот ник выбрали, MOV AX, 0025H это не дзенно, дзенно писать
    MOV AX,100101B, а нормальные пацаны, те вообще пишут MOV AX,37 При программировании на ассемблере "если шестнадцатеричное число начинается с буквы, перед ним обязательно должен ставится ноль. Иначе компилятор решит, что вы имели в виду переменную Ch, а не число 12". Ряд людей с низким уровнем интеллекта, не способным запомнить это правило, ставят ноль впереди всех шестнадцатеричных чисел. Хуже всего, когда такие люди начинают писать учебники...
     
  9. PowerASM

    PowerASM New Member

    Публикаций:
    0
    Регистрация:
    27 мар 2010
    Сообщения:
    59
    Mikl___
    извините - регистр
     
  10. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.890
    PowerASM
    имелось в виду именно число 0Ch=0xC=12 а не регистр CH :)
     
  11. PowerASM

    PowerASM New Member

    Публикаций:
    0
    Регистрация:
    27 мар 2010
    Сообщения:
    59
    Mikl___
    Я понял, просто вы его назвали переменной, хотя какая разница. Регитры теже переменные.
     
  12. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.890
    PowerASM
    Пусть фраза будет такой "Иначе компилятор решит, что вы имели в виду переменную Eh, а не число 14" согласен, получилась двусмысленность с названием регистра, совсем недавно узнал: чтобы не было двусмысленностей при использовании инструкции .radix 16 для чисел подобных 10B и 10D (то ли 2, то ли 267 в первом случае, и то ли 10, то ли 269 - во втором) в masm были введены суффиксы T (=D) и Y (=B)
     
  13. Guru_of_Zen

    Guru_of_Zen Member

    Публикаций:
    0
    Регистрация:
    21 янв 2010
    Сообщения:
    288
    Mikl___
    Вы наверное в большом опыте, учились по таким или откуда ? Мож сами писали ? ;)

    Критиковать - оно легко, конечно; а сами не смогли 1-го предложения связать четко, без путаницы - зачем критиковать людей и учебники тогда ?
     
  14. VaZoNeZ

    VaZoNeZ New Member

    Публикаций:
    0
    Регистрация:
    12 июл 2009
    Сообщения:
    121
    Я с вами не согласен. Я так делаю. И не из-за того, что "так книжка пишет", а потому-что лично мне в такой записи код читабельнее.
     
  15. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.625
    Адрес:
    Russia
    Guru_of_Zen
    читайте Пильщикова МИФИ
    к вашему вопросу - например существуют 2 инструкции
    mov [BX],0
    одна посылает ноль как байт другая как слово
    для того чтоб однозначно указать на размер используются конструкции PTR
    какая из них подразумевается по умолчанию читайте в документации компилятора