程序集x86如何确定当前页面是否已满 [英] Assembly x86 how to determine if current page is full

查看:74
本文介绍了程序集x86如何确定当前页面是否已满的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在按字符输出大字符串期间确定页面是否已满时出现问题.

Have problem with determining if page is full during char-per-char output large string.

我从文件打印大缓冲区,以逐个字符输出,但还想检查页面是否不完整.我的意思是,如果已满,则打印一些消息(例如:页面已满,如果要继续下一页,请按任意键.).按下键后,我从缓冲区中打印字符的另一个页面".

I print large buffer from file to output char-per-char but want also check if the page is not full. I mean, if it is full, then print some message (for ex.: Page is full, If you want to continue to next page press any key.). And after key press I print another "page" of chars from buffer.

这就像当您从UNIX中的文件中打印文本时,它会要求您继续或等待,因为您可能会读取打印的文本.

It is something like when you print text from file in unix, it will ask you to continue or wait cause you maybe read text printed.

推荐答案

刚迪尔,我在EMU8086(具有Intel语法的汇编程序8086)中为您制作了下一个代码.它通过显示字符来读取文件char.它计算每个换行符,读取24个换行符后会显示消息(页面已满,按任意键),然后继续读取文件:

Gondil, I made next code for you in EMU8086 (assembler 8086 with Intel syntax). It reads a file char by char displaying them. It counts every line break, after reading 24 line breaks it displays the message (Page full, press any key), then continues reading file :

.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).

I am using Microsoft's line break (detecting character 13 and ignoring 10), you can change it for Unix style (detecting character 10 and ignoring 13).

如果文件的某些文本行太长,则只需为行长添加另一个计数器,当它达到79个字符时,增加行"计数器.

If some text lines of the file were too long, just add another counter for the line length, when it reaches 79 characters, increase the "lines" counter.

希望它对您有帮助.

这篇关于程序集x86如何确定当前页面是否已满的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆