з.ы. не надо мне приводить примеры, что masm и tasm разберутся. это и так ясно, но код приведен с учетом сказанного в #56,#57 и #58 постах. пусть попробует разобраться в этом Код (Text): .386 .model small, stdcall offset_0 equ 0 offset_1 equ 1 .code main: mov ax, @data mov ds, ax mov al, offset_0 ret .data ;offset 0 db 5 ;offset 1 end main
max7C4 в таких случаях - конечно, и в масме нужны квадратные скобки мне кажется логичным решение масма о том, что когда имя определено с помощью BYTE, WORD DWORD ... для загрузки значения по адресу соответствующему имени скобок ставить необязательно
max7C4, уважаемый, а в чем смысл?: Дос-приложение. AL = 0. Одна не инициализированная переменная (может не так выразился, ну, выделенный байт (5h) в секции данных). А к чему эти комменты в секции данных? И зачем offset_1, равный 1, если он не используется в Вашем примере? Или я чего-то не понял и это просто пример?)
hack_virii смысл в разнице между Код (Text): some = 2 mov ax,some mov ax,[some] и Код (Text): some byte 2 mov ax,some mov ax,[some] (укажите все эквивалентные мувы)
Rockphorr, мм.. т.о. если , то ошибки не возникнет. Если some byte, то надо использовать или word PTR, или mozx, правильно? А когда мы присваиваем значение по средствам директивы equ или =, то переменная(константа) имеет какой размер? Т.е. Ошибки не вызовет? Мы также можем сделать mov al и mov eax?
hack_virii смысл в разнице между Код (Text): some = 2 mov ax,some mov ax,[some] и Код (Text): some word 2 mov ax,some mov ax,[some] (укажите все эквивалентные мувы из этих четырех!!!!) не в ту степь
Блин.) Надо бросать все вредные привычки, совсем отупел..\ Все равно не понял.( Товарищ Rockphorr, если не сложно, поясните пожалуйста. И не могли бы ответить на мой пост #66? ()=о) С уважением.
hack_virii Нет. Тот пример, который вы рассматриваете направлен на то, чтобы продемонстрировать тот факт, что адрес переменной и число (смещение относительно начала чего-либо) - одно и то же. И что не всегда хорошо, что компилятор (имеется ввиду стиль оформления masm или tasm) позволяет об этом забыть. А на уровне машинных кодов, что mov ax, some, что mov ax, offset_0 даст одно и тоже A1, 00, 00. Но спор начался из-за того, что в системе команд x86 нет возможности такой адресации к памяти (точнее есть только для одного регистра аккумулятора), во для всех других случаев будет Код (Text): 8B 06 0000 ^^ ^^ ^^^^ || || |||| || || ++++->offset=0 || ++-> mod-reg-mem (mod:0; reg:0=ax; mem:offset) ++-> cmd:mov hreg,hreg/hmem
max7C4, ууу... совсем я !%) Сорри. Мне до таких заморочек еще далеко..(мое почтение) Ну а что касаемо моего, 'детского' вопроса? Он настолько примитивен, что нет желающих отвечать?) Ну тогда во избежание гнева товарища Clerk'а не буду настаивать на ответе..р Спасибо, что объяснили.
hack_virii Вы спрашиваете как раз про, то с чем я не согласен (касаемо синтаксисов). Дело в том, что компиляторы ассоциируют с именем (читай меткой) переменной ее "тип" (читай размер). В первом случае компилятор будет автоматически следить за размерами операндов. Во втором же случае у него это не получится по той причине, что у одного из операндов не будет явно указанного типа и он возьмет за константу размер известного операнда (регистра). Вообще в машинном представление размеры не контролируются на уровне команд. Т.е. можно спокойно написать Код (Text): mov al, [0xFFFF] mov ax, [0xFFFF] mov eax, [0xFFFF] и все это будет сгенерировано соответственно в Код (Text): A0 FFFF A1 FFFF 66 A1 FFFF как видите все коды существуют, и их даже попробуют выполнить, но кое-какие коды дадут в данном случае ошибку. Но эта ошибка будет определена только на стадии выполнения именно этих команд. В 16-битном режиме последние 2 команды дадут явную ошибку т.к. операнд вылазит за границы относительной области (сегмента). Компилятор же этого даже не заметит (хотя не берусь предсказать поведение совсем новых версий), даже если явно объявить константы. Код (Text): .data align 0FFFFh byte_FFFF label byte word_FFFF label word dword_FFFF label dword db 5 .code mov al, byte_FFFF mov ax, word_FFFF mov eax, dword_FFFF
Ясно. Кажется. Ну, по-моему, одно из первых правил ассемблера - это внимательно следить за размерами операндов и не расходовать понапрасну драгоценную память (у кого-то я это читал). Главное впредь самому не ошибаться, чтобы не противоречить собственным постам.. К тому же, у меня masm615 и он довольно капризен к размерам операндов. Т.е. если где-то допущена ошибка на несоответствие размеров, exe'шку мне не получить.) max7C4, спасибо за ответ.