При закрытии подписчики были переданы в рассылку "RFpro.ru: Ассемблер? Это просто! Учимся программировать" на которую и рекомендуем вам подписаться.
Вы можете найти рассылки сходной тематики в Каталоге рассылок.
Информационный Канал Subscribe.Ru |
Выпуск № 175
от 02.07.2005, 12:50
Администратор: | Калашников О.А. |
В номере: | Вопросов: 5, Ответов: 12 |
Вопрос № 22.685 |
Взял в инете исходник драйвера под ДОС. Только не понимаю, для чего в самом начале описываются структура заголовка запроса, а затем заголовки запросов некоторых команд (если какую-либо команду закомментировать, то драйвер начинает глючить и отказывается работать). Точнее, что за конструкция и как она работает: NAME struc ......... NAME ends А также что делает к примеру команда mov al,es:[bx].rh_cmd а именно, [bx].rh_cmd? - к bx прибавляется смещение, лежащее в переменной rh_cmd что ли? Заранее всем спасибо! Приложение: |
Отправлен: 26.06.2005, 15:03 Вопрос задал: Firion (статус: Посетитель) Всего ответов отправлено: 2 |
Отвечает: Евгений Иванов Здравствуйте, Firion! mov al,es:[bx].rh_cmd - это взятие данных из структуры из элемента rh_cmd. rh_cmd - это будет число. смещение от начала структуры, начало которой заносится в BX. Удачи! --------- Что имеем - не храним, потерявши - плачем |
Ответ отправил: Евгений Иванов (статус: Профессор) Отправлен: 26.06.2005, 16:09 |
Отвечает: Ayl Здравствуйте, Firion! Структура - это специальное описание, предназначенное для того, чтобы компилятор мог подставить нужное смещение самостоятельно. Например: coor struc x dw ? y dw ? coor ends Тогда, если ты напишешь так: mov ax, [bx].x то компилятор переведет это как mov ax, [bx] а если так: mov ax, [bx].y то так: mov ax, [bx + 2] Т.е. при использовании структур программисту не нужно самому подставлять нужные смещения и, кроме того, при изменении структуры ему не нужно изменять программу, достаточно ее только перекомпилировать. В твоем случае [bx].rh_cmd - это значение поля rh_cmd в структуре, которая начинается по адресу, находящемуся в bx. А rh_cmd - это смещение данного поля в самой структуре. --------- Трудное - то, что можно сделать немедленно. Невозможное - то, для выполнения чего требуется немного больше времени |
Ответ отправил: Ayl (статус: Профессор) Отправлен: 27.06.2005, 13:20 |
Вопрос № 22.688 |
Я запутался, чего-то непойму. Вылетает msgbox при выполнении программы. Помогите разобраться. Нужно очистить экран с 0-го столбца 12-ой строки до 79-го симвла 22-й строки. Правильно ли я начал ее выполнять? Вродебы осталось только нижнюю строку заполнить пробелами, но для видимости я заполнил "!" до 79 символов. Приложение: |
Отправлен: 26.06.2005, 18:12 Вопрос задал: Терсков Алексей Николаевич (статус: Посетитель) Всего ответов отправлено: 3 |
Отвечает: Berkut Здравствуйте, Терсков Алексей Николаевич! В предыдущем письме слегка напутал, видео память начинается не в сегменте 0A000h(графический режим), а в сегменте 0B800h и символ занимает 2 байта (код символа и атрибут). Код функции ниже. Приложение: |
Ответ отправил: Berkut (статус: 1-ый класс) Отправлен: 27.06.2005, 00:40 |
Отвечает: Стас Здравствуйте, Терсков Алексей Николаевич! Какой еще msgbox? В смысле предупреждения при ассемблировании? Это потому что STR - зарезервированное слово, замени например на _STR. Процедура описывается так: procedure proc ... endp procedure И наконец закрой сегмент перед завершение программы: cseg ends end BEGIN А так вроде все правильно, хотя строки и не считал. P.S. вместо add dl,1 есть специальная команда inc dl. |
Ответ отправил: Стас (статус: Практикант) Отправлен: 27.06.2005, 01:09 |
Отвечает: ASMодей Здравствуйте, Терсков Алексей Николаевич! Все это делается гораздо прощес с использованием уже существующих фукций BIOS (см. приложение). Приложение: |
Ответ отправил: ASMодей (статус: Профессионал) Отправлен: 27.06.2005, 16:26 |
Вопрос № 22.690 |
CSEG segment assume cs:CSEG, ds:CSEG, ss:CSEG org 100h BEGIN: mov dh,12 ; строка курсора mov dl,0 ; столбец курсора mov ah,2 mov cx,9 int 10h str: call procedure int 10h loop str procedure proc push cx mov cx,80 str1: mov bl,dl mov dl,21h int 21h mov dl,bl add dl,1 ; сместится на один символ в право int 10h loop str1 add dh,1 mov dl,0 ; обнулить pop cx ret endp proc Почему этот фрагмент не выполняется, только не обзывайте меня тупым, я еще новичек в программировании | V ------------------------------------------------- mov ah,23 mov dl,0 mov dh,1 int 10h mov cx,4 str2: mov bl,dl mov dl,21h int 21h mov dl,bl add dl,1 ; сместится на один символ в право int 10h loop str2 int 20h end BEGIN ------------------------------------------------ Приложение: |
Отправлен: 26.06.2005, 18:39 Вопрос задал: Терсков Алексей Николаевич (статус: Посетитель) Всего ответов отправлено: 3 |
Отвечает: Стас Здравствуйте, Терсков Алексей Николаевич! Чтобы на экран символ вывести надо: в DL - засунуть сам символ(это у тебя есть), в AH поместить номер функции - 2 , а это где? т.е. должно быть так: mov ah,2 mov bl,dl mov dl,21h int 21h |
Ответ отправил: Стас (статус: Практикант) Отправлен: 27.06.2005, 01:14 |
Отвечает: Евгений Иванов Здравствуйте, Терсков Алексей Николаевич! виновата RET. по этой команде происходит выход из программы. чтобы этого избежать, убери подпрограмму за INT 20h, ниже. --------- Что имеем - не храним, потерявши - плачем |
Ответ отправил: Евгений Иванов (статус: Профессор) Отправлен: 27.06.2005, 02:15 |
Отвечает: ASMодей Здравствуйте, Терсков Алексей Николаевич! Не выполняется потому что до него не доходит управление. Попробуйте сами пройти весь алгоритм программы по шагам: после цикла куда передастся управление? На процедуру, а в конце процедуры встретится инструкция ret и программа завершится. |
Ответ отправил: ASMодей (статус: Профессионал) Отправлен: 27.06.2005, 16:31 |
Вопрос № 22.695 |
Вопрос для урока 15. Там введена переменная Num_status. Не понятно следущее: почему переменная инициализируется в одной процедуре(Int_1Ch_proc), а обрещение к ней идет уже в процедуре, запускающейся раньше/выше (в процедуре Int_09h_proc) и вообще имеет ли значение где ее инициализировать, могу ли я это сделать в основном теле программы где происходит установка процедур на прерывания? Аналогично ситуация с переменнымы int_XXh_vect, в основном теле программы им присваиваются значения, а их инициализация по идее должна быть после того как процедура начнет работать ( после mov ax,25XXh ...int 21h). Пожалуста разъясните возникшее недоразумение...Спасибо. |
Отправлен: 26.06.2005, 22:18 Вопрос задал: Mazin Alexey Ivanovich (статус: Посетитель) Всего ответов отправлено: 2 |
Отвечает: Стас Здравствуйте, Mazin Alexey Ivanovich! В процедуре Int_1Ch_proc не иницализируется, а располагается, строго говоря она вообще "инициализируется" в процессе компиляции т.е. ей присваевается значение 0. (Напротив - Num_status db ? - не инициализирована) А где она распологается разницы никакой. Тем более в COM файле, где CS=DS. Главное чтоб не среди кода. Тоже самое и для int_XXh_vect размещение не имеет значения, главное чтоб они не оказались "за бортом". Т.е. после Init. Т.к. после Init память отходит системе. А вот с этим не понял "а их инициализация по идее должна быть после того как процедура начнет работать ( после mov ax,25XXh ...int 21h)." В int_XXh_vect сохраняются адреса векторов настоящих прерываний - после исполнения "наших" процедур мы исполняем и старые - jmp dword ptr cs:[Int_21h_vect]. |
Ответ отправил: Стас (статус: Практикант) Отправлен: 27.06.2005, 00:47 |
Отвечает: Евгений Иванов Здравствуйте, Mazin Alexey Ivanovich! значит, так задумано. ведь работа прерывания будет потом происходить, а в это время основной код будет выгружен. --------- Что имеем - не храним, потерявши - плачем |
Ответ отправил: Евгений Иванов (статус: Профессор) Отправлен: 27.06.2005, 01:24 |
Вопрос № 22.705 |
Объясните мне пожалуйста назначение каждого слова из этих строчек. 1. Data1 segment word 'data' ? 2. stack segment para stack 'stack' ? 3. _data segment word public 'data' ? |
Отправлен: 27.06.2005, 10:08 Вопрос задал: Терсков Алексей Николаевич (статус: Посетитель) Всего ответов отправлено: 2 |
Отвечает: Ayl Здравствуйте, Терсков Алексей Николаевич! 1. Data1 - имя сегмента (любой идентификатор) segment - директива компилятора, определяющая описание сегмента word - тип выравнивания сегмента: byte - сегмент начнется с текущего адреса word - сегмент начнется с четного адреса para - сегмент начнется с адреса, кратного 16 (параграф) 'data' - тип сегмента: 'code' - сегмент кода 'data' - сегмент данных 'stack' - сегмент стека 3. Аналогично, только добавлен еще параметр привязки сегмента public. Т.е. сегмент будет общедоступным. --------- Трудное - то, что можно сделать немедленно. Невозможное - то, для выполнения чего требуется немного больше времени |
Ответ отправил: Ayl (статус: Профессор) Отправлен: 27.06.2005, 13:32 |
Отвечает: Евгений Иванов --------- Что имеем - не храним, потерявши - плачем |
Ответ отправил: Евгений Иванов (статус: Профессор) Отправлен: 27.06.2005, 13:33 |
© 2001-2005, RusFAQ.ru, Россия, Москва. Все права защищены.
Идея, дизайн, программирование, авторское право: Калашников О.А.
Subscribe.Ru
Поддержка подписчиков
Другие рассылки этой тематики
Другие рассылки этого автора
Подписан адрес:
Код этой рассылки:
comp.soft.prog.faq
Отписаться
Вспомнить пароль
В избранное | ||