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

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


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

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

Лучшие эксперты данной рассылки

Boriss
Статус: Академик
Рейтинг: 2634
∙ повысить рейтинг »
Абаянцев Юрий Леонидович aka Ayl
Статус: Профессионал
Рейтинг: 2288
∙ повысить рейтинг »
Жерар
Статус: Специалист
Рейтинг: 1986
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И СОФТ / Программирование / Assembler (Ассемблер)

Номер выпуска:1445
Дата выхода:13.05.2011, 20:00
Администратор рассылки:Лысков Игорь Витальевич (Старший модератор)
Подписчиков / экспертов:215 / 64
Вопросов / ответов:1 / 1

Вопрос № 183097: Здравствуйте! Помогите с программками на ассемблере под ОС Windows XP на TASM. 1.Програмка должна выводить любой символ на экран. 2.Прграммка при нажатии цифр выводит столько же звуков с динамика (если 1 - 1 звук, если нажать цифру 1 2 раза то ...



Вопрос № 183097:

Здравствуйте! Помогите с программками на ассемблере под ОС Windows XP на TASM.
1.Програмка должна выводить любой символ на экран.
2.Прграммка при нажатии цифр выводит столько же звуков с динамика (если 1 - 1 звук, если нажать цифру 1 2 раза то 2 раза звук ну и тд)

Сори сам я небельмеса не понимать в этом языке....
Помогите пожалуйста , с подробным описанием каждого сегмента БУДУ ОЧЕНЬ БЛАГОДАРЕН !
И если есть возможность со скринами

Отправлен: 08.05.2011, 19:44
Вопрос задал: Sasha23 (2-й класс)
Всего ответов: 1
Страница вопроса »


Отвечает Лысков Игорь Витальевич (Старший модератор) :
Здравствуйте, Sasha23!

1) Программа вывода на экран символа, введенного с клавиатуры

Код:

.model small
.code ;сегмент кода
start: ;точка входа
mov ah, 0 ;ждем код с клавиатуры
int 16h

cmp al, 1bh ;Esc ?
je finish ;да - на выход

cmp al, 0
je start ;управляющие клавиши (стрелки, F1-F12 и т.п.) игнорируем

mov dl, al ;выведем
mov ah, 2 ;используя функцию 2
int 21h ;21 прерывания ДОС
jmp start ;на повтор

finish:
mov ax, 4c00h ;выход в ДОС
int 21h

end start ;точка входа


2) Программа "пищащая" по нажатию на клавишу "1". Издаем звук час тотой 1кГц на "спикере".
Сегмент данных не используется, поэтому инициализация DS опущена
Из-за того, что программа успевает очень быстро отработать, то для того, чтобы дать возможность нажать повторно, ввел временную задержку...
(Я бы лучше сделал нажатие на "2", "3"... Было бы намного понятнее. Повторное нажатие как-то не очень...)

Код:

.model small
.code ;сегмент кода
start: ;точка входа
xor dx, dx ;счетчик нажатий на "1"
repeat: ;цикл подсчета нажатий
mov ah, 1 ;проверим, было ли нажатие
int 16h
jz cmp_count ;не было - на проверку счетчика
mov ah, 0 ;было - прочитаем
int 16h

cmp al, 1bh ;Esc ?
je finish ;да - на выход
cmp al, '1' ;не 1 игнорируем
jne repeat
inc dx ;считаем нажатия на "1"

;т.к. компьютер очень быстро успевает все отработать
;то чтобы дать возможность нажать несколько раз
;зададим небольшую паузу
mov bx, 10 ;10 раз
xor cx, cx ;по 64k
pause:
loop pause
dec bx
jnz pause
jmp repeat ;проверим, было ли еще нажатие

cmp_count: ;нажатия нет
test dx, dx ;проверим счетчик нажатий
jz repeat ;ничего не было - на ожидание нажатия

beep_loop: ;цикл beep-ов
mov al, 0b6h ;команда таймеру на ввод делителя
out 43h, al
mov ax, 1193 ;делитель = 1193180 (частота тактового генератора таймера) / 1000 (частота сигнала)
out 42h, al ;младший байт делителя
mov al, ah
out 42h, al ;старший байт делителя
in al, 61h ;прочитаем режимы таймера
mov ah, al ;сохраним
or al, 3 ;включим звук
out 61h, al ;зазвучало!

;выждем время
mov bx, 10 ;10 раз
sound_1:
xor cx, cx ;по 64к
sound:
loop sound
dec bx
jnz sound_1

mov al, ah ;выключим звук
out 61h, al ;отправив обратно сохраненные режимы

delay: ;выждем небольшую паузу
loop delay

dec dx ;цикл по числу нажатий
jnz beep_loop

jmp start ;на ожидание клавиши

finish:
mov ax, 4c00h ;выход в ДОС
int 21h

end start ;точка входа


Хм, а что Вы хотели увидеть на скинах? Первая программа очень проста, "тупо" выводит введенный символ. Вторая же работает без вывода на экран...

Обе программы создаем в формате EXE при помощи команд:
tasm name
tlink name

-----
Люби своего ближнего, как самого себя

Ответ отправил: Лысков Игорь Витальевич (Старший модератор)
Ответ отправлен: 10.05.2011, 11:43
Номер ответа: 267063
Украина, Кировоград
Тел.: +380957525051
ICQ # 234137952
Mail.ru-агент: igorlyskov@mail.ru

Оценка ответа: 5
Комментарий к оценке:
очень очень благодарен :)

Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 267063 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:


  • Оценить выпуск »
    Нам очень важно Ваше мнение об этом выпуске рассылки!

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

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров »

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.



    В избранное