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

Ассемблер? Это просто! Учимся программировать (FAQ)


Служба Рассылок Subscribe.Ru проекта Citycat.Ru

Ассемблер? Это просто! Учимся программировать (FAQ)
______________________________________

Выпуск N 001

Вопросы, которые поступили от подписчиков рассылки
"Ассемблер? Это просто! Учимся программировать"

Дата выхода: 2001-04-27


Что нового в программе генерации рассылки?

1. Вопросы пока рассылаются экспертам через службу eGroups.

2. Нет опции автоматического добавления эксперта.

3. Нет контроля за высылаемой информацией.

4. Нет формы голосования на ответы эксертов.

5. Рассылка выходит по мере накопления 3-х вопросов/ответов.

6. Баллы экспертам не начисляются.

7. Нет новых правил работы экспертных групп применительно к данной системе.

8. Форма для вопроса находится (пока!) на сайте (адрес ниже). Это связано с проблемой перекодировки Win и KOI8.

Совершенствование программы продолжается постоянно! Новости будут публиковаться вверху рассылки (как сейчас).

В добрый путь!


Вопрос

Уважаемый эксперт!

Ответьте, пожалуйста, что такое дизассемблер и для чего он нужен? Где я могу его достать? Если возможно, то прошу избегать заумных фраз, иначе я могу вас непонять.

Ответ

Здравствуйте, Алексей.

Дизассемблер - это программа, которая переводит закомпелированный файл в исходный код на Ассемблере.

С уважением, Evgeny


Вопрос

Здравствуйте!

Вот хотел спросить: вроде как я прочитал, функция 0С 33h прерывания должна реагировать на прерывания поступающие от мыши и вызывать определенную мной процедуру, но делает она это только, когда ее в цикл запихиваешь. Так и должно быть?

Заранее благодарю.

Ответ

Дело в том, что эта функция только опрашивает мышь, но не ждет действий от нее, как при работе с клавиатурой. Поэтому ее и надо помещать в цикл, чтобы "поймать" движение мыши (комп-то это делает мгновенно).

С уважением, Старчиков Алексей (http://www.proghelp.vov.ru/)


Вопрос

Здравствуйте!

Вот хотел спросить: вроде как я прочитал, функция 0С 33h прерывания должна реагировать на прерывания поступающие от мыши и вызывать определенную мной процедуру, но делает она это только, когда ее в цикл запихиваешь. Так и должно быть?

Заранее благодарю.

Ответ

Функция 0Ch прерывания 33h устанавливает обработчик событий от мыши. Механизм реализации должен быть следующим:

1. Созадются глобальные переменные для хранения данных от мыши и для сигнализации события

2. Создается процедура обработки события от мыши

3. Устанавливается обработчик событий на определенные события (перемещение, нажатие кнопки)

4. В рабочем цикле программы: если семафор события от мыши сброшен --> занимаемся своим делом иначе --> обрабатываем данные от мыши

5. При завершении программы восстанавливаем старый обработчик.

Ниже я приведу кусок кода выдранный мной из моего курсовика по программированию и адаптированный к вашему вопросу (вырезал большую часть не относящуюся к мыши). Этот код детектирует мышь, и далее при кликании мышкой на экране ставит туда символ "@" (желтый на синем). Будут вопросы пишите.

 

Программа выполнена в виде ехе модуля, и написана в режиме ideal компилятора TASM.

Good luck. Slava V.

P.S. Увы, извиняюсь за малость комментариев. Туго с временем.


Вопрос

Здравствуйте!

Проблема следующая, я не знаю флагов сопроцессора. Пожалуйста, напишите список флагов сопроцессора (где расположены и за что отвечают).

С уважением, Виктор.

Ответ

Флаг переноса CF (Carry Flag). Содержит 1, ели произошел перенос единицы при сложении или заем единицы при вычитании. Используется также в циклических операциях и операциях сравнения.

Флаг четности PF. Содержит 1, если в результате операции получено число с четным количеством значащих разрядов, т.е. дополняет результат до нечета - используется в операциях обмена для контроля данных.

Флаг внешнего переноса AF. Контролирует перенос из 3-го бита данных. Полезен при операциях над упакованными десятичными цифрами.

Флаг нуля ZF (Zero Flag). Равен 1, если в результате операции получен 0, и равен 0 в противном случае.

Флаг знака SF. Равен 1, если в результате операции получено отрицательное число (с единицей в старшем разряде, т.е. последний бит (биты нимерубтся с права на лево)).

Флаг трассировки TF (Trass Flag). Равен 1, если программа выполняется по шагам, с передачей управления после каждой выполненной команды по прерываения с вектором 1.

Флаг прерывания IF (Interrupt Flag). Содержит 1, ели микропроцессору разрешена обработка прерываний.

Флаг управления DF. Управляет направлением передачи данных: если он содержит 0, то после каждой индексной операции содержимое индексных регистров увеличивается на 1, в противном случае - уменьшается на 1.

Флаг переполнения OF (Overflow Flag). Равен 1, если в результате операции получено число, выходящее за разрядную сетку процессора, т.е. получится число превышающее максимальный размер регитра или переменной.

С уважением, Старчиков Алексей (http://www.proghelp.vov.ru/)


Вопрос

Я сейчас прохожу 13 выпуск этой рассылки. Подскажите, пожалуйста, что именно делает оператор XOR dx,dx.

В предыдущих рассылках он использовался просто для очистки. А для чего он используется вообще и непосредственно в рассылке № 13.

Ответ

Команда xor выполняет операцию "исключающего или" (так же называется "сложение по модулю два").

Таблица истинности для этой операции:

Х1 Х2 | Y
------------
| 0 0 | 0
| 0 1 | 1
| 1 0 | 1
| 1 1 | 0
------------

Как видим из таблицы, результат будет истинным лишь тогда, когда, только один из операндов истинный. В случае же если оба операнда истинны или оба ложны то и результат будет ложным. Получается как бы "или Х2 или Х1", т.е. взаимоисключающая операция.

Использование же команды для очистки регистров (например xor ax, ax) базируется на том, что оба операнда равны, а, следовательно, результат операции всегда будет "ложь".

Например:
ax = 1234h
В двоичной системе: 1234h = 1001000110100b

Результат:
1001000110100
xor
1001000110100
-------------------
0000000000000

Как задание для самопроверки, могу сказать что если выполнить операцию xor ax, 0 то результатом будет ax, а если выполнить операцию xor ax, 0FFFFh, то результатом будет аналогичен операции not ax.

Good luck. Slava V.


Вопрос

Я только начинаю изучать ассемблер, но у меня уже возникла необходимость иметь документацию по всем прерываниям.

Типа:
Прерывание 21h:
Прерывание ДОС'а:
Функция 4Ch - передача управления ДОС'у.
Перед вызовом в AH положить 4Ch, в AL - код завершения программы.

Или что-то в этом виде. Не могли бы Вы прислать мне на майл документацию такого сорта или подсказать где ее можно достать.

Ответ

Самый полный список прерываний и их функции можно найти здесь: http://www.pobox.com/~ralf

Одна проблема: он англоязычный.

Good luck. Slava V.


Вопрос

Эту программу я написал, пользуясь уроком номер 4, пытаясь написать и освоить цикл. Я использую Macro Assembler 6.12.

Программа не работает. Исправте, пожалуйста ошибки, и если вам не
трудно - напишите, почему программа не работала. Зарание благодарен.
Программа (должна выводить текст на экран):

CSEG segment
org 100h
Start:

mov cx,3
Label_1:
mov ah,9
mov dx,offset Msg
msg db 'Xe-Xe!$'
int 21h
loop Label_1

int 20h

CSEG ends
end Start

Ответ

Здравствуйте!

Вы допустили типичную ошибку для начинающего. Код и данные НЕ могут идти в перемешку, иначе данные просто считаются кодом и скорее всего Ваша программа просто виснет.

Вот как должна выглядеть Ваша программа:

-----------------------------------------

CSEG segment
org 100h

Start:

mov cx,3
Label_1:
mov ah,9
mov dx,offset Msg
int 21h
loop Label_1

int 20h

msg db 'Xe-Xe!$'

CSEG ends
end Start
-----------------------------------------

В данном случае данные размещаются после кода. Можно и в начале, тогда так:

-----------------------------------------

CSEG segment
org 100h

Start: jmp begin

msg db 'Xe-Xe!$'

begin:
mov cx,3
Label_1:
mov ah,9
mov dx,offset Msg
int 21h
loop Label_1

int 20h
CSEG ends
end Start
-----------------------------------------

Можно и так как Вы сделали, но тогда надо, чтоб программа НИКОГДА не выполняла данные. Для этого можно использовать безусловный переход jmp.

-----------------------------------------

CSEG segment
org 100h

Start:

mov cx,3
Label_1:
mov ah,9
mov dx,offset Msg

jmp next:

msg db 'Xe-Xe!$'

next:
int 21h
loop Label_1

int 20h
CSEG ends
end Start
-----------------------------------------

Данные и код по сути одно и тоже. И те и те хранятся как набор каких-то двоичных чисел. И если Вы пишете на Ассемблере, то Вы должны заботится о том, что и где у Вас. Вместо 'Xe-Xe!$' ассемблер просто вставит соответсвующие в таблице ASCII номера символов и процессор будет выполнять соответсвующие команды, он же не знает что это у Вас.

С наилучшими пожеланиями, Андрей Беженарь.


Подписаться на рассылки

Рассылки Subscribe.Ru
Ассемблер? Это просто! Учимся программировать
Ассемблер? Это просто! Учимся программировать (FAQ)

Задать вопрос экспертам.


Ведущий рассылки,

Калашников Олег: Assembler@Kalashnikoff.ru
ICQ No.:
68951340
URL сайта подписчиков: http://www.Kalashnikoff.ru

______________

По вопросам сотрудничества, рекламы и спонсорства обращайтесь:

  1. Публичное размещение материала из рассылки: Cooperation@Kalashnikoff.ru
  2. Реклама на сайте, в книге и рассылках: http://www.Kalashnikoff.ru/Reklama.html, Reklama@Kalashnikoff.ru
  3. Издание книги (спонсорство): Sponsor@Kalashnikoff.ru

Рассылка 'Ассемблер? Это просто! Учимся программировать (FAQ)' Рассылка 'Ассемблер? Это просто! Учимся программировать'


(C) Москва, 2001. Авторское право принадлежит Калашникову О.А. Публичное размещение материала из рассылки, а также его использование полностью или частично в коммерческих или иных подобных целях без письменного согласия автора влечет ответственность за нарушение авторских прав.

List Banner Exchange lite
Реклама на сайте Калашников.ru


http://subscribe.ru/
E-mail: ask@subscribe.ru

В избранное