2015-03-23 3 views
0

У вас возникли проблемы с определением, заполняется ли страница во время ввода строки char-per-char.Сборка x86 как определить, заполнена ли текущая страница

Я печатаю большой буфер из файла для вывода char-per-char, но хочу также проверить, не переполнена ли страница. Я имею в виду, если он заполнен, напечатайте какое-то сообщение (например, страница заполнена, если вы хотите перейти на следующую страницу, нажмите любую клавишу.). И после нажатия клавиши я печатаю еще одну «страницу» символов из буфера.

Это что-то вроде, когда вы печатаете текст из файла в unix, он попросит вас продолжить или ждать, потому что вы, возможно, читаете текст, напечатанный.

+0

Если вы говорите о выходе в окно консоли, то это обычно обрабатывается командной оболочкой. Например, в Windows вы можете вывести стандартный вывод на 'more', выполнив что-то вроде MyApplication | more' в командной строке. Однако, если вы хотите запросить продолжение самостоятельно, вам нечего останавливать на подсчете символов при их печати, а затем отображать приглашение, когда выводится определенное количество символов или строк. –

ответ

1

Gondil, я сделал следующий код для вас в EMU8086 (ассемблер 8086 с синтаксисом Intel). Он читает символ файла, отображающий их. Он считает каждую разрыв строки, после прочтения 24 Разрывы строк он отображает сообщение (Страница полностью, нажмите любую клавишу), затем продолжает чтение файла:

.stack 100h 
.data 
filename db 'myfile.txt',0 ;NOTICE DE ZERO AT THE END. 
filehandler dw ?   
msj   db 'Page full. Press any key to continue...',13,10,'$' 
mychar  db ' $' ;CHAR FROM FILE. DOLLAR SIGN TO DISPLAY IT. 
lines  db 0 ;COUNTER FOR LINES DISPLAYED. 
.code   
;INITILIZE DATA SEGMENT. 
    mov ax,@data 
    mov ds,ax 

    call clear_screen 

;OPEN FILE. 
    mov ah, 3dh ;SERVICE TO OPEN FILE. 
    mov al, 0 ;MODE READ ONLY. 
    mov dx, offset filename 
    int 21h 
    mov filehandler, ax 

;DISPLAY FILE'S CHARACTERS STOPPING ON EVERY FULL PAGE. 
repeat: 
    ;READ ONE CHAR. 
    mov ah, 3fh ;SERVICE TO READ FROM FILE. 
    mov bx, filehandler 
    mov cx, 1 ;HOW MANY BYTES TO READ. 
    mov dx, offset mychar ;VARIABLE TO STORE THE READ BYTE. 
    int 21h ;AX RETURNS WITH HOW MANY BYTES WHERE READ. 
    ;CHECK EOF (END OF FILE). 
    cmp ax, 0 
    je eof 
    ;DISPLAY CHAR. 
    mov ah, 9 
    mov dx, offset mychar 
    int 21h 
    ;FIND OUT IF CHAR IS LINE BREAK.  
    cmp mychar, 13 
    je linebreak 
    cmp mychar, 10 ;IGNORE. 
    je notlinebreak 
    jmp notlinebreak 
linebreak:    
    inc lines 
notlinebreak: 
    ;FIND OUT IF PAGE IS FULL. 
    cmp lines, 24 
    je pagefull 
    jmp notfull 
pagefull:        
    call page_is_full 
    mov lines, 0 ;COUNTER RESTARTS. 
notfull:  
    jmp repeat ;REPEAT PROCESS FOR NEXT CHARACTER. 
eof: 
;CLOSE FILE. 
    mov ah, 3eh ;SERVICE TO CLOSE FILE. 
    mov bx, filehandler 
    int 21h 

;FINISH PROGRAM PROPERLY. 
    mov ax,4c00h 
    int 21h   
;============================================================== 
;DISPLAY MESSAGE OF FULL PAGE AND WAIT FOR KEY. 
proc page_is_full 
;DISPLAY MESSAGE. 
    mov ah, 9 
    mov dx, offset msj 
    int 21h 
;STOP UNTIL USER PRESSES ANY KEY.  
    mov ah, 7 
    int 21h  
    ret 
endp 
;-------------------------------------------------------------- 
proc clear_screen 
    mov ah,0 ;SERVICE TO SET SCREEN MODE. 
    mov al,3 ;MODES 0..7 ARE TEXT SCREEN. 
    int 10H ;BIOS SCREEN SERVICES. 
    ret 
endp 

Я использую разрыв строки Microsoft (обнаруживая характер 13 и игнорирование 10) , вы можете изменить его для стиля Unix (детектирование символа 10 и игнорирование 13).

Если некоторые текстовые строки файла были слишком длинными, просто добавьте еще один счетчик для длины строки, когда он достигнет 79 символов, увеличьте счетчик «строк».

Надеюсь, это поможет вам.

+0

Спасибо за вашу работу, вы могли бы просто написать, что я должен считать строки, а затем печатать текст. Я думал об этом решении еще немного, но я также подумал, что есть более простое и более общее решение. Я не знаю, но есть ли шанс иметь большее окно, поэтому 24 строки не являются цельной страницей? – Gondil

+0

Единственный способ узнать, когда страница заполнена, - это знать, сколько строк на экране. Чтобы управлять этим, вместо использования числа «24» используйте переменную (т. Е. Screen_rows), а затем назначьте ей размер экрана. –

+0

yes Я, вероятно, буду использовать функцию 03h int 10h для чтения позиции курсора, а затем сохраните ее в переменных строках, как вы используете в своем коде, и чем обрабатываете цикл. Оу, это не решает проблемы. Где я могу получить размер страницы строки? Я вижу только столбцы на строку в функции 0Fh int 10h .. Спасибо. – Gondil