Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: программирование на языке Assembler


Информационный Канал Subscribe.Ru

РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Assembler

Выпуск № 175
от 02.07.2005, 12:50

Администратор:Калашников О.А.
В номере:Вопросов: 5, Ответов: 12


Вопрос № 22685: Взял в инете исходник драйвера под ДОС. Только не понимаю, для чего в самом начале описываются структура заголовка запроса, а затем заголовки запросов некоторых команд (если какую-либо команду закомментировать, то драйвер начинает глючить и отказ...
Вопрос № 22688: Я запутался, чего-то непойму. Вылетает msgbox при выполнении программы. Помогите разобраться. Нужно очистить экран с 0-го столбца 12-ой строки до 79-го симвла 22-й строки. Правильно ли я начал ее выполнять? Вродебы осталось т...
Вопрос № 22690: 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 ...
Вопрос № 22695: Вопрос для урока 15. Там введена переменная Num_status. Не понятно следущее: почему переменная инициализируется в одной процедуре(Int_1Ch_proc), а обрещение к ней идет уже в процедуре, запускающейся раньше/выше (в процедуре Int_09h_proc) и вообще...
Вопрос № 22705: Объясните мне пожалуйста назначение каждого слова из этих строчек. 1. Data1 segment word 'data' ? 2. stack segment para stack 'stack' ? 3. _data segment word public 'data' ? ...

Вопрос № 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


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2005, RusFAQ.ru, Россия, Москва. Все права защищены.
Идея, дизайн, программирование, авторское право: Калашников О.А.

Яндекс


Subscribe.Ru
Поддержка подписчиков
Другие рассылки этой тематики
Другие рассылки этого автора
Подписан адрес:
Код этой рассылки: comp.soft.prog.faq
Отписаться
Вспомнить пароль

В избранное