Вопрос по синтаксису MASM611

Тема в разделе "WASM.BEGINNERS", создана пользователем kostyas311, 19 сен 2011.

  1. kostyas311

    kostyas311 New Member

    Публикаций:
    0
    Регистрация:
    19 сен 2011
    Сообщения:
    4
    Только начал изучать программирование на асме, по книге "Ассемблер: это просто" (Калашникова), и столкнулся с некоторыми неясностями в синтаксисе, на которых по моему мнению в это книге не делается большого акцента.
    Прошу вас, разъяснить мне эти тонкости более подробно и доходчиво.
    Проблема такая: (в книге приведен код):
    Код (Text):
    1. mov ax, 0B900h
    2. mov es, ax
    3. mov di, 0
    4. ...
    5. mov es:[di],ax
    Автор пишет что [] указывает что значение загружается по адресу, который содержится в di. Вопрос1: почему тогда не указываются [] скобки таким образом: [es]:[di]? или это вызвано
    Код (Text):
    1. mov ax, 0B900h
    2. mov es, ax
    ? (промежуточный регистр), а при mov di,0 промежуточный регистр не использовался.
    Можно ли тогда написать вместо этого так: mov es, [0B900h] ?
    Ведь в тоже время регистры cs:ip указываются без []
    В одном источнике нашел запись такого вида: mov [es:di], ax (на мой взгляд полное соответствие словам автора), но увы.
    Меня вводит это в заблуждение, разъясните пожалуйста
     
  2. Z3N

    Z3N New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2009
    Сообщения:
    812
    kostyas311
    es это сегмент. Насколько я понимаю это дос. Я в нём не силён, но помню, что доступ к памяти там через сегменты.

    Значения в сегменты загружаются специальными командами насколько я помню.

    Возможно, то, что написано здесь прояснит немного ситуацию для вас
    http://docstore.mik.ua/bcpp/r77_1.htm
     
  3. kostyas311

    kostyas311 New Member

    Публикаций:
    0
    Регистрация:
    19 сен 2011
    Сообщения:
    4
    С кодировкой проблемы
     
  4. Z3N

    Z3N New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2009
    Сообщения:
    812
    kostyas311
    Если у тебя ие, то Страница -> Кодировка ==> выбери KOI8-R или автовыбор.
     
  5. kostyas311

    kostyas311 New Member

    Публикаций:
    0
    Регистрация:
    19 сен 2011
    Сообщения:
    4
    вроде все ясно, но вопрос в другом,
    ведь в di будет 0. Почему тогда так и не написать что "mov es:di, ax" ?
    или "mov [es]:[di], ax".
    впрочем, работаю пока без отладчика, просто читаю, ибо нет возможности пока. Но это что особенность такая? подругому не сработает?
     
  6. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.624
    Адрес:
    Russia
    kostyas311

    суть нотации mov приёмник, источник

    если приемник не имя регистра то это адрес
    если приёмник сегментный регистр то источник только другой регистр (грузить в сегментные регистры непосредственные значения запрещено)

    если приёмник адрес то его указать можно двояко - непосредствено ds:[0123] или через регистр ds:[di]
    в масме метка соответствует числу в скобках то есть можно писать mov ds:label,ax вместо mov ds:[0123],ax

    ds: - это префикс и заключать его в скобки нет необходимости - роль скобок играет двоеточие, хотя можете написать и [es:di] суть не измениться

    различие между mov di,ax и mov [di],ax - фундаментально - первая инструкция пишет в регистр, а вторая в память
     
  7. Z3N

    Z3N New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2009
    Сообщения:
    812
    kostyas311
    Скорее всего, чтобы всё было однообразно.

    Ведь вот это
    и это
    Валидные инструкции.

    выбивается из общего ряда.
     
  8. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.624
    Адрес:
    Russia
    Z3N
    Код (Text):
    1. mov es:di, ax
    и это тоже валидная инструкция - только инструкции делятся на те что чувствуют префиксы и на те что нет
     
  9. Z3N

    Z3N New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2009
    Сообщения:
    812
    Rockphorr
    Вам виднее, я уже забыл когда масмом пользовался
     
  10. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.880
    kostyas311
    mov [es:di],ax -- это синтаксис ассемблера tasm в режиме ideal или для ассемблера fasm, а для masm такая инструкция невалидная, должно быть только mov es:[di],ax, если учесть, что di=0 можно написать mov es:[0],ax но далее по тексту программы значение в регистре di скорее всего изменяется, поэтому написано mov es:[di],ax и у тебя ошибка -- скорее всего mov ax, 0B800h
    mov es, ax, где 0B800h -- это начало текстового видеобуфера, к сожалению написать сразу mov 0B800h:0,ax ни masm, ни tasm, ни fasm не позволят
    Z3N
    mov di,ax (код 8BF8) и mov [di],ax (8905) -- это совершенно разные инструкции, первая запись в регистр и ей префиксы ни к чему, вторая -- запись в память, по умолчанию сегментный регистр DS, либо сегмент определяется префиксом
     
  11. kostyas311

    kostyas311 New Member

    Публикаций:
    0
    Регистрация:
    19 сен 2011
    Сообщения:
    4
    Большое всем спасибо за ответы, теперь стало понятно что к чему:)
     
  12. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.624
    Адрес:
    Russia
    Z3N ды нет, точно помню что работала на 611 с включенной директивой совместимости
     
  13. Z3N

    Z3N New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2009
    Сообщения:
    812
    Mikl___
    Я не писал, что они делают одно и тоже. Хотел сказать, что оба они что-то делают.
     
  14. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.880
    Z3N
    не хотел обидеть, извини...
     
  15. Z3N

    Z3N New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2009
    Сообщения:
    812
    Mikl___
    Да, нечего, было время, когда я действительно путался с записью в регистр и в память.