max7C4 к инструкции lea афаик бессмыслено приписывать word ptr - она не работает с размерами операндов а то что отладчики и дизасмы приписывают к ней дефолтный тип это уже их косяк
Да ну Почему-то в lea eax,[ebx*2+ecx] тебя скобки не смущают, а в lea eax,[var] - смущают. Лично я и в MASM/TASM всегда со скобками пишу.
max7C4 единственный случай когда надо приписывать sometype ptr это при работе со стуктурами вместе с индексно-базовыми регистрами, но это только если включена проверка типов,используете assume или ставите режим совместимости с 5.1 и никаких проблем
С этого и надо было начинать (в смысле так бы сразу и сказал) Это не косяк. Они таким образом подчеркивают тип адресации (16-, 32- или 64-).
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] другими словами буквенное обозначение адреса совсем необязательно брать в скобки
Строка "5" и число 5 - вещи разные. Если вы выполнить такой код: Код (Text): ;; секция данных mes dd "5" ;; строка ... ;; секция кода mov eax, dword ptr[mes] ;; EAX = 0x00000035 То в EAX (при условии, что строка "5" закодирована в ASCII) будет число 35h. Чтобы загрузить в EAX число 5 из памяти, надо сделать так: Код (Text): ;; секция данных mes dd 5 ... ;; секция кода mov eax, dword ptr[mes] ;; EAX = 0x00000005 P.S.: "-ться" пишется в инфинитивах. Раздражает уже.
Очень единообразно Для единообразия - при доступе к памяти надо ставить скобки. Короче в FASM/NASM логично сделано. А MASM/TASM позволяет вольности.
Мы юзаем интеловскую систему команд. Всяко отклонение сентаксиса возможно, но оно не является чистым асмом. Например как в примерах выше явно не указан сегмент. В более сложных случаях используются конструкции типа Var1 = Var2, там вобще никаких адресов не указывается, их компилятор сформирует. С давних времён принята адресация квадратными скобками, это и осталось в нормальном коде.
Это вопрос спорный. На уровне машинных кодов указание префикса сегмента не обязательно, есть сегменты по умолчанию. Это и в ассемблер перекочевало, а почему должно быть по другому?
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), и то по-моему появилось в качестве расширения
я про обязательность offset везде и всюду ничего не говорил имхо составляющие эффективного адреса равноправны попытаюсь выразиться яснее: там где буквенное обозначение итак трактуется как адрес - квадратные скобки избыточны есть mov reg,mem - засылка в регистр значения по адресу mem - то что mem будет адресом(смещением) обусловлено кодом команды lea reg1,arrayitem[reg2] - в данном случае arrayitem всегда будет трактоваться как offset независимо от того в скобках он или нет квадратные скобки действительно нужны чтоб разграничить mov AX,2 mov AX,[2] тут без них никуда ЗЫ: однако холиварчиг у нас тут разгорелся
тут и без справочник можно сказать, что будет 068B some если представлять в виде word и вот именно эта 06 и есть тот самый mod-reg-mem, означающий что адресация будет с базовым указателем 0 и смещением some в сегменте ds
тоже самое достигается если явно указать базу. mov ax, [bx+some]; 8B 47 some для -127<some<127/878B some для -32767<some<32767, что сэкономит 1 байт, если some не дальше чем 7F байт от базы
Кстати чтобы экономить тот же байт для обращения к структурам короче 127 байт, но расположенный далеко от базы можно применить дополнительный, как его многие называют индексный регистр, но только если надо обратиться к 4 и более полям структуры Код (Text): some_other_data db 128 dup (0) some dw 5,6,7,8,9 mov si, some mov ax, [bx+si+0*2] mov dx, [bx+si+1*2] mov cx, [bx+si+2*2] mov di, [bx+si+3*2] mov si, [bx+si+4*2] Обращение к первым 5 элементам массива some. И это короче на 2 байта чем Код (Text): mov si, some lodsw mov bp, ax lodsw mov dx, ax lodsw mov cx, ax lodsw mov di, ax lodsw mov si, ax mov ax, bp да. а так же о том почему в этих самых обозначениях не надо писать [] если спуститься с небес на землю и рассмотреть именно машинное представление, то для нее не существует меток, а только числа. Тогда логичнее рассматривать запись любого символического имени метки как ее числовое обозначение (или смещение относительно чего-либо). Тогда справедливо ваше же разделение и без дополнительных словесных конструкций типа ptr, addr или offset определяет адрес это или число, что весьма упрощает задачу написания и избавляет от необходимости assume ("указывать компилятору" на то, что ему знать совсем не обязательно). Единственное чего не хватает в таком случае программам на fasm - более строгого разделения пространств имен (допустим по файлам) или большей глубины вложения локальных меток. p.s. к тому же в отличие от ptr или addr кнопки [] находятся рядом и не сильно затрудняют задачу в наборе [], а много редакторов текста вообще поддерживают автодополнение скобок, что сводит задачу нажимать лишь на открывающуюся скобку. а вот addr, ptr или offset набрать куда сложнее, и в программе они встречаются чаще (если конечно не использовать макросы или @ equ offset, но чтобы набрать туже собаку надо нажать 2 клавиши, как и в случае со [])
вот вот + скобки тоже в имя загнать - то бишь пусть компилятор сам разбирает когда ставить скобы вокруг числа полученного из имени а когда нет
Rockphorr и как вы себе представляете разобраться что надо от компилятора в этой конструкции Код (Text): .data offset_0 db 5 .code mov al, offset_0 вот он и сгенерирует в таком случае B0 00 вместо 8A 06 00 00. Нет указания как понимать число записанное в переменной offset_0 (или хотите так: макроподстановке offset_0 equ 0)