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

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

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

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

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

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

Cамо задание звучит так : Заполнить экран произвольной информацией, по нажатию на 1 и 2 осуществлять скроллинг влево и вправо соответственно

вопрос такой
в какой строчке мы указываем какими символами заполнять? можно ли заполнить не произвольной информацией?



Код:
.model small,c
.data
action      db 0
msg1        db 13,10,'Press Esc to exit',13,10,'$'
 
.stack 256
.code
 
start:
    mov ax,@data        
    mov ds,ax
    mov ah,9        
    lea dx,msg1     
    int 21h         
    mov ax,351ch        
    int 21h
    mov word  ptr  cs:Old1c,BX  
    mov word  ptr  cs:Old1c+2,ES
    mov ax,251ch        
    push ds         
    push cs
    pop ds          
    mov dx,offset  New1cObrab   
    int 21h             
    pop ds          
    mov ax,3
    int 10h         
    mov ax,0b800h
    mov es,ax       
    mov ah,15       
    xor di,di       
    mov al,0        
    mov cx,2000     
l1: stosw           
    inc al          
    loop l1                 
l2: cmp action,-1       
    jz ex           
    cmp action,1        
    jz left         
    cmp action,2        
    jz right        
    jmp l2          
left:   mov bx,0        
l4: mov dx,es:[bx]      
    mov cx,79       
l3: mov ax,es:[bx+2]    
    mov es:[bx],ax      
    add bx,2        
    loop l3         
    mov es:[bx],dx      
    add bx,2        
    cmp bx,4000     
    jb l4           
    mov action,0        
    jmp l2          
right:  mov bx,0        
l14:    add bx,79*2     
    mov dx,es:[bx]      
    mov cx,79       
l13:    mov ax,es:[bx-2]    
    mov es:[bx],ax      
    sub bx,2        
    loop l13        
    mov es:[bx],dx      
    add bx,160      
    cmp bx,4000     
    jb l14      
    mov action,0        
    jmp l2          
    
    
ex: mov ax,251ch        
    lds dx,cs:old1c     
    int 21h         
    mov ax,4c00h    
    int 21h
Old1c   dd  ?      
New1cObrab  proc        
    pushf           
    call    dword   ptr CS:[Old1c]  
    cli 
    push ds         
    push ax
    mov ax,@data
    mov ds,ax       
    mov ah,1        
    int 16h         
    jz ex1c         
    mov ah,0        
    int 16h         
    cmp al,27       
    jnz nesc
    mov action,-1       
    jmp ex1c        
nesc:   cmp al,'1'      
    jb ex1c         
    cmp al,'2'                
    ja ex1c                  
    sub al,'0'      
    mov action,al       
ex1c:   pop ax      
    pop ds
    sti 
    iret            
New1cObrab endp
end start

Последний раз редактировалось Stilet; 27.05.2015 в 11:42.
arst вне форума Ответить с цитированием
Старый 29.05.2015, 07:33   #2
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

Цитата:
Сообщение от arst Посмотреть сообщение
можно ли заполнить не произвольной информацией?
..это у тебя надо спросить. И зачем ты для скроллинга обрабатываеш прерывания? Если строка произвольная, то просто перемещай последний символ в начало строки (скрол влево) или первый символ в конец строки (скрол вправо). Проще всего делать это прям в видеобуфере...
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 29.05.2015, 10:35   #3
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

При использовании видеобуфера в текстовых режимах, для хранения каждого символа отводятся по-два байта: байт с ASCII-кодом символа и байт с его атрибутом (цвет фона/текста).
По адресу B800h:0000h лежит байт с кодом символа(1), а по адресу B800h:0001h лежит атрибут этого символа; по адресу B800h:0002h лежит код символа(2), а по адресу B800h:0003h лежит его атрибут, и т.д.

Таким образом, можно вывести текст на экран простой командой пересылки данных, не прибегая к функциям DOS/BIOS. Ниже, участок кода, который выводит все ASCII-символы одноимённой таблицы (выводим произвольные данные). Скрол - попробуй организовать сам. Бери последний символ и вставляй его вначало, после чего удаляй последний символ, ..и так в цикле.

Буду выводить инфу по-центру экрана, чтоб было место для скрола влево.
Так-как каждому символу отводятся по-два байта - копирую словами.
По соглашению Интел - байты заносим в обратном порядке:

Код FASM:

Код:
use16
org 100h
jmp start

mess1  db 'Scrolling text(R)',13,10
       db '======================= $'
fPos   equ 80*25  ;-------------; константа начальной позиции символов (центр экрана)
ePos   equ fPos+512             ; длинна строки в байтах

start:
   mov  al,3    ;---------------; текстовый режим 80x25 -------------------------------|
   int  10h

   mov  dx,mess1                ; сообщение юзеру
   mov  ah,9
   int  21h

   push 0b800h  ;---------------; настраиваемся на видео/сегмент ----------------------|
   pop  es
   xor  di,di
   add  di,fPos                 ; выводим с середины экрана

   mov  cx,7Fh  ;---------------; вывод в видеобуфер 256-ти символов (словами)
   mov  ax,2F00h                ; 2 - цвет фона, F - цвет символа, 00 - первый символ
write:
   inc  al                      ; следующий символ. атрибут остаётся прежний.
   stosw                        ; пишем в ES:DI
   loop write                   ; мотаем цикл CX раз
   push di

scroll:
   xor  ax,ax   ;---------------; ждём клавишу
   int  16h
   cmp  al,27                   ; проверка на ESC
   je   exit
   cmp  al,31h                  ; проверка на '1'
   je   leftScroll
   cmp  al,32h                  ; проверка на '2'
   je   rightScroll
   jmp  scroll                  ; остальные клавиши игнорируем

leftScroll:     ;---------------; обработчик клавиши '1'   
;   ....
   jmp  scroll

rightScroll:    ;---------------; обработчик клавиши '2'
;   ....
   jmp  scroll

exit:
   popa
   ret
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите разобраться с кодом! Astiya Помощь студентам 3 29.03.2015 15:33
проблемы с кодом на С++. Компилятор коряво интерпретирует или руки не оттуда растут? Помогите разобраться, пожалуйста. OstapGr Помощь студентам 1 02.07.2014 15:25
Помогите разобраться с кодом braviatry11 Общие вопросы Delphi 3 12.06.2014 19:29
Помогите разобраться с кодом Superlotles Общие вопросы Delphi 6 19.08.2009 22:24