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

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


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

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Assembler (Ассемблер)

Выпуск № 829
от 17.08.2007, 14:05

Администратор:Калашников О.А.
В рассылке:Подписчиков: 397, Экспертов: 24
В номере:Вопросов: 5, Ответов: 8


Вопрос № 98057: Здраствуйте как сделать чтоб программа выводила сообщенич через каждые 5 мин. вот код программы :...
Вопрос № 98059: Здравствуйте, уважаемые эксперты! Никак не могу понять значение некоторых команд в процедуре Open_file главы 9 «Работа с файлами»: (01) Open_file proc (02) cmp Handle,0FFFFh (03) jne Quit_open (04) mov ax,3D00h (05) int 21h (0...
Вопрос № 98106: Здраствуйте, доспустим я сделал так: mov dl, 1 В регистр dl присвоил 1, а как потом отобразить число 1 в окне? пробовал так mytext db dl,'$' не получилось. ...
Вопрос № 98113: Здраствуйте как сделать чтоб программа запущена была до тех пор пока компьютер не выключиш и выводила сообщенич через каждые 5 мин. ЖЕлательно привести пример ПОЖАЛУЙСТА ПОМОГИТЕ ....
Вопрос № 98119: ЗДравствуйте все, у меня возник вопрос, я жду нажатия клавиши вот таким способом mov ah,00h int 16h как можно сделать так, чтобы если в течении некоторого времени клавиша не нажата,то продолжить код дальше....

Вопрос № 98.057
Здраствуйте как сделать чтоб программа выводила сообщенич через каждые 5 мин.

вот код программы :

Приложение:

Отправлен: 11.08.2007, 15:56
Вопрос задал: Василий Васильевич Сквозняков (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: Евгений Иванов
Здравствуйте, Василий Васильевич Сквозняков!

Уважаемый Василий. Для этого нужно использовать таймер. Функция SetTimer().

Затем сообщение WM_TIMER нужно принимать, обрабатывать и выполнять требуемые действия.

Успехов.

---------
Знания - сила
Ответ отправил: Евгений Иванов (статус: Профессор)
Россия, Нижний Новгород
Тел.: +79519145721
Организация: M2Media.ru
Адрес: Нижний Новгород, ул.Малая Ямская
WWW: Eugene Ivanov
ICQ: 214889076
----
Ответ отправлен: 11.08.2007, 16:00

Отвечает: LEXASOFT
Здравствуйте, Василий Васильевич Сквозняков!

!!! Ответ неверный, так сообщения не будут выводиться периодически с интервалом, как требовалось в вопросе.. Оставлен для экзаменаторов. [ Alexandre V. Tchamaev ]

Попробуйте Sleep.

Приложение:

---------
>>>Этот текст уменьшается, значит от Вас уносят монитор<<<

Ответ отправил: LEXASOFT (статус: 7-ой класс)
Ответ отправлен: 12.08.2007, 03:22


Вопрос № 98.059
Здравствуйте, уважаемые эксперты! Никак не могу понять значение некоторых команд в процедуре Open_file главы 9 «Работа с файлами»:
(01) Open_file proc
(02) cmp Handle,0FFFFh
(03) jne Quit_open
(04) mov ax,3D00h
(05) int 21h
(06) mov Handle,ax
(07) ret
(08) Quit_open:
(09) stc
(10) ret
(11) Handle dw 0FFFFh
(12) Open_file endp
1. Почему в строке (11) переменной Handle присваивается значение именно 0FFFFh? Это же размер целого сегмента (в предыдущей главе №8 переменной присваивалось значение 0). Значит, переменной можно присвоить значение и 0AAAAh, и 0BBBBBh, и др.? Кстати, в отладчике эта команда почему-то пишется как db FF, а не db FFFF.
2. Зачем нужна строка (02), в которой сравнивается Handle с присвоенным нами же значением 0FFFFh? Раз мы волевым способом присваиваем Handle нужное нам значение, значит, они всегда должны быть равны. Автор к этой строке даёт такой комментарий: «Выясняем, открыт ли файл». Но каким образом файл может быть открыт, если команда открытия mov ax,3D00h расположена ниже в строке (04)! Я вижу в этой команде только сравнение, но никак не открытие файла. В чём здесь может быть открытие файла?
3. Если Handle всегда равняется присвоенному нами значению, то строка (03) jne Quit_open, с моей точки зрения, просто неуместна, ибо нет таких случаев, когда они не совпадут. Или я что-то напутал в своём рассуждении?
4. И, последнее, в строке (09) появляется неизвестный на данный момент оператор stc. Авторские комментарии к нему: «Устанавливаем флаг переноса в 1, необходимый для подтверждения факта открытия файла (для jc)». Но ведь в 1 флаг переноса устанавливается, если произошла ошибка, т.е., когда файл не открыт! Может, наоборот, нужно установить в 0, а не в 1?
Заранее спасибо.

Приложение:

Отправлен: 11.08.2007, 16:38
Вопрос задал: Masada (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: IceWolf
Здравствуйте, Masada!
1.0) db, dw, dd-это не команды ассемблера, а директивы транслятора(masm, tasm, etc.)Что это значит?:Транслятор проходя по исходному коду переводит его строчка за строчкой в машинный код (в таком виде воспринимает его процессор) и встретив директиву <Имя> db XXh он добавляет в конечный файл байт XX, слово (2 байта) для dw,
4 байта для dd. Обозначения этих директив-сокращения от Define Byte (db), Define Word (dw), Define DWord (dd)-определить байт, слово, двойное слово. Соответственно число после директивы может быть любое, лишь бы хватило размера переменной: byte:0..255(11111111b, FFh), word 0..32768(FFFFh), dword 0..4294967295(FFFFFFFFh).

1.1) В принципе, ответ я дал выше-слово это два последовательно расположеный байта, т.е. запись dw FFFFh эквивалентна db FFh, FFh. Думаю Вам надо разобратся с системами счисления и представлением информации в компбютере, об отом написано в любом учебнике по ассемблеру.

2) В процедуре Open_file (но только в данном примере) действительно можно было бы обойтись без этой проверки, чего не скажешь про Close_file. Дело здесь вот в чём: переменная Handle используется сразу для двух целей-собственно для хранения хэндла (идентификатора открытого файла) и для проверки открыт ли файл в данный момент. В самом в Handle лежит FFFFh и к моменту выполнения Open_file это значение не может измениться, но если файл открыт удачно (корректно выполнен вызов ф-ции 3Dh int 21h) то мы туда кладём полученое из функции значение (оно не равно FFFFh), а если файл был открыт неудачно (читай-не был открыт) мы присваиваем Handle'у FFFFh-признак того , что файл не открыт и при закрытии файла мы имеем возможность проверить: если в Handle FFFFh то файл не был открыт (например неверно задано имя файла) и закрывать его, естественно не надо, если же в Handle значение отличное от FFFFh то файл был открыт и его надо закрыть и положить в Handle FFFFh т.к. мы файл закрыли. В случае с ф-цией Open_file проверка выполняется, по видимому, для того чтобы показать этот приём.

3) Нет не напутали, зачем нужна эта строка читайте выше.

4)Флаг переноса в 1 устанавливают функции 21h прерывания чтобы показать что вызов закончился неудачно-такую проверку нужно делать после вызова int 21h. Мы же используем тот же механизм при написании собственных функций-т.е. если вызов написаной нами функции окончился неудачно мы сами устанавливаем флаг переноса (это и делает команда STC, команда CLC его сбрасывает) и основная программа проверяет после вызова функции установлен ли он-если да, то функция не выполнила свою задачу. Замечу что устанавливать флаг переноса надо перед выходом из функции, а проверять сразу после её вызова т.к. многие инструкции (ADD, SUB, etc.) могут изменить его значение.

Если что-то осталось не понятным-пишите в личку, помогу.
Удачи!
---------
И да поможет вам F1, и да сохранит вас F2!
Ответ отправил: IceWolf (статус: 10-ый класс)
Ответ отправлен: 12.08.2007, 06:45
Оценка за ответ: 5
Комментарий оценки:
Поставил данную отметку, т.к. ответить на 4 вопроса - дело трудоёмкое и хлопотное. В 1-ом вопросе я сам допустил оплошность, написав, db FFFFh, а надо было dw FFFFh. Из-за чего ответивший мне IceWolf решил, что я не знаю системы счисления и дал мне развёрнутый ответ по ним, хотя вопрос был о возможности присвоении переменной определённого значения. Но это компенсировалось объяснением работы транслятора. Вдобавок ко всему IceWolf доброжелательно предложил мне написать ему в личку при возникновении неясностей, чем я непременно воспользуюсь.


Вопрос № 98.106
Здраствуйте, доспустим я сделал так: mov dl, 1
В регистр dl присвоил 1, а как потом отобразить число 1 в окне?
пробовал так mytext db dl,'$' не получилось.
Отправлен: 12.08.2007, 07:07
Вопрос задал: Memory (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Зенченко Константин Николаевич
Здравствуйте, Memory!

На экран выводятся символьное представление числа ( кода ),
к примеру:
mov ah,02h
mov dl,01h
int 21h

на экране будет "рожица"

или
mov ah,02h
mov dl,31h
int 21h

на экране будет цифра "1"

В ассемблере в отличии от языков высокого уровня, вся организация ввода-вывода ложится на плечи программиста.
Можно ошибится в одном байте ( вместо функции-09h записать другую или в выводимом тексте функции-09h забыть поставить в конце "$" ) и на экране будут "крякозяблы".
Удачи!
---------
И только наступив на грабли мы приобретаем драгоценный опыт!
Ответ отправил: Зенченко Константин Николаевич (статус: Специалист)
Ответ отправлен: 13.08.2007, 11:54


Вопрос № 98.113
Здраствуйте как сделать чтоб программа запущена была до тех пор пока компьютер не выключиш и выводила сообщенич через каждые 5 мин. ЖЕлательно привести пример ПОЖАЛУЙСТА ПОМОГИТЕ .

Приложение:

Отправлен: 12.08.2007, 09:06
Вопрос задал: Василий Васильевич Сквозняков (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 2)

Отвечает: IceWolf
Здравствуйте, Василий Васильевич Сквозняков!
В приложении программа, вызывающая MessageBox каждые пять секунд.
Удачи!

Приложение:

---------
И да поможет вам F1, и да сохранит вас F2!

Ответ отправил: IceWolf (статус: 10-ый класс)
Ответ отправлен: 16.08.2007, 04:10


Вопрос № 98.119
ЗДравствуйте все, у меня возник вопрос, я жду нажатия клавиши вот таким способом
mov ah,00h
int 16h
как можно сделать так, чтобы если в течении некоторого времени клавиша не нажата,то продолжить код дальше.
Отправлен: 12.08.2007, 10:33
Вопрос задал: Evgeni_s (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 2)

Отвечает: Евгений Иванов
Здравствуйте, Evgeni_s!

Используй задержку между проверками.

m1:
call пауза
call проверка
if () goto m1

прок пауза
{
86h функция 15h -го прерывания
}
---------
Знания - сила
Ответ отправил: Евгений Иванов (статус: Профессор)
Россия, Нижний Новгород
Тел.: +79519145721
Организация: M2Media.ru
Адрес: Нижний Новгород, ул.Малая Ямская
WWW: Eugene Ivanov
ICQ: 214889076
----
Ответ отправлен: 12.08.2007, 13:14

Отвечает: Sergijj
Здравствуйте, Evgeni_s!

В приложении выдранный кусок Сишного кода: смотрит нажата ли какая-нибудь клавиша, если нет - записывает в слово key нуль; Если да - записывает в key scan + ASCII коды.
Потом делается очищение буфера клавиатуры.

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

Обращаю Ваше внимание, что очистка буфера клавиатуры сделана на низком уровне (прямое обращение к портам) и работает полностью либо под DOS, либо без всякой ОС. WinNT и *nix эмулируют обработку привелигированных команд типа out, а также контролируют обращение к упомянутым адресам памяти.

Приложение:

---------
Стучитесь! И Вас откопают...

Ответ отправил: Sergijj (статус: 10-ый класс)
Ответ отправлен: 13.08.2007, 10:49

Отвечает: Зенченко Константин Николаевич
Здравствуйте, Evgeni_s!

Используете в цикле функции проверки ввода, если ввод состоялся - переходите на обработку ввода, если нет - продолжаете свой код.
INT 21h, АН = 0Bh — Проверить состояние клавиатуры
Ввод: АН = 0Bh
Вывод:
AL = 0, если не была нажата клавиша
AL = 0FFh, если была нажата клавиша

или
INT 16h, АН = 1, 11h, 21h — Проверка символа
Ввод: АН = 01h (83/84-key), 11h (101/102-key), 21h (122-key)
Вывод:
ZF = 1, если буфер пуст
ZF = 0, если в буфере присутствует символ, в этом случае
AL = ASCII-код символа, 0 или префикс скан-кода
АН = скан-код нажатой клавиши или расширенный ASCII-код
Символ остается в буфере клавиатуры, хотя некоторые BIOS удаляют символ из буфера при обработке функции 01h, если он соответствует расширенному ASCII-коду, отсутствующему на 84-клавишных клавиатурах
Удачи!
---------
И только наступив на грабли мы приобретаем драгоценный опыт!
Ответ отправил: Зенченко Константин Николаевич (статус: Специалист)
Ответ отправлен: 13.08.2007, 11:03


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

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

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

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

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


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


© 2001-2007, Портал RusFAQ.ru, Россия, Москва.
Авторское право: ООО "Мастер-Эксперт Про"
Email: support@rusfaq.ru, тел.: +7 (926) 535-23-31
Хостинг: "Московский хостер"
Поддержка: "Московский дизайнер"
Авторские права | Реклама на портале
Версия системы: 4.54 beta от 01.08.2007
Яндекс Rambler's Top100
RusFAQ.ru | MosHoster.ru | MosDesigner.ru | RusIRC.ru
Kalashnikoff.ru | RadioLeader.ru | RusFUCK.ru

В избранное