Ну тогда так. Описание проблемы: Изучаю книгу "Ассемблер - это просто..." Но ни одна из программ-примеров (те, что в папках с номерами 001,002 и т.д. ) не работает. Может я не так что-то делаю? Книгу и прилагаемые программы качал с сайта О. Калашникова. Как запускать примеры? Или они не работают? • Ответ № 240176 от Лысков Игорь Витальевич, Специалист Здравствуйте, Asm75! Все программы были написаны ля работы под ДОС-ом Прямая запись в видеопамять под Windows в досовской программе будет работать только после инициализации видеорежима. Т.о., в начале программы необходимо вставить Код: mov ax, 0003hint 10h Действительно, что-то не так делаете. Первый совет: внимательно прочитайте "несущественное" начало - как устанавливать, как писать, где сохранять, как компилировать ... . Второе: многие программы выполняются, выводят в консольное окно какую-то информацию и закрываются вместе с ним. Так что на быстрой машине даже моргнуть не успеете, как все закончилось. Может сложиться впечатление, что ничего не получилось. Здесь совет: еще раз прочитайте первый совет. Ну и, конечно, напишите, какие сообщения получаете? Каким ассемблером пользуетесь? == И наконец, трудно дать ответ по такой малой информации. Если б мы сидели рядом с Вами, то поняли бы сразу, что Вы не так делаете. А тут нужно больше информации о Ваших действиях ------- Boriss, Профессор ------------------------------------------------------------------------------- [03.01.2009, 00:10] Спасибо. Согласен. С компиляцией и линкованием проблем нет. Ассемблер - MASM611. Как запускать созданные com-файлы - двойным щелчком левой кнопки мыши или из cmd? Пробовал по всякому. Результат - черное окно cmd с мигающим курсором и всё. Нажатие клавиш ничего не меняет. Закрыть окно можно только нажав крестик в правом верхнем углу окна диалога. Затем знакомое большинству пользователей ПК окно сообщения Программа не отвечает-Завершить сейчас? На что отвечаю О.К. Вот и весь мой ассмемблер. Машина Pentium D ОЗУ 1 Гб. После вставки кода: mov ax, 0003h int 10h в программу после компиляции файла .com cmd сообщила, что start adress is not equal to 0x100 for /TINY (это я знаю - вроде как модель памяти DOS). Ну, а мне и не надо вроде бы соответствия с DOS, мне FLAT надo? или я ошибаюсь int10h с другой стороны это прерывание ДОС и оно должно с указанием номера функции этого прерывания и режима (ah00 и al03) напрямую записывать файл в видеопамять под Windows. Два вопроса: 1/Как открывать файлы .com? 2/Куда вставлять вышеуказанный код? после Begin: или куда? В Бейсике видеорежим определяется в самом начале программы, а в асме? Я остановился на том месте книги, где описывается пример 007. Вот когда его двойным щелчком из папки открываешь или когда из cmd запускаешь, то программа-пример ничего не выводит, хотя должна заполнять экран ASCII символами, а вместо этого ведет себя вышеописанным образом. Пробовал и сам набирать код примера 007 в файл .asm и готовый пример запускать - одно и то же: не работает. Кстати рожицу (из предыдущих глав книги) тоже не смог нарисовать но двинулся дальше. Еще вопрос вдогонку: зачем в создаваемой com-программе писать строку assume cs:CSEG, ds:CSEG, es:CSEG, ss:CSEG если и так все регистры устанавливаются в соответствии с сегментом куда загружается .com? ------------------------------------------------------------------------------ Когда вставляешь код mov ax,0003h int 10h в программу после Begin: то файл .com запускается из cmd и при нажатии ESC окно cmd становится синим. Почему?
Можно просто запускать двойным щелчком по файлу, а можно и из cmd. Я предпочитаю запускать cmd так как окно не закрывается. Хочется узнать какая у вас windows. Теперь вернемся к вопросом о коде. Вставлять надо после start. Но автор почемуто не стал использовать start хотя это зарезервированное слово, а использовал begin. Tiny и Flat это модели памяти. И к досу они имеют слабое отношение. Это прерывания не Dos, а BIOS. Где хочешь. Вот только виндовсе что-бы заработали примеры нужно перед выводом в видео память проинициировать видео режим. Это чтобы проинформировать компилятор о том что именно загруженно в регистр. По большому счету это нужно только для проверки выхода за границы сегментов. Тех сегментов которые мы объявим в коде. Эта проверка делается на стадии компиляции поэтому от выхода за приделы массива не спасет. Зато поможет компилятору/линкеру верно рассчитать смещения до меток и переменных в коде. К примеру com файл загрузился в сегмент 1000h, а мы хотим чтобы данные распологались в сегменте 2000h. Чтобы не писать везде +1000h мы можем просто загрузить сегментый регист данные. Но компилятор должен знать что именно эти данные будут раположены расположенны а некокието ддругии. Вот чтобы непутоться мы и указываем. assume ds:DSEG
Asm75 Из справки на MASM. Код (Text): Memory model Your choice of a memory model determines how memory is set up for program code and data. The following table shows attributes of the different memory models. Select a memory model for more information. Code Data Segment Data and Code Distance Distance Width Combined? +---------+---------+--------+-------------+ Tiny | NEAR | NEAR | 16-bit | Yes | +---------+---------+--------+-------------+ Small | NEAR | NEAR | 16-bit | No | +---------+---------+--------+-------------+ Compact | NEAR | FAR | 16-bit | No | +---------+---------+--------+-------------+ Medium | FAR | NEAR | 16-bit | No | +---------+---------+--------+-------------+ Large | FAR | FAR | 16-bit | No | +---------+---------+--------+-------------+ Huge | FAR | FAR | 16-bit | No | +---------+---------+--------+-------------+ Flat | NEAR | NEAR | 32-bit | Yes | +---------+---------+--------+-------------+ The OPTION SEGMENT and SEGMENT directives can override the default segment width. FLat мы используетм в виндоусовском приложении, в досе мы используем другии модели памяти. Flat - в переводе плоский. Вся память доступна сразу. И адресуется очень просто [рег32] сегментые регистры практически не используются. 32 бита просто потому что система у нас 32 битная. Tiny - в переводе простой. Тут все просто один сегмент 64 кбайта. В нем расположен и код и данные. Компилятору мы можем сообщить это как Код (Text): .tiny Так же об этом сигнализирует установка сегментов Код (Text): assume cs:CSEG, ds:CSEG, es:CSEG, ss:CSEG Все регистры установленны в один сегмен. Вот еслибы были разные то это уже другая модель памяти.
Ничего не помогло из вышесказаного..... гугл тоже молчит..... Уважаемые форумчане, помогите решить вопрос. Очень хочеться продолжать изучение ассемблера по Калашникову или предложите ему альтернативу) Вот оригинальный код из книги : Код (Text): CSEG segment org 100h _beg: mov ax, 0B800h mov es, ax mov di, 0 mov ah, 31 mov al, 1 mov es: [di], ax mov ah, 10h int 16h int 20h CSEG ends end _beg
fa2t3d Блин, все новички на эту бомбу попадаются. Набери в поисковике Калашников + masm. Думаю найдешь кучу разъяснений и ссылок на другие исходники. Либо используй tasm, но это такое ретро, что для обучения IMHO бессмысленно. Да и здесь кроме Калашникова ну тьма материала...
пусть вас не смущает что в результате белая рожица на синем фоне вы ведь забыли букву h у 31 да и символ с атрибутом местами поменяли