При компиляции ДОСовской программы в TASM или MASM с строковыми операциями если введена строка типа LDS SI,Str1 Возникает ошибка "Operand types do not match". Хотя без этой строки посредством других заменяющих операторов все работат нормально. Подскажите где искать ошибку?!
infern0 Да сегмент USE16 Попробуйте у себя в самой простой программе вставить такую строку и откомпилировать!
_BC_ Нет не перепутал. В строковых операциях в справочнике приведена именно эта инструкция. И как я только не изменял шапку у меня ничего не вышло!!
offset дает смещение, а LDS получает полный адрес и устанавливает его в DS:SI. Прошу попробуйте с этой инстукцией отассемблировать и если получится опишите заголовок.
а самому попробовать ? lds si, DWORD PTR Str1 === test.c === char rrr[20]; void main(void) { _asm lds esi, rrr; } cl /Fa test.c === test.asm === ... ; Line 5 lds esi, DWORD PTR _rrr ...
RTFIM (read the f.cking Intel manuals). LDS/LES/etc. загружают указатель, т.е. для 32битного кода д.б. df, для 16-ти -- dd. Размер операнда (xxx ptr) в команде LxS -- избыточен, т.к. размер загружаемого операнда всецело определяется целевым регистром (reg16/32). -- ха, подарок от м$. Там не должно ничего быть или уж, на худой конец, fword ptr. А так сгенерированный исходник не будет ассемблироваться. У LxS только одна форма -- /r.
_BC_ Прошла успешно компиляция строки LDS SI,DWORD ptr str1 Но программа работает не верно не правильно загружаются регистры DS и SI. Похоже они загружают также информацию второго байта строки str1. Не должно здесь быть "DWORD ptr" т.к. сама команда должна была определить регистр str1.
Ну как ты не можешь понять, этой инструкции нужен far-указатель. Т.е. в твоем случае это что-то вроде этого Код (Text): str1 db 'some string',13,10,24h ptr1 dd str1 ... lds dx, [ptr1] Эта инструкция(LxS) нечасто использовалась в прогах на ассемблере, в основном ей пользовались HLL-программы под far модель... чаще всего для загрузки far-указателей подсунутых в аргументах, аля les di,[bp+6].
_BC_ В моём понимание было что инструкция LxS должна была сама определять far указатель для str1 смотря на сегмент USE16 или USE32 как написано в справочнике. Сами подумайте для чего лишняя информация в определении указателя если вся информация для её определения имеется? Предложенный Вами вариант сработал нормально!