Память

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

  1. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    з.ы. не надо мне приводить примеры, что masm и tasm разберутся. это и так ясно, но код приведен с учетом сказанного в #56,#57 и #58 постах. пусть попробует разобраться в этом
    Код (Text):
    1. .386
    2. .model small, stdcall
    3. offset_0 equ 0
    4. offset_1 equ 1
    5. .code
    6. main:
    7.  mov ax, @data
    8.  mov ds, ax
    9.  mov al, offset_0
    10.  ret
    11. .data
    12. ;offset 0
    13.             db 5
    14. ;offset 1
    15. end main
     
  2. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.622
    Адрес:
    Russia
    max7C4
    в таких случаях - конечно, и в масме нужны квадратные скобки
    мне кажется логичным решение масма о том, что когда имя определено с помощью BYTE, WORD DWORD ... для загрузки значения по адресу соответствующему имени скобок ставить необязательно
     
  3. hack_virii

    hack_virii New Member

    Публикаций:
    0
    Регистрация:
    7 июн 2009
    Сообщения:
    71
    max7C4, уважаемый, а в чем смысл?:
    Дос-приложение. AL = 0. Одна не инициализированная переменная (может не так выразился, ну, выделенный байт (5h) в секции данных). А к чему эти комменты в секции данных? И зачем offset_1, равный 1, если он не используется в Вашем примере? Или я чего-то не понял и это просто пример?)
     
  4. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.622
    Адрес:
    Russia
    hack_virii
    смысл в разнице между

    Код (Text):
    1. some = 2
    2. mov ax,some
    3. mov ax,[some]
    и
    Код (Text):
    1. some byte 2
    2. mov ax,some
    3. mov ax,[some]
    (укажите все эквивалентные мувы)
     
  5. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.622
    Адрес:
    Russia
    * пардон не byte а word
    а то word ptr спутает все карты
     
  6. hack_virii

    hack_virii New Member

    Публикаций:
    0
    Регистрация:
    7 июн 2009
    Сообщения:
    71
    Rockphorr, мм.. т.о. если
    , то ошибки не возникнет. Если some byte, то надо использовать или word PTR, или mozx, правильно?
    А когда мы присваиваем значение по средствам директивы equ или =, то переменная(константа) имеет какой размер?
    Т.е.
    Ошибки не вызовет? Мы также можем сделать mov al и mov eax?
     
  7. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.622
    Адрес:
    Russia
    hack_virii
    смысл в разнице между

    Код (Text):
    1. some = 2
    2. mov ax,some
    3. mov ax,[some]
    и
    Код (Text):
    1. some word 2
    2. mov ax,some
    3. mov ax,[some]
    (укажите все эквивалентные мувы из этих четырех!!!!)

    не в ту степь
     
  8. hack_virii

    hack_virii New Member

    Публикаций:
    0
    Регистрация:
    7 июн 2009
    Сообщения:
    71
    Блин.) Надо бросать все вредные привычки, совсем отупел..\
    Все равно не понял.(
    Товарищ Rockphorr, если не сложно, поясните пожалуйста. И не могли бы ответить на мой пост #66? ()=о)

    С уважением.
     
  9. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    hack_virii
    Нет. Тот пример, который вы рассматриваете направлен на то, чтобы продемонстрировать тот факт, что адрес переменной и число (смещение относительно начала чего-либо) - одно и то же. И что не всегда хорошо, что компилятор (имеется ввиду стиль оформления masm или tasm) позволяет об этом забыть. А на уровне машинных кодов, что mov ax, some, что mov ax, offset_0 даст одно и тоже A1, 00, 00. Но спор начался из-за того, что в системе команд x86 нет возможности такой адресации к памяти (точнее есть только для одного регистра аккумулятора), во для всех других случаев будет
    Код (Text):
    1. 8B 06 0000
    2. ^^ ^^ ^^^^
    3. || || ||||
    4. || || ++++->offset=0
    5. || ++-> mod-reg-mem (mod:0; reg:0=ax; mem:offset)
    6. ++-> cmd:mov hreg,hreg/hmem
     
  10. hack_virii

    hack_virii New Member

    Публикаций:
    0
    Регистрация:
    7 июн 2009
    Сообщения:
    71
    max7C4, ууу... совсем я
    !%)
    Сорри. Мне до таких заморочек еще далеко..(мое почтение)
    Ну а что касаемо моего, 'детского' вопроса? Он настолько примитивен, что нет желающих отвечать?)
    Ну тогда во избежание гнева товарища Clerk'а не буду настаивать на ответе..;)р

    Спасибо, что объяснили.
     
  11. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    hack_virii
    Вы спрашиваете как раз про, то с чем я не согласен (касаемо синтаксисов). Дело в том, что компиляторы ассоциируют с именем (читай меткой) переменной ее "тип" (читай размер). В первом случае компилятор будет автоматически следить за размерами операндов. Во втором же случае у него это не получится по той причине, что у одного из операндов не будет явно указанного типа и он возьмет за константу размер известного операнда (регистра). Вообще в машинном представление размеры не контролируются на уровне команд. Т.е. можно спокойно написать
    Код (Text):
    1. mov al, [0xFFFF]
    2. mov ax, [0xFFFF]
    3. mov eax, [0xFFFF]
    и все это будет сгенерировано соответственно в
    Код (Text):
    1. A0 FFFF
    2. A1 FFFF
    3. 66 A1 FFFF
    как видите все коды существуют, и их даже попробуют выполнить, но кое-какие коды дадут в данном случае ошибку. Но эта ошибка будет определена только на стадии выполнения именно этих команд. В 16-битном режиме последние 2 команды дадут явную ошибку т.к. операнд вылазит за границы относительной области (сегмента). Компилятор же этого даже не заметит (хотя не берусь предсказать поведение совсем новых версий), даже если явно объявить константы.
    Код (Text):
    1. .data
    2. align 0FFFFh
    3. byte_FFFF label byte
    4. word_FFFF label word
    5. dword_FFFF label dword
    6. db 5
    7. .code
    8. mov al, byte_FFFF
    9. mov ax, word_FFFF
    10. mov eax, dword_FFFF
     
  12. hack_virii

    hack_virii New Member

    Публикаций:
    0
    Регистрация:
    7 июн 2009
    Сообщения:
    71
    Ясно. Кажется. Ну, по-моему, одно из первых правил ассемблера - это внимательно следить за размерами операндов и не расходовать понапрасну драгоценную память (у кого-то я это читал). Главное впредь самому не ошибаться, чтобы не противоречить собственным постам..:)
    К тому же, у меня masm615 и он довольно капризен к размерам операндов. Т.е. если где-то допущена ошибка на несоответствие размеров, exe'шку мне не получить.)

    max7C4, спасибо за ответ.