Память

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

  1. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.622
    Адрес:
    Russia
    max7C4
    к инструкции lea афаик бессмыслено приписывать word ptr - она не работает с размерами операндов
    а то что отладчики и дизасмы приписывают к ней дефолтный тип это уже их косяк
     
  2. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Да ну :)
    Почему-то в lea eax,[ebx*2+ecx] тебя скобки не смущают, а в lea eax,[var] - смущают.
    Лично я и в MASM/TASM всегда со скобками пишу.
     
  3. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.622
    Адрес:
    Russia
    max7C4
    единственный случай когда надо приписывать sometype ptr это при работе со стуктурами вместе с индексно-базовыми регистрами, но это только если включена проверка типов,используете assume или ставите режим совместимости с 5.1 и никаких проблем
     
  4. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.622
    Адрес:
    Russia
    cppasm
    хороший пример ... :) - я подумаю
     
  5. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    С этого и надо было начинать (в смысле так бы сразу и сказал) :)
    Это не косяк. Они таким образом подчеркивают тип адресации (16-, 32- или 64-).
     
  6. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.622
    Адрес:
    Russia
    cppasm
    мой теорий таков:
    есть mov reg,i - засылка в регистр непосредственного операнда
    есть mov reg,mem - засылка в регистр значения по адресу mem
    есть mov reg1,reg2 засылка значения из reg2 в reg1
    есть mov reg1,[reg2] засылка в reg1 значения лежащего по адресу который лежит в reg2 - здесь квадратные скобки указывают на использование значения регистра как адрес, в расширеном варианте с несколькими регистрами в скобках аналогично
    lea афаик декодируется "адресным" узлом проца
    lea reg,mem - загрузка в reg адреса mem
    lea reg1,[reg2] частный случай lea reg1,arrayitem[reg2] - загрузка в регистр адреса элемента массива с индексом reg2 (в общем случае в скобках может стоять и твоя регистровая формула ebx*2+ecx), а для arrayitem скобки необязательны и случаи [reg+x] вполне можно записывать как x[reg]

    другими словами буквенное обозначение адреса совсем необязательно брать в скобки
     
  7. Microedition

    Microedition Active Member

    Публикаций:
    0
    Регистрация:
    5 июн 2008
    Сообщения:
    814
    Строка "5" и число 5 - вещи разные.

    Если вы выполнить такой код:
    Код (Text):
    1. ;; секция данных
    2. mes dd "5"  ;; строка
    3.  
    4. ...
    5.  
    6. ;; секция кода
    7. mov    eax, dword ptr[mes]  ;; EAX = 0x00000035
    То в EAX (при условии, что строка "5" закодирована в ASCII) будет число 35h.

    Чтобы загрузить в EAX число 5 из памяти, надо сделать так:
    Код (Text):
    1. ;; секция данных
    2. mes dd 5
    3.  
    4. ...
    5.  
    6. ;; секция кода
    7. mov    eax, dword ptr[mes] ;; EAX = 0x00000005
    P.S.:
    "-ться" пишется в инфинитивах.
    Раздражает уже.
     
  8. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Очень единообразно :)
    Для единообразия - при доступе к памяти надо ставить скобки.
    Короче в FASM/NASM логично сделано. А MASM/TASM позволяет вольности.

    ;)
     
  9. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Мы юзаем интеловскую систему команд. Всяко отклонение сентаксиса возможно, но оно не является чистым асмом. Например как в примерах выше явно не указан сегмент. В более сложных случаях используются конструкции типа Var1 = Var2, там вобще никаких адресов не указывается, их компилятор сформирует. С давних времён принята адресация квадратными скобками, это и осталось в нормальном коде.
     
  10. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Это вопрос спорный.
    На уровне машинных кодов указание префикса сегмента не обязательно, есть сегменты по умолчанию.
    Это и в ассемблер перекочевало, а почему должно быть по другому?
     
  11. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    Rockphorr
    Т.о. в вашем понимании мы адресуемся не от базового регистра, который для этой команды задается в поле mem байта mod-reg-mem, а от смещения. Круто! По описанию команд следует следующее
    d, w, mod-reg-mem[[, scale-index-base], offset] (здесь в скобки взяты не обязательные параметры)
    reg - источник или приемник в зависимости от d, от w бита зависит размер reg1 (8/high)
    mem - может быть как просто reg2, так и [reg2], а при необходимости и [reg2+offset] и даже [base+index*scale+offset]
    Из
    получается, что в команде обязательно должен быть
    offset, а mem и scale-index-base отсутствовать, при необходимости может появляться индекс, а иногда даже база. Но таковое справедливо только для одного регистра (аккумулятора A0..A3: mov al, offset), и то по-моему появилось в качестве расширения
     
  12. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.622
    Адрес:
    Russia
    я про обязательность offset везде и всюду ничего не говорил
    имхо составляющие эффективного адреса равноправны
    попытаюсь выразиться яснее: там где буквенное обозначение итак трактуется как адрес - квадратные скобки избыточны
    есть mov reg,mem - засылка в регистр значения по адресу mem - то что mem будет адресом(смещением) обусловлено кодом команды
    lea reg1,arrayitem[reg2] - в данном случае arrayitem всегда будет трактоваться как offset независимо от того в скобках он или нет

    квадратные скобки действительно нужны чтоб разграничить
    mov AX,2
    mov AX,[2]
    тут без них никуда

    ЗЫ: однако холиварчиг у нас тут разгорелся
     
  13. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    напишите ка пожалуйста ее машинное представление в шестнадцатиричных кодах?
     
  14. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.622
    Адрес:
    Russia
    max7C4
    лениво в справочник лезть
    да и разговор о мнемонических обозначениях
     
  15. Rockphorr

    Rockphorr Well-Known Member

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

    some WORD 5

    ...

    mov AX,some
     
  16. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    тут и без справочник можно сказать, что будет
    068B some если представлять в виде word
    и вот именно эта 06 и есть тот самый mod-reg-mem, означающий что адресация будет с базовым указателем 0 и смещением some в сегменте ds
     
  17. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    тоже самое достигается если явно указать базу. mov ax, [bx+some]; 8B 47 some для -127<some<127/878B some для -32767<some<32767, что сэкономит 1 байт, если some не дальше чем 7F байт от базы
     
  18. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    Кстати чтобы экономить тот же байт для обращения к структурам короче 127 байт, но расположенный далеко от базы можно применить дополнительный, как его многие называют индексный регистр, но только если надо обратиться к 4 и более полям структуры

    Код (Text):
    1. some_other_data db 128 dup (0)
    2.  
    3. some dw 5,6,7,8,9
    4.  
    5. mov si, some
    6. mov ax, [bx+si+0*2]
    7. mov dx, [bx+si+1*2]
    8. mov cx, [bx+si+2*2]
    9. mov di, [bx+si+3*2]
    10. mov si, [bx+si+4*2]
    Обращение к первым 5 элементам массива some. И это короче на 2 байта чем

    Код (Text):
    1. mov si, some
    2. lodsw
    3. mov bp, ax
    4. lodsw
    5. mov dx, ax
    6. lodsw
    7. mov cx, ax
    8. lodsw
    9. mov di, ax
    10. lodsw
    11. mov si, ax
    12. mov ax, bp
    да. а так же о том почему в этих самых обозначениях не надо писать []
    если спуститься с небес на землю и рассмотреть именно машинное представление, то для нее не существует меток, а только числа. Тогда логичнее рассматривать запись любого символического имени метки как ее числовое обозначение (или смещение относительно чего-либо). Тогда справедливо
    ваше же разделение и без дополнительных словесных конструкций типа ptr, addr или offset определяет адрес это или число, что весьма упрощает задачу написания и избавляет от необходимости assume ("указывать компилятору" на то, что ему знать совсем не обязательно). Единственное чего не хватает в таком случае программам на fasm - более строгого разделения пространств имен (допустим по файлам) или большей глубины вложения локальных меток.
    p.s. к тому же в отличие от ptr или addr кнопки [] находятся рядом и не сильно затрудняют задачу в наборе [], а много редакторов текста вообще поддерживают автодополнение скобок, что сводит задачу нажимать лишь на открывающуюся скобку. а вот addr, ptr или offset набрать куда сложнее, и в программе они встречаются чаще (если конечно не использовать макросы или @ equ offset, но чтобы набрать туже собаку надо нажать 2 клавиши, как и в случае со [])
     
  19. Rockphorr

    Rockphorr Well-Known Member

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

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    Rockphorr
    и как вы себе представляете разобраться что надо от компилятора в этой конструкции
    Код (Text):
    1. .data
    2. offset_0 db 5
    3. .code
    4. mov al, offset_0
    вот он и сгенерирует в таком случае
    B0 00 вместо 8A 06 00 00. Нет указания как понимать число записанное в переменной offset_0 (или хотите так: макроподстановке offset_0 equ 0)