• Real Mode Assembly: Print Char to Screen without INT Instruction on Boot


    bootloader - Real Mode Assembly: Print Char to Screen without INT Instruction on Boot - Stack Overflow

    Asked 8 years, 8 months ago
    Viewed 3k times
     
     

    The following site "Writing Boot Sector Code" provides a sample of code that prints 'A' to the screen when the system boots. From what I have been reading don't you have to use INT opcode to get BIOS to do certain things? How does the code below, from the site referenced above work without using interrupts? What portion of code actually tells the hardware to print 'A' to the screen?

    Code in question:

    .code16
    .section .text
    .globl _start
    _start:
      mov $0xb800, %ax
      mov %ax, %ds
      movb $'A', 0
      movb $0x1e, 1
    idle:
      jmp idle 
    

    APPENDING TO ORIGINAL QUESTION

    If I use the following code does the BIOS call write to the text buffer for me? The buffer starting at address 0xb800?

       # Author: Matthew Hoggan
       # Date Created: Tuesday, Mar 6, 2012
       .code16                        # Tell assembler to work in 16 bit mode (directive)
       .section .text
       .globl _start                  # Help linker find start of program
       _start:
           movb $0x0e,     %ah        # Function to print a character to the screen                 
           movb $0x00,     %bh        # Indicate the page number
           movb $0x07,     %bl        # Text attribute
           mov  $'A',      %al        # Move data into low nibble                   
           int  $0x10                 # Video Service Request to Bios                             
       _hang:                         
           jmp  _hang                 
           .end   
    
    share  edit    flag 
    •  
      It does. Though, the buffer location really depends on the graphics chip. On monochrome adapters you'd use segment 0xb000 instead of 0xb800. – Alexey Frunze Mar 12 '12 at 6:29
       
       
       
       
       

    Direct answer to your question: The line "movb $'A', 0" effectively completes the print to the screen (and the following line, "movb $0x1e, 1" specifies what color it should be).

    Longer answer: The video hardware draws the screen based on the contents of memory. When in text mode, the video hardware starts drawing based on memory segment 0xB800. Whatever is at byte 0 defines the character to be drawn at the first text cell on the screen. The next byte defines the attributes (foreground color, background color, and blink status). This pattern repeats (char - attr - char - attr) throughout the entire screen.

    So, technically, my direct answer wasn't true. The 2 'movb' statements simply stage the letter 'A' to be printed. 'A' is not printed until the next time hardware refreshes the display based on the memory.

    share  edit    flag 
    •  
      Two questions, the hardware will refresh at its own refresh rate? Is that based on CPU cycles? If I wanted to read more up on this do you have any good references? – Matthew Hoggan Mar 11 '12 at 7:40
    •  
      Yeah, the hardware does its own thing. When I think of these text modes, I'm thinking of MS-DOS from 30 years ago. Monitors were running at 50 or 60 Hz then (PAL or NTSC, respectively). So that was 50 or 60 refreshes per second. Most video hardware allows software to poll a bit in order to learn if a vertical refresh is occurring. This is useful for preventing graphical flicker but it's not usually a huge concern for text mode. As for references, I guess the Wikipedia article for text mode would be a good start: en.wikipedia.org/wiki/Text_mode – Multimedia Mike Mar 11 '12 at 7:58
       
       
       
  • 相关阅读:
    超文本传输协议 HTTP/1.0 Hyptertext Transfer Protocol
    VB.NET中使用代表对方法异步调用
    蚂蚁解道德经(1)[转载]
    vb.net 类的属性的设置和获取问题
    VB.net入门(6):类~构造函数,事件
    什么是Ajax技术
    千里之外
    一个asp.net2005的页面文件调用CSS样式的BUG
    一个.net发送HTTP数据实体的类
    利用ASP发送和接收XML数据的处理方法
  • 原文地址:https://www.cnblogs.com/yanhuihang/p/14016360.html
Copyright © 2020-2023  润新知