Посл.ответ |
Сообщение |
Ранг: 4.0 (гость) Активность: 0=0 Статус: Участник
|
Создано: 20 января 2007 12:09 · Личное сообщение · #1
Я увлекаюсь программированием на ассемблере и нахожусь в начале пути, но так как я в нем немного соображаю, то помогаю друзьям в ВУЗах с задачами. И вот меня попросили решить такую задачу:
Вывести несколько строк произвольного текста, содержащие лишь латинские буквы. Каждые 10 секунд заглавные буквы сменяются строчны-ми и т. д.
А я даже незнаю как к ней подойти... Какое прерывание таймера и т.д. Буду рад любой помощи, заранее спасибо.
| Сообщение посчитали полезным: |
|
Ранг: 4.0 (гость) Активность: 0=0 Статус: Участник
|
Создано: 20 января 2007 12:13 · Личное сообщение · #2
Кстате, компилятор ТАСМ.
| Сообщение посчитали полезным: |
Ранг: 48.3 (посетитель) Активность: 0.02↘0 Статус: Участник
|
Создано: 20 января 2007 12:17 · Личное сообщение · #3
http://www.wasm.ru/forum/viewtopic.php?id=18494 http://www.wasm.ru/forum/viewtopic.php?id=18494
| Сообщение посчитали полезным: |
Ранг: 4.0 (гость) Активность: 0=0 Статус: Участник
|
Создано: 20 января 2007 12:18 · Личное сообщение · #4
Stiver
 Хы=) Он меня опередил  Но я так пробежался глазами, вроде бы ему некто не ответил?
| Сообщение посчитали полезным: |
Ранг: 24.5 (новичок) Активность: 0.06↘0 Статус: Участник
|
Создано: 20 января 2007 12:23 · Личное сообщение · #5
Red_bit Это тебе он дал пример тго... Что нужно прочитать летературу нодходящюю.. А так просто врятле даже при такой простой задаче поможет ктотог...
| Сообщение посчитали полезным: |
Ранг: 21.9 (новичок) Активность: 0.02↘0 Статус: Участник
|
Создано: 20 января 2007 12:33 · Личное сообщение · #6
Во-первых есть такая замечательная штука как Tech HELP 6.0 (размер порядка 1 метра, в аттач не лезет) в ней все ОЧЕНЬ подробно по всем прерываниям расписано, во-вторых прерывание таймера 1Ch (примерно каждые 55 мс возникает, т.е. примерно 18 раз на 1 сек.).
А вообще несложная программа, действуй (:
| Сообщение посчитали полезным: |
Ранг: 260.2 (наставник) Активность: 0.19↘0 Статус: Участник
|
Создано: 20 января 2007 13:05 · Личное сообщение · #7
Red_bit пишет:
Каждые 10 секунд заглавные буквы сменяются строчны-ми и т. д.
SetTimer...KillTimer.
| Сообщение посчитали полезным: |
 Ранг: 155.4 (ветеран) Активность: 0.14↘0 Статус: Участник Робо-Алкаш
|
Создано: 20 января 2007 15:26 · Личное сообщение · #8
ыгы в ТАСМ  не в ТАСМ32
----- Researcher | Сообщение посчитали полезным: |
Ранг: 74.4 (постоянный) Активность: 0.05↘0 Статус: Участник
|
Создано: 20 января 2007 15:42 · Личное сообщение · #9
Матчасть:
1)В сегменте данных обявляеш строку с произвольным текстом, с нижней или верхней раскладкой.
2) Выводиш эту строку на экран
3) Добавляеш к каждому байту строки константу 20h (если нижний регистр)
4) устнавливаеш таймер (реализация любая)
5) Выводиш строку верхнего регистра на экран
6) Отнимаеш от каждого байта 20h
7) Выводиш строку на экран
и.т.д. В цыкле до пенсии
| Сообщение посчитали полезным: |
Ранг: 21.9 (новичок) Активность: 0.02↘0 Статус: Участник
|
Создано: 20 января 2007 16:24 · Поправил: KpeHDeJIb · Личное сообщение · #10
А чоу, я решение сел и накропал, правда под винду работать не будет, потмоу что используется int 15h, просто не будет 10 секундного ожидания, в общем вот код:
; модель памяти у нас будет small
.model small
; сегмент данных
.data
; три строки
; ВНИМАНИЕ: обязательно кончаются символом '$'
str1 db "AaAaAa",'$'
str2 db "BbBbBb",'$'
str3 db "CcCcCc",'$'
; стандартный размер стека
.stack 100h
; сегмент кода
.code
main proc
; инициализация сегмента данных
push @data
pop ds
; пошел код (:
main_loop:
; вывод строк
call print_strings
call invert_strings
; задержка в 10 сек
; под винды не канает (:
mov cx, 0098h
mov dx, 9680h
mov ah, 86h
int 15h
jmp main_loop
; мы до сюда не дойдем конечно, а вдруг...
; завершение работы DOS-программы
mov ax,4c00h
int 21h
main endp
; print_strings - вывод на экран наших строк
print_strings proc
; будем соблюдать хорошие манеры (:
push ax
push bx
push dx
; установка позиции курсора в (0,0)
mov bh, 00h
mov ah, 02h
xor dx, dx
int 10h
; вывод первой строки
mov dx, offset str1
mov ah, 09h
int 21h
; установка позиции курсора в (1,0)
mov ah, 02h
xor dx, dx
mov dh, 01h
int 10h
; вывод второй строки
mov dx, offset str2
mov ah, 09h
int 21h
; установка позиции курсора в (2,0)
mov ah, 02h
xor dx, dx
mov dh, 02h
int 10h
; вывод третьей строки
mov dx, offset str3
mov ah, 09h
int 21h
; вернем все как было
pop dx
pop bx
pop ax
; выходим
ret
print_strings endp
; invert_strings - функция инвертирует наши строки
invert_strings proc
push si
lea si, str1
call invert_string
lea si, str2
call invert_string
lea si, str3
call invert_string
pop si
ret
invert_strings endp
; invert_string - функция инвертирует регистр строки
; вход: si - адрес строки
invert_string proc
push dx
ibegin:
mov dl, byte ptr [si]
; если равно '$' - конец строки
cmp dl, 24h ; '$'
je iexit
; если меньше 'A'
cmp dl, 40h ; 'A'
jle inext
; если больше 'z'
cmp dl, 7Bh ; 'z'
jge inext
; если меньше 'Z' - верзний регистр
cmp dl, 5Ah ; 'Z'
jle iupcase
; если больше 'a' - нижний регистр
cmp dl, 61h ; 'a'
jge ilocase
jmp inext
iupcase:
; сделаем нижний регистр
add dl, 20h
jmp inext
ilocase:
; сделаем верхний регистр
sub dl, 20h
jmp inext
inext:
mov [si], byte ptr dl
inc si
jmp ibegin
iexit:
pop dx
ret
invert_string endp
end main
зы: Простите что без аттача, но может кто умный еще глянет так код, чтобы не качать лишний раз и поправит меня если я где-то не прав...
| Сообщение посчитали полезным: |