Вопрос № 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 мин.
Отвечает: Евгений Иванов
Здравствуйте, Василий Васильевич Сквозняков!
Уважаемый Василий. Для этого нужно использовать таймер. Функция 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 забыть поставить в конце "$" ) и на экране будут "крякозяблы".
Удачи!
--------- И только наступив на грабли мы приобретаем драгоценный опыт!
Здраствуйте как сделать чтоб программа запущена была до тех пор пока компьютер не выключиш и выводила сообщенич через каждые 5 мин. ЖЕлательно привести пример ПОЖАЛУЙСТА ПОМОГИТЕ .
Отвечает: 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-клавишных клавиатурах
Удачи!
--------- И только наступив на грабли мы приобретаем драгоценный опыт!