проблема с компиляцией LDS,LES,...

Тема в разделе "WASM.ASSEMBLER", создана пользователем Afonj, 4 янв 2006.

Статус темы:
Закрыта.
  1. Afonj

    Afonj New Member

    Публикаций:
    0
    Регистрация:
    3 янв 2006
    Сообщения:
    7
    Адрес:
    Russia
    При компиляции ДОСовской программы в TASM или MASM

    с строковыми операциями если введена строка типа

    LDS SI,Str1

    Возникает ошибка "Operand types do not match".

    Хотя без этой строки посредством других заменяющих

    операторов все работат нормально.

    Подскажите где искать ошибку?!
     
  2. infern0

    infern0 New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2003
    Сообщения:
    811
    Адрес:
    Russia
    use16 ?
     
  3. _BC_

    _BC_ БЦ

    Публикаций:
    0
    Регистрация:
    20 янв 2005
    Сообщения:
    759
    Afonj



    А ты случаем не перепутал LDS/LES с LEA? Str1 как определена?
     
  4. Afonj

    Afonj New Member

    Публикаций:
    0
    Регистрация:
    3 янв 2006
    Сообщения:
    7
    Адрес:
    Russia
    infern0

    Да сегмент USE16

    Попробуйте у себя в самой простой программе

    вставить такую строку и откомпилировать!
     
  5. Afonj

    Afonj New Member

    Публикаций:
    0
    Регистрация:
    3 янв 2006
    Сообщения:
    7
    Адрес:
    Russia
    _BC_

    Нет не перепутал. В строковых операциях

    в справочнике приведена именно эта

    инструкция. И как я только не изменял

    шапку у меня ничего не вышло!!
     
  6. Afonj

    Afonj New Member

    Публикаций:
    0
    Регистрация:
    3 янв 2006
    Сообщения:
    7
    Адрес:
    Russia
    _BC_

    Str1 определена как db в сегменте данных.
     
  7. infern0

    infern0 New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2003
    Сообщения:
    811
    Адрес:
    Russia
    как насчет

    LDS SI, offset Str1 ?
     
  8. Afonj

    Afonj New Member

    Публикаций:
    0
    Регистрация:
    3 янв 2006
    Сообщения:
    7
    Адрес:
    Russia


    offset дает смещение, а LDS получает

    полный адрес и устанавливает его в DS:SI.

    Прошу попробуйте с этой инстукцией отассемблировать

    и если получится опишите заголовок.
     
  9. infern0

    infern0 New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2003
    Сообщения:
    811
    Адрес:
    Russia
    а самому попробовать ?

    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

    ...
     
  10. _BC_

    _BC_ БЦ

    Публикаций:
    0
    Регистрация:
    20 янв 2005
    Сообщения:
    759




    RTFIM (read the f.cking Intel manuals).

    LDS/LES/etc. загружают указатель, т.е. для 32битного кода д.б. df, для 16-ти -- dd.



    Размер операнда (xxx ptr) в команде LxS -- избыточен, т.к. размер загружаемого операнда всецело определяется целевым регистром (reg16/32).





    --





    ха, подарок от м$. Там не должно ничего быть или уж, на худой конец, fword ptr. А так сгенерированный исходник не будет ассемблироваться.







    У LxS только одна форма -- /r.

    ;)
     
  11. Afonj

    Afonj New Member

    Публикаций:
    0
    Регистрация:
    3 янв 2006
    Сообщения:
    7
    Адрес:
    Russia
    _BC_

    Прошла успешно компиляция строки



    LDS SI,DWORD ptr str1



    Но программа работает не верно

    не правильно загружаются регистры DS и SI.

    Похоже они загружают также информацию

    второго байта строки str1. Не должно здесь

    быть "DWORD ptr" т.к. сама команда должна

    была определить регистр str1.
     
  12. _BC_

    _BC_ БЦ

    Публикаций:
    0
    Регистрация:
    20 янв 2005
    Сообщения:
    759
    Ну как ты не можешь понять, этой инструкции нужен far-указатель. Т.е. в твоем случае это что-то вроде этого


    Код (Text):
    1. str1    db  'some string',13,10,24h
    2. ptr1    dd  str1
    3.     ...
    4.     lds dx, [ptr1]




    Эта инструкция(LxS) нечасто использовалась в прогах на ассемблере, в основном ей пользовались HLL-программы под far модель... чаще всего для загрузки far-указателей подсунутых в аргументах, аля les di,[bp+6].
     
  13. Afonj

    Afonj New Member

    Публикаций:
    0
    Регистрация:
    3 янв 2006
    Сообщения:
    7
    Адрес:
    Russia
    _BC_

    В моём понимание было что инструкция LxS

    должна была сама определять far указатель

    для str1 смотря на сегмент USE16 или USE32

    как написано в справочнике. Сами подумайте

    для чего лишняя информация в определении

    указателя если вся информация для её определения

    имеется?

    Предложенный Вами вариант сработал нормально!
     
Статус темы:
Закрыта.