Вопрос № 51556: Доброго времени суток, уважаемые эксперты! Рещил я написать антивирус к вирусу из 20-го выпуска рассылки Олега Калашникова. И написал. Почти. Не могу избавиться от одной ошибки:
D:ASMmyprojantivir20.asm(36): error A2022: instruction operands ...Вопрос № 51577: Здравствуите Уважаемые Эксперты !
У меня вопрос: в чем различие между командами OFFSET,ADDR и LEA
Заранее спасибо...
Вопрос № 51.556
Доброго времени суток, уважаемые эксперты! Рещил я написать антивирус к вирусу из 20-го выпуска рассылки Олега Калашникова. И написал. Почти. Не могу избавиться от одной ошибки:
D:ASMmyprojantivir20.asm(36): error A2022: instruction operands must be the same size
D:ASMmyprojantivir20.asm(45): error A2022: instruction operands must be the same size
D:ASMmyprojantivir20.asm(55): error A2022: instruction operands must be the same size
D:ASMmyprojantivir20.asm(73): error A2022: instruction operands must be the same size
Помогите разобраться. Заранее спасибо.
Приложение:
Отправлен: 08.08.2006, 23:11
Вопрос задал: Macr0hard (статус: Посетитель)
Всего ответов: 1 Мини-форум вопроса >>> (сообщений: 5)
Отвечает: Пашка
Здравствуйте, Macr0hard!
;--------------------------------------------****************************************
Для того чтобы получить ответ с большим % правельности отправляйте не только код НО! и include-файлы, а так же название компилятора и компановщика + их версии.
;****************************---------------------------------------------------------------
Ниже идёт листиг вашей программы без include-вставок я их закоментировал. После компиляции исходника который идёт ниже ↓ + сборки его, ошибок обнаружено не было!
С, Уважением MnEm0niC.
"Да прибудет с вами сила..."
Приложение:
Ответ отправил: Пашка (статус: 1-ый класс)
Ответ отправлен: 09.08.2006, 01:15 Оценка за ответ: 5
Вопрос № 51.577
Здравствуите Уважаемые Эксперты !
У меня вопрос: в чем различие между командами OFFSET,ADDR и LEA
Заранее спасибо
Честно говоря, незнаю такой команды "ADDR". Разберемся с остальными.
OFFSET - оператор получения смещения.
пример:
.data
pole dw 5
...
.code
...
mov ax, seg pole ;получение сегментной составляющей адреса
mov es, ax
mov dx, offset pole ;теперь в паре регистров es:dx полный адрес pole
...
LEA (Load Effective Address) - получение эффективного адреса (собственно, того же смещения) источника.
пример:
.data
mas db 10 dup (0)
.code
...
mov di, 4
lea bx, mas[di]
;или
lea bx, mas[4]
;или
lea bx, mas+4
...
Как видим они отличаются синтаксисом ("offset" используется совместно с командой передачи данных "mov": mov приемник, offset выражение. Синтаксис же команды "lea": lea приемник, источник), плюс команда "lea" потдерживает индексацию операнда, что позволяет более гибко организовать адресацию операндов.
Ответ отправил: Aliasman (статус: 1-ый класс)
Ответ отправлен: 09.08.2006, 05:38 Оценка за ответ: 5
Отвечает: All
Здравствуйте, Денскевич Р!
offset Оператор получения смещения выражения offset позволяет получить значение смещения выражения
в байтах относительно начала того сегмента, в котором выражение опредеl
3;ено
LEA Назначение: получение эффективного адреса (смещения) источника
Данная команда является альтернативой оператору ассемблера offset. В отличие от offset команда
lea допускает индексацию операнда, что позволяет более гибко организовать адрес
ацию операндов.
ADDR это масмовский аналог offset, но тут я могу ошибаться(редко его использую)
Ответ отправил: All (статус: 1-ый класс)
Ответ отправлен: 09.08.2006, 07:23 Оценка за ответ: 5
Отвечает: Волков Павел Юрьевич
Здравствуйте, Денскевич Р!
offset - команда компилятора (МАSM, TASM), указывающая ему на замену переменной, в команде ассемблера, ее адресом (смещением, относительно начала сегмента).
В литературе называют оператором ассемблера или директивой.
addr - тоже команда компилятора (MASM), используется при вызове функции через макрос invoke, указывает на замену, в процессе компиляции, переменной ее адресом (смещением, относительно начала сегмента).
lea - команда процессора, выполняющая загрузку, в переменную-приемник, адреса переменной-источника (смещением, относительно начала сегмента).
При этом при использовании lea, источник - адрес переменной в памяти, приемник - регистр общего назначения.
Некоторые компиляторы (TASM v.4.1) заменяют инструкцию lea на mov, сокращая размер команды на байт, создавая идентичность использования lea r16/r32,m16/m32 и mov r16/r32, offset m16/m32.
--------- Век живи, век учись.
Ответ отправил: Волков Павел Юрьевич (статус: 6-ой класс)
Ответ отправлен: 09.08.2006, 07:32 Оценка за ответ: 5
Отвечает: Brutaller
Здравствуйте, Денскевич Р!
В дополнение ко всему сказанному:
к сожалению не помню где читал, возможно даже на wasm.ru, о том, что ADDR можно применять в процедурах по отношению к локальным переменным, в то время как OFFSET с локальными переменными использовать нельзя.
Ответ отправил: Brutaller (статус: 2-ой класс)
Ответ отправлен: 10.08.2006, 22:29