Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.05.2014, 18:59   #1
FRAZY
Новичок
Джуниор
 
Регистрация: 17.05.2014
Сообщений: 5
По умолчанию Реализовать бегущую строку по диагонали

Здравствуйте уважаемые, составил код, в котором бег. строка идет справа налево, но мне необходимо пустить ее по диагонали, как это сделать?

Код:
.model small
.stack 1000h
.data 
x1  equ 10              ;начальная координата выводимой строки
x2  equ 40              ;конечная координата выводимой строки
llen    equ x2-x1+1         ;длина строки
 
txt db llen dup(' ')        ;текст "бегущей" строки
    db 'ABC123'
    db llen-1 dup(' ')
txtl    equ $-txt           ;длина "бегущей" строки
 
movnm   equ txtl-llen+1     ;количество сдвигов "бегущей" строки
 
deltime equ 30              ;задержка (в сотых долях сек.) между сдвигами "бегущей" строки
  
.code
    mov ax,@data            ;загружаем адрес сегмента данных
    mov ds,ax
 
    mov ah,0            ;очищаем экран установкой стандартного текстового видеорежима
    mov al,3
    int 10h
 
m1: mov si,offset txt       ;загружаем адрес начала текста
    mov cx,movnm            ;загружаем количество сдвигов строки
 
m2: push cx
    
    mov dh,12           ;устаналиваем курсор в позицию начала строки
    mov dl,10
   
    call locat
 
    call tprint         ;отображаем строку
 
    call delay          ;формируем временную задержку

 
    inc si              ;переходим к следующей позиции в строке
    pop cx              ;и выполняем отображение остальной части строки в цикле
    loop m2
 
    jmp m1              ;переходим к отображению строки с начала
 
exit:   mov ah,4ch          ;завершаем программу
        int 21h


delay   proc near
    mov ah,2ch          ;получаем текущее время
    int 21h
    mov bl,dl           ;сохраняем сотые доли секунды
 
del1:   mov ah,2ch          ;получаем текущее время
    int 21h
 
    sub dl,bl           ;корректируем время (при переходе через секунду)
    jge del2
    add dl,100
 
del2:   cmp dl,deltime          ;если время не прошло, то ожидаем
    jb del1
 
    ret
delay   endp

                    ;при входе:
                    ;DH - Y-координата
                    ;DL - X-координата
locat   proc near
    mov ah,2            ;устанавливаем позицию курсора
    mov bh,0
    int 10h
 
    ret
locat   endp

                    ;при входе:
                    ;SI - начальный адрес текста
tprint  proc near
    mov ah,40h          ;выводим строку
    mov bx,1
    mov cx,llen
    mov dx,si
    int 21h
 
    ret             ;выход из подпрограммы
tprint  endp

end

________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE]
(это кнопочка на панели форматирования с решёточкой #)
Не забывайте об этом!

Модератор.

Последний раз редактировалось Serge_Bliznykov; 17.05.2014 в 19:57.
FRAZY вне форума Ответить с цитированием
Старый 18.05.2014, 08:40   #2
FRAZY
Новичок
Джуниор
 
Регистрация: 17.05.2014
Сообщений: 5
По умолчанию

Понял, что можно копированием в видеопамять или посимвольно выводить каждый раз меняя координаты, но как это написать?
FRAZY вне форума Ответить с цитированием
Старый 18.05.2014, 10:04   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

только благодаря тому, что у Вас есть написанный код, решил вспомнить былое..

вот, попробуйте такой код:
Код:
.model small
.stack 1000h
.data 
 
txt  db 'ABC123'       ;текст "бегущей" строки
txtl equ $-txt           ;длина "бегущей" строки

curPos dw 0
 
deltime equ 50              ;задержка (в сотых долях сек.) между сдвигами "бегущей" строки
  
.code
    mov ax,@data            ;загружаем адрес сегмента данных
    mov ds,ax
 
    mov ah,0            ;очищаем экран установкой стандартного текстового видеорежима
    mov al,3
    int 10h
 
    mov dh,00
    mov dl,00
m1: mov curPos, dx

    mov si,offset txt       ;загружаем адрес начала текста
    call printDiagonal

    call delay          ;формируем временную задержку

    mov dx, CurPos
    call printDiagonalEmpty

 
    mov dx,CurPos
    inc dl
    inc dh
    mov CurPos, dx
    cmp dh, 23-txtl
    jle m1  

exit:   mov ah,4ch          ;завершаем программу
        int 21h


delay   proc near
    push si
    mov ah,2ch          ;получаем текущее время
    int 21h
    mov bl,dl           ;сохраняем сотые доли секунды
 
del1:   mov ah,2ch          ;получаем текущее время
    int 21h
 
    sub dl,bl           ;корректируем время (при переходе через секунду)
    jge del2
    add dl,100
 
del2:   cmp dl,deltime          ;если время не прошло, то ожидаем
    jb del1

    pop si 
    ret
delay   endp

                    ;при входе:
                    ;DH - Y-координата
                    ;DL - X-координата
locat   proc near
    mov ah,2            ;устанавливаем позицию курсора
    mov bh,0
    int 10h
 
    ret
locat   endp


printDiagonal proc near
   mov cx, txtl

@pd1:   push cx
   push dx
   call locat
   
   mov ah, 02h
   mov dl,byte ptr ds:si
   int 21h

   inc si
   pop dx   
   inc dh
   inc dl

   pop cx
   loop @pd1

   ret
printDiagonal endp


printDiagonalEmpty proc near
   mov cx, txtl

@pde1:   push cx
   push dx
   call locat
   
   mov ah, 02h
   mov dl,' '
   int 21h

   inc si
   pop dx   
   inc dh
   inc dl

   pop cx
   loop @pde1

   ret
printDiagonalEmpty endp
   
end


знаю, что код не очень оптимальный и красивый, я ставил себе задачу, чтобы просто хоть как-то заработало...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 18.05.2014, 10:20   #4
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,405
По умолчанию

в граф. режиме (копированием в видеопамять):

Код:
.model small
.stack 1000h
.data 

txtGR DB 'A',3h,'B',3h,'C',3h,'1',3h,'2',3h,'3',3h, 0h, 0h
txtGRl   equ $-txtGR
 
deltime equ 30              ;задержка (в сотых долях сек.) между сдвигами "бегущей" строки
counter	dw 3
  
.code
mov ax,@data            ;загружаем адрес сегмента данных
mov ds,ax

mov	ah, 0fh
int	10h
push	ax

mov ax,0003h
int 10h

mov ax,0B800h
mov es,ax
mov di,162*10

next_i:
push di
mov si,offset txtGR
mov cx, txtGRl
next_copy:
mov ax, [si]
mov [es:di], ax
add di, 162
cmp di, 162*24
jle next_copy2
mov di, 0
next_copy2:
add si, 2
loop next_copy

call delay          ;формируем временную задержку
pop di
sub di, 162
jnl next_copy3
mov di, 162*24
dec [counter]
jz finish
next_copy3:
jmp next_i
finish:

mov ah,01h
int 21h 
exit:
pop	ax
mov	ah, 00h
int	10h
mov ax,4C00h          ;завершаем программу
int 21h


delay   proc near
    mov ah,2ch          ;получаем текущее время
    int 21h
    mov bl,dl           ;сохраняем сотые доли секунды
 
del1:   mov ah,2ch          ;получаем текущее время
    int 21h
 
    sub dl,bl           ;корректируем время (при переходе через секунду)
    jge del2
    add dl,100
 
del2:   cmp dl,deltime          ;если время не прошло, то ожидаем
    jb del1
 
    ret
delay   endp

end
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru
Ulex вне форума Ответить с цитированием
Старый 18.05.2014, 11:05   #5
FRAZY
Новичок
Джуниор
 
Регистрация: 17.05.2014
Сообщений: 5
По умолчанию

Serge_Bliznykov, Спасибо за отклик, я попробовал, получилась строка не бегущая, она выводится из левого верхнего угла и почти доходит до нижней границы и программа закрывается(
FRAZY вне форума Ответить с цитированием
Старый 18.05.2014, 12:16   #6
FRAZY
Новичок
Джуниор
 
Регистрация: 17.05.2014
Сообщений: 5
По умолчанию

Ulex, спасибо, подскажите как в вашем коде убрать квадратики, следующие за ABC123?
FRAZY вне форума Ответить с цитированием
Старый 18.05.2014, 14:20   #7
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,405
По умолчанию

Странно. Под DOS_BOX нет квадратиков.
Хотя нет, не странно, мой косяк
в 30-ой строчке должно быть
Код:
mov cx, txtGRl/2
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru
Ulex вне форума Ответить с цитированием
Старый 18.05.2014, 15:53   #8
FRAZY
Новичок
Джуниор
 
Регистрация: 17.05.2014
Сообщений: 5
По умолчанию

ULEX, спасибо вам огромное, очень помогли, вы настоящий профи)
FRAZY вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Реализовать переход на новую строку в RegExpr при парсинге... FleXik Общие вопросы Delphi 1 24.02.2014 01:49
в ShellComboBox - реализовать адресную строку, полный путь до папки, как в обычном окошке Windows seobot Общие вопросы Delphi 3 27.04.2010 23:27
Создать бегущую картинку Book Microsoft Office Excel 3 28.03.2010 15:31
сделать бегущую строку диодов, используя PIC16F877 buba3230 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 05.06.2009 17:59
Матрицы.переставить строку с максимальным элементом на главной диагонали со строкой с заданным номмером м microlab Помощь студентам 3 07.11.2008 09:49