Помогите пожалуйсто. пытаюсь разобраться в коде: .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" . Очень хочется узнать в чом причина и как будет правильно. зарание спасибо.
начните с "ХеллоВорлд". 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? начните с ХеллоВорлд.
Спасибо за столь полный ответ. до "ХеллоВорлд" ещо нужно дорасти ) а этот кусок кода случайно попался на глаза, вот так сказать привыкаю к виду кода.... кстати не подскажете что это "call PutStr" вроди вызов функции а найти её описание не могу.
а какое еще нужно описание? Как, это не ваш код??? тогда не привыкайте, поищите какой-нибудь другой, который не вызовет критики - хотя бы со стороны компилятора. И к нему привыкайте.
Я так полагаю правильно будет word... Хотя в любом разе указывать размер регистра называя его же по имени - глупо.
Правильно будет Код (Text): mov ax,offset Blabla push ax pop si Т.к запись\чтение некоторых рагистров возможна только черех (e)ax или Стек !!!!!!!!
Видимо никто даже не попробывал скомпилировать данный код! Я путем проб и ошибок понял в чем тут дело. дело в следующем: ну я еще раз скажу что уже многие люди сказали что надо использовать offset, а проблема была в следующем... код предназначен для доса, там проц другой... когда стояла директива .386 то компилятор пытался в 16 разрядный проц поместить 32 разрядное смещение, когда же этого не получалось он говорил что оператор должен иметь другой размер. Как использовать 16 разрядное смещение для .386 семейства я не помню и самое оптимальное что я придумал, так это изменить на .8086 и там где пытались использовать регистр eax изменил на ax. Ну а если кто помнит как использовать 16 разрядное смещение то пусть подскажет, мне лень копаться!
FatMoon полностью согласен с человеком, если хочешь учиться начинай с ХеллоуВорд. Там все будет описано. Да и кстати я не настраивал сегментные регистры. Так что мой код будет не совсем верный. Давно под дос не компилил!
Хелло - это самая простая программа. Если вы до нее собираетесь дорасти, то лучше вообще программированием не заниматься. Все другие пути ведут ... вас будут постоянно в гугл и МСДН посылать Нужны базовые знания, а метод проб, ошибок и советов - геморой. По мне изучение асм в ДОС - мартышкин труд. Вы узнаете много ненужного и бесполезного для нормального программирования.