invalide use of register

Тема в разделе "WASM.BEGINNERS", создана пользователем Giroch, 6 окт 2011.

  1. Giroch

    Giroch New Member

    Публикаций:
    0
    Регистрация:
    15 сен 2011
    Сообщения:
    48
    Помогите пожалуйсто.
    пытаюсь разобраться в коде:



    .386
    .model small; модель памяти
    .data ;блок данных
    EnterX db "Input an X coord: ",13,0
    EnterY db 'Input an Y coord: ',13,'$'
    Answer db 'The point has a color: $'
    .code
    mov dword ptr si, EnterX
    call PutStr

    mov AH,10h
    int 16h
    push EAX

    mov dword ptr si,EnterY
    call PutStr

    mov ah,10h
    int 16h
    push EAX
    pop dx
    pop cx

    mov ah,0dh
    int 10h
    push EAX

    mov dword ptr si,Answer
    call PutStr

    pop EAX
    call show

    mov ah,10h
    int 16h
    int 21h

    PutStr proc
    mov ah,0Eh
    mov bh,0
    mov bl,7

    nextchar:
    lodsb
    or al,al
    jz return
    int 10h
    jmp nextchar
    return:
    ret
    PutStr endp

    show proc
    mov ah,0Eh
    mov bh,0
    mov bl,7
    int 10h
    ret
    show endp

    end



    после запуска ML.EXE выдаёт ошибку в строках "mov dword ptr si, EnterX" ; "mov dword ptr si,EnterY" ; "mov dword ptr si,Answer" "invalide use of register" . Очень хочется узнать в чом причина и как будет правильно.
    зарание спасибо.
     
  2. Ezrah

    Ezrah Member

    Публикаций:
    0
    Регистрация:
    22 мар 2011
    Сообщения:
    411
    Попробуйте
    Код (Text):
    1. mov si, offset EnterX
    2. mod si, offset EnterY
    3. mov si, offset Answer
     
  3. Giroch

    Giroch New Member

    Публикаций:
    0
    Регистрация:
    15 сен 2011
    Сообщения:
    48
    не помогло, ошибкане изменилась.
     
  4. Dmitry_Milk

    Dmitry_Milk Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2007
    Сообщения:
    540
    Так это 32-хбитный или 16-битный код?
     
  5. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    начните с "ХеллоВорлд".

    0. Не уверен насчет точки входа... Лень вспоминать (лет 5 масм под дос не использовал), но вроде бы end Label в конце как раз и задают точку входа.
    1. Код 16-битный, должен быть. Судя по int 10h. Непонятно зачем вам использовать EAX... как и .386 в начале.
    2. стоит .model small - то есть результат экзешник с сегментами. Надо DS настраивать прежде чем обращаться к строкам в другом сегменте.
    3. компилируется - сильно подозреваю - масм32, то есть пытается создать 32-битный код? Тогда ошибка понятна и предсказуема - offset имеет размер 32 бита, а надо 16.
    4. не совсем ясно, что такое "dword ptr si". Наверно, как подсказали, все-таки mov si, offset ...
    5. Пытаетесь завершить программу через int 21h??? Уверены, что не надо что-то в AX положить? или может, int 20h?

    начните с ХеллоВорлд.
     
  6. Giroch

    Giroch New Member

    Публикаций:
    0
    Регистрация:
    15 сен 2011
    Сообщения:
    48
    Спасибо за столь полный ответ.

    до "ХеллоВорлд" ещо нужно дорасти :)) а этот кусок кода случайно попался на глаза, вот так сказать привыкаю к виду кода....

    кстати не подскажете что это "call PutStr" вроди вызов функции а найти её описание не могу.
     
  7. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    а какое еще нужно описание?
    Как, это не ваш код??? тогда не привыкайте, поищите какой-нибудь другой, который не вызовет критики - хотя бы со стороны компилятора. И к нему привыкайте.
     
  8. Toxasoft

    Toxasoft New Member

    Публикаций:
    0
    Регистрация:
    20 сен 2010
    Сообщения:
    188
    mov ax,offset Blabla
    push ax
    pop si
     
  9. xRom2

    xRom2 New Member

    Публикаций:
    0
    Регистрация:
    25 апр 2011
    Сообщения:
    63
    Я так полагаю правильно будет word... Хотя в любом разе указывать размер регистра называя его же по имени - глупо.
     
  10. Toxasoft

    Toxasoft New Member

    Публикаций:
    0
    Регистрация:
    20 сен 2010
    Сообщения:
    188
    Правильно будет
    Код (Text):
    1. mov ax,offset Blabla
    2. push ax
    3. pop si
    Т.к запись\чтение некоторых рагистров возможна только черех (e)ax или Стек !!!!!!!!
     
  11. Painter

    Painter New Member

    Публикаций:
    0
    Регистрация:
    1 окт 2011
    Сообщения:
    46
    Видимо никто даже не попробывал скомпилировать данный код! Я путем проб и ошибок понял в чем тут дело.
    дело в следующем:
    ну я еще раз скажу что уже многие люди сказали что надо использовать offset, а проблема была в следующем...
    код предназначен для доса, там проц другой... когда стояла директива .386 то компилятор пытался в 16 разрядный проц поместить 32 разрядное смещение, когда же этого не получалось он говорил что оператор должен иметь другой размер. Как использовать 16 разрядное смещение для .386 семейства я не помню и самое оптимальное что я придумал, так это изменить на .8086 и там где пытались использовать регистр eax изменил на ax. Ну а если кто помнит как использовать 16 разрядное смещение то пусть подскажет, мне лень копаться!
     
  12. Painter

    Painter New Member

    Публикаций:
    0
    Регистрация:
    1 окт 2011
    Сообщения:
    46
    FatMoon
    полностью согласен с человеком, если хочешь учиться начинай с ХеллоуВорд. Там все будет описано. Да и кстати я не настраивал сегментные регистры. Так что мой код будет не совсем верный. Давно под дос не компилил!
     
  13. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    Хелло - это самая простая программа. Если вы до нее собираетесь дорасти, то лучше вообще программированием не заниматься. Все другие пути ведут ... вас будут постоянно в гугл и МСДН посылать :) Нужны базовые знания, а метод проб, ошибок и советов - геморой.
    По мне изучение асм в ДОС - мартышкин труд. Вы узнаете много ненужного и бесполезного для нормального программирования.