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

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

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.10.2008, 21:21   #1
Rio309
Форумчанин
 
Регистрация: 06.02.2008
Сообщений: 140
По умолчанию Перемещать строки вверх-вниз, с помощью стрелок.

Вот код програмы:
Должна вводится фраза, каждое слово которой выводится в свою строку, а потом двигать стрелками все строки вверх вниз, нельзя что бы строки выходили за экран.

Код:
data SEGMENT 
st3 db 25 dup ('?'),10,13,'$' 
stroka db 64 dup ('?') 
word_counter db 0 
coord db 0 
endl db 10,13,'$' 
data ENDS 

stseg SEGMENT 
buf db 64 dup (9) 
stseg ENDS 

code SEGMENT 
assume cs:code,ds:data,ss:stseg 

readln Proc 
mov dx,offset st3 
mov ah,0Ah 
int 21h 

mov st3,10 
mov st3+1,13 

mov endl,10 
mov endl+1,13 
mov endl+2,'$' 

mov cx,25 
mov si,offset st3+2 
label1: 
cmp byte ptr[si],0dh 
jnz nashol 
mov cx,1 
nashol: inc si 
loop label1 

mov byte ptr [si-1],0Ah 
mov byte ptr [si],0Dh 
mov byte ptr [si+1],'$' 

ret 
readln ENDP 

gotoxy MACRO X,Y 
mov ah,02 
mov bh,00 
mov DH,Y 
mov DL,X 
int 10h 
ENDM 

outtext MACRO TEXT 
mov ah,09h 
lea dx,TEXT 
int 21h 
ENDM 

cls Proc 
mov ax,0600h ;ПРОКРУТКА ЭКРАНА 
mov bh,0Ah ;ЦВЕТ 
mov cx,0000 ;ОТ 0 0 
mov dx,184Fh ;ДО 24 79 
int 10h ;ВЫЗОВ ДОС 
gotoxy 90,40 
ret 
cls ENDP 

start: 
mov ax,data 
mov ds,ax 

call readln 
call cls 
gotoxy 0,0 

mov bx,2 
label_1: 
mov al,st3[bx] 
cmp st3[bx],'$' 
jz label_2 
inc bx 
jmp label_1 
label_2: 

mov cx,bx 
mov bx,2 
mov si,0 

label_3: 
cmp st3[bx],' ' 
jz label_4 
mov al,st3[bx] 
mov stroka[si],al 
jmp label_5 
label_4: 

mov stroka[si],0Dh 
inc si 
mov stroka[si],0Ah 
inc si 
mov stroka[si],0Ah 
inc si 

inc word_counter 
label_5: 
inc si 
inc bx 
loop label_3 

outtext stroka 

label_6: 
mov ah,10h 
int 16h 

cmp ah,48h ; up 
jnz not_up 

mov al,2 
mul word_counter 
sub al,3 
add al,coord 
js label_6 

dec coord 
call cls 
gotoxy 0,coord 
outtext stroka 
jmp label_6 
not_up: 

cmp ah,50h ; down 
jnz not_up_not_down 


cmp coord,23 
jns label_6 

inc coord 
call cls 
gotoxy 0,coord 
outtext stroka 

jmp label_6 

not_up_not_down: 

cmp ah,01h 
jnz label_6 

mov ah,4Ch 
int 21h 
code ENDS 
END start
Rio309 вне форума Ответить с цитированием
Старый 16.10.2008, 08:54   #2
airyashov
Форумчанин
 
Регистрация: 02.04.2008
Сообщений: 358
По умолчанию

как-то странно задан буфер ввода, но если учесть что код '?'=63, то можно считать что все нормально, но тогда почему парсите строку считая что в ней 25 символов?
еще лишние знаки вопроса вылезают, это лишний переход на символ в строке слов, когда нашли пробел
при движение не очень ясно, как ослеживаеться

замену такую сделать
удалить один
Код:
mov stroka[si],0Ah 
inc si
модифицировать
Код:
cmp ah,48h ; up 
jnz not_up 

mov al,word_counter
cmp coord,al
jb label_6
вроде больше ничего не правил, работает
неплохо пишу на ассемблере для 80х86
icq: 3(один)7748666
mail: airyashov(а)inbox.ru

Последний раз редактировалось airyashov; 16.10.2008 в 10:25.
airyashov вне форума Ответить с цитированием
Старый 16.10.2008, 17:42   #3
Rio309
Форумчанин
 
Регистрация: 06.02.2008
Сообщений: 140
По умолчанию

Хм...чет не идет...когда возвращается вверх то до конца экрана еще строки 4 остается.
И еще...Как ограничить количество вводимых строк? Я так понял, сейчас если набрать слишком много, то в конце появляются "?".

И еще нужно добавить перемещение стрелками влево/вправо, что бы ниодна буква не вышла за рамки экрана.

Цитата:
Сообщение от airyashov Посмотреть сообщение
модифицировать
Код:
cmp ah,48h ; up 
jnz not_up 

mov al,word_counter
cmp coord,al
jb label_6
Это просто дописать после
Код:
cmp ah,48h ; up 
jnz not_up
или что то еще удалить надо?

Последний раз редактировалось rpy3uH; 16.10.2008 в 19:01.
Rio309 вне форума Ответить с цитированием
Старый 17.10.2008, 11:30   #4
airyashov
Форумчанин
 
Регистрация: 02.04.2008
Сообщений: 358
По умолчанию

проще сделать напрямую через видео память, слова парсить при вводе, каждый раз считывая 1 букву, тогда и слово можно ограничить и количество слов
неплохо пишу на ассемблере для 80х86
icq: 3(один)7748666
mail: airyashov(а)inbox.ru
airyashov вне форума Ответить с цитированием
Старый 17.10.2008, 17:42   #5
Rio309
Форумчанин
 
Регистрация: 06.02.2008
Сообщений: 140
По умолчанию

А как это реализовать в коде?
Просто я в ассемблере шарю на интуитивном уровне фактически .
Rio309 вне форума Ответить с цитированием
Старый 22.10.2008, 20:15   #6
Rio309
Форумчанин
 
Регистрация: 06.02.2008
Сообщений: 140
По умолчанию

Поменял код. Теперь есть стандартная фраза. И надо двигать всеми 4мя стрелками в разные стороны.
Но есть ошибки. Помогите решить, срочно надо .
Код:
;--------------------------------------------------------
STACKS  SEGMENT PARA STACK 'Stack'
        DW      32 DUP(?)
STACKS  ENDS
;--------------------------------------------------------
DATAS   SEGMENT PARA 'Data'
FULL    DB      'ALL SYSTEMS STANDING BY...','$'
FUL1    DB      'ALL     ','$'
FUL2    DB      'SYSTEMS ','$'
FUL3    DB      'STANDING','$'
FUL4    DB      'BY...   ','$'
TEMP    DB      'DANA FRAZA:               ','$'
granica_up    db 0
granica_down  db 20
granica_left  db 0
granica_right db 8
poz_x db 5
poz_y db 5
poz   db 0
DATAS   ENDS
;--------------------------------------------------------
;----------ПЕРЕСЫЛКА КУРСОРА В ПОЗИЦИЮ XORD,YORD---------
GOTOXY  MACRO   XORD,YORD
        MOV     AH,02
        MOV     BH,00
        MOV     DH,YORD
        MOV     DL,XORD
        INT     10H
ENDM
;ВЫВОД СТРОКИ PHRASE
OUTTEXT MACRO   PHRASE
        MOV     AH,09
        LEA     DX,PHRASE
        INT     21H
ENDM
;----------ВЫВОД ВСЕХ СТРОК-----------------------------
GOCENT  MACRO

        CALL    CLEAR
        GOTOXY  poz_x,(poz_y+1)
        OUTTEXT FUL1
        inc poz
        GOTOXY  poz_x,(poz_y+1)
        OUTTEXT FUL2
        inc poz
        GOTOXY  poz_x,(poz_y+1)
        OUTTEXT FUL3
        inc poz
        GOTOXY  poz_x,(poz_y+1)
        OUTTEXT FUL4
	GOTOXY  90,40      ;ЭТО ЧТОБЫ НЕ БЫЛО КУРСОРА
ENDM
;----------ТЕЛО ПРОГРАММЫ-------------------------------
CODES   SEGMENT PARA 'Code'
BEGIN   PROC    FAR
        ASSUME  CS:CODES,DS:DATAS,SS:STACKS,ES:DATAS
        PUSH    DS
        SUB     AX,AX
        PUSH    AX
        MOV     AX,DATAS
        MOV     DS,AX
        MOV     ES,AX
        CALL    CLEAR
        gotoxy  0,0        ;В ПОЗИЦИИ 0 0
        OUTTEXT temp
        gotoxy  0,1        
        OUTTEXT FULL      
	GOTOXY  90,40      ;ЭТО ЧТОБЫ НЕ БЫЛО КУРСОРА
LOOP01:
        CALL    CHECK
        CMP     AL,0DH     ;ПРОВЕРКА НА ENTER
        JE      LOOP02
        CMP     AL,1BH     ;ПРОВЕРКА НА ESC
        JNE     LOOP01
        CALL    CLEAR
        RET
LOOP02:
        CALL    MOVE
        CALL    CLEAR
        RET
BEGIN   ENDP

MOVE    PROC    NEAR
        GOCENT
        CALL    CHECK
        CMP     AH,50H
        JE      DOWN
        CMP     AH,48H
        JE      UP
        CMP     AL,1BH
        JNE     MOVE
        RET
MOVE    ENDP
;**************************************
DOWN    PROC    NEAR
        mov bl,granica_down
        cmp bl,poz_y
        jz MOVE
        inc poz_y
        JMP     MOVE
DOWN    ENDP
;**************************************
UP      PROC    NEAR
        mov bl,granica_up
        cmp bl,poz_y
        jz MOVE
        dec poz_y
        JMP     MOVE
UP      ENDP

;**************************************
LEFT      PROC    NEAR
          mov bl,granica_left
          cmp bl,poz_x
          jz MOVE
          dec poz_x
          JMP     MOVE
LEFT      ENDP
;**************************************
RIGHT   PROC    NEAR
        mov bl,granica_right
        cmp bl,poz_x
        jz MOVE
	inc poz_y
        JMP     MOVE
RIGHT      ENDP

;----------ПРОВЕРКА НА НАЖАТИЕ КЛАВИШИ-----------------
CHECK   PROC    NEAR
        MOV     AH,00H    ;ПРОВЕРКА НА
        INT     16H       ;ФУНКЦИОНАЛЬНУЮ КЛАВИШУ
        RET
CHECK   ENDP
;----------ОЧИСТКА ЭКРАНА------------------------------
CLEAR   PROC   NEAR
        MOV    AX,0600H   ;ПРОКРУТКА ЭКРАНА
        MOV    BH,12      ;ЦВЕТ
        MOV    CX,0000    ;ОТ 0 0
        MOV    DX,184FH   ;ДО 24 79
        INT    10H        ;ВЫЗОВ ДОС
        RET
CLEAR   ENDP
;----------УСЕ ---------------------------------
CODES   ENDS
        END    BEGIN

Последний раз редактировалось Rio309; 22.10.2008 в 20:24.
Rio309 вне форума Ответить с цитированием
Старый 27.10.2008, 21:47   #7
Min
Форумчанин
 
Регистрация: 12.09.2008
Сообщений: 239
По умолчанию

нащет видеобуфера........ вот пример его использования:

Код:
mov ax,0B800h ;адрес видеобуфера
mov es,ax       ;запихнём его в es
mov al,'A'        ;символ в al
mov ah,0Eh     ;атрибут символа желтый по черному
mov bx,(строка*80+столбец)*2 ;здесь написано абстрактно. так конешно нельзя делать.
mov es:[bx],ax
очистка экрана у тебя кстати не является прокруткой.... в al то "0".... просто рисуется окно на весь экран....

я тогда программу, которую писал тебе щас переделаю (по процедурам все раскину и через видеобуфер)....
Надо бы избавиться от привычки ставить многоточие.....
Min вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
с помощью макроса скопировать значение всей строки(не одной ячейки, а нескольких) global Microsoft Office Excel 6 27.11.2008 17:43
Как с помощью Microsoft Excel написать программу, позволяющую перемещать предмет на плоскости? Vova4kA Microsoft Office Excel 10 28.05.2008 14:18
Borland C, перхват нажатий стрелок Arion Помощь студентам 3 30.04.2008 12:33
как с помощью TScrollBar перемещать содержимое TMemo вверх или вниз Sanprof Общие вопросы Delphi 3 04.03.2008 00:39
Как перемещать TShape с помощью мыши? SaCREDO Помощь студентам 1 29.03.2007 00:37