Output Char to Screen

Output Char to Screen

eryar@163.com

1.Introduction

与CPU相连的各种硬件,如内存条RAM,显卡,网卡等,CPU在控制它们的时候,把它们都当作内存对待。把它们总的看作一个由若干存储单元组成的逻辑存储器,这个逻辑存储器就是我们所说的内存地址空间。如8086CPU的内存地址空间的地址段分配如下:

Figure 1. 8086CPU内存地址空间分配

由上图可知,从址00000H~9FFFFH的内存单元中读取数据,实际上就是读取主随机存储器中的数据;向地址A0000H~BFFFFH的内存单元中写数据,就是向显存中写入数据,这些数据会被显示卡输出到显示器上。

2. Output Char in Debug

通过Debug程序的E命令可以修改内存中的数据。根据上述显存地址,通过Debug的E命令向显存中写入数据,看看会有什么情况发生?

Figure 2. Modify memory in Debug

由上图可知,在控制窗口的上面输出了彩色的字母。这是因为在8086CPU中,内存地址空间B8000H~BFFFFH共32KB的空间为80X25彩色字符模式的显示缓冲区。向这个地址空间写入数据,写入的内容将立即出现在显示器上。

在80X25彩色字符模式下,显示器可以显示25行,每行80个字符,每个字符可以有256种属性(背景色、前景色、闪烁、高亮等组合属性)。这样一个字符在显示缓冲区中就要占两个字节,分别存放字符的ASCII码和属性。80X25模式下,一屏内容在显示缓冲区中共占4000个字节。在一行中,一个字符占两个字节的存储空间(一个字),低位字节存储字符的ASCII码,高位字节存储字符的属性。一行共有80个字符,占160字节。

关于文字颜色的属性可以参考王爽的《汇编语言》。

Figure 3. ASCII code

如果要输出WELCOME,则可以在Debug中输入如下命令:

Figure 4. Output WELCOME

3. Output Char by ASM

如果要编写汇编程程序来输出一段字符到屏幕的话,只涉及到向B8000H内存中写入数据。怎么向指定的内存中写入数据呢?

CPU要读写一个内存单元的时候,必须先给出这个内存单元的地址,在8086CPU中,内存地址由段地址和偏移地址组成。8086CPU中有一个DS寄存器通用来存放要访问数据的段地址。但是8086CPU不支持将数据直接送入段寄存器的操作,所以mov ds,1000h这条指令是非法的。那么如何将数据送入段寄存器呢?只好用一个寄存器来进行中转,如mov ax,1000h, mov ds,ax

Debug程序和汇编译程序MASM对指令的处理还有不同。我们在Debug中写过这种指令:

mov ax,[0] 表示将ds:0处的数据送入寄存器AX中。但是在汇编程序MASM中,指令被编译器当作mov ax,0。注意上述的一些事项,就可以编写一个汇编程序,来输出WELCOME TO ASM!到屏幕了。程序代码如下所示:

 

assume cs:codeseg

codeseg segment

    mov bx,0b800h
    mov ds,bx
    
    mov ds:[00],0257h
    mov ds:[02],0245h
    mov ds:[04],034ch
    mov ds:[06],0443h
    mov ds:[08],054fh
    mov ds:[10],064dh
    mov ds:[12],0745h
    
    mov ds:[14],0220h
    
    mov ds:[16],0854h
    mov ds:[18],094fh
    
    mov ds:[20],0220h
    
    mov ds:[22],1241h
    mov ds:[24],1353h
    mov ds:[26],144dh
    
    mov ds:[28],1521h
    
    mov ax,4c00h
    int 21h
codeseg ends

end

编译连接后,运行程序输出如下图所示:

Figure 5. Output Welcome to ASM!

指令mov ax,[bx]中,内存单元的偏移地址由bx给出,而段地址默认在DS寄存器中。我们可以在访问内存单元的指令中显式地给出内存单元的段地址所在的段寄存器。如mov ax,ds:[bx]。如上述的代码中用到mov ds:[00],0257h。这些出现在内存单元的指令中,用于显式地指明内存单元的段地址的ds:, cs:, ss:, es:,在汇编语言中称为段前缀。

综上所述,如果想实现下C语言中的printf()函数,要考虑的事情还是很多的。

时间: 2024-10-29 11:03:30

Output Char to Screen的相关文章

Devstack — screen 调试工具的使用

目录 目录 为什么要使用 screen 工具 启动 screen screen 的切换常用 退出和重新连接 screen Restart Openstack Services screen 指令选项总览 Openstack 重启指令 glance-api glance-registry nova-api nova-conduter nova-crt nova-network nova-scheduter nova-novnc nova-cauth nova-cpu c-api c-sch c-v

TinyXml Documentation

TinyXml TinyXml is a simple, small, C++ XML parser that can be easily integrating into other programs. What it does. In brief, TinyXml parses an XML document, and builds from that a Document Object Model (DOM) that can be read, modified, and saved. X

C语言库函数大全及应用实例十二

原文:C语言库函数大全及应用实例十二                                          [编程资料]C语言库函数大全及应用实例十二 函数名: setrgbpalette 功 能: 定义IBM8514图形卡的颜色 用 法: void far setrgbpalette(int colornum, int red, int green, int blue); 程序例: <?xml:namespace prefix="o" ns="urn:sc

工单更改历史记录

一.自定义表结构 二.生产工单出口增强 三.查询报表 一.自定义表结构 表ZPCO02 MANDT MANDT CLNT 3 0 客户端 AUFNR AUFNR CHAR 12 0 订单号 MATNR MATNR CHAR 18 0 物料号 FILED FIELDNAME CHAR 30 0 字段名 AENAM AENAM CHAR 12 0 对象更改人员的名称 LAEDA LAEDA DATS 8 0 上次更改的日期 TCODE TCODE CHAR 20 0 事务代码CHNID CDCHNG

轻型数据库SQLite结合PHP的开发

数据|数据库 SQLite是一款轻型的数据库,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了.它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如Tcl.PHP.Java等,还有ODBC接口,同样比起Mysql.PostgreSQL这两款开源世界著名的数据库管理系统来讲,它的处理速度比他们都快. SQLite虽然很小巧,但是支持的SQL语句不会逊色于其他开源数据库,它

汇编源码系列之dskwatch

这个都是过去DOS时代的汇编源码,虽然已经过去了,但是对于学习汇编还是有帮助的,汇编语言只是程序员一门基础语言,大多人掌握即可,不一定要深入研究....... ; By Steve Holzner (from June 11, 1985 issue of PC Magazine)interrupts segment at 0h ; This is where the disk interrupt org 13h*4 ; holds the address of its service routi

第十八章-Delphi客户服务器应用开发(四)(3)

18.4.2.4 存储过程编程 存储过程也是SQL服务器上的一段程序,它接收输入参数,在服务器端执行,并将结果返回客户端,存储过程是必须在客户应用程序中显式调用的. 对于数据库表中大量记录的统计和函数计算,存储过程是很有用,这样可以将重复性计算任务转换到服务器,提高数据库应用的性能. Delphi中有两个部件能操作远程数据库服务器上的存储过程:TQuery和TStoredProc. 1. TQuery的存储过程编程 CSDEMO中演示用TQuery调用存储过程的窗体是TFrmQueryProc.

SQLite数据库操作实践

 SQLite数据库操作实践 SQLite存储类型 null - 空值  integer - 有符号整数,自增列定义 id integer primary key autoincrement real - 浮点数,存储为8-byte IEEE浮点数  text - 文本字符串 使用数据库编码(UTF-8, UTF-16BE 或 UTF-16LE)进行存储 blob - 二进制数据,如图片.声音等等  也可以接受其它数据类型例如datetime,varchar,nvarchar,decimal,f

JavaScript中的闭包介绍

 这篇文章主要介绍了JavaScript中的闭包介绍,本文讲解了Javacript 闭包.Javscript 闭包与this.Javscript 闭包与读写变量等内容,需要的朋友可以参考下     所谓的闭包应该是指: 内部函数读取当前函数以外的变量,即创建时所处的上下文环境. 代码如下: function hello(){ var char = "hello,world"; function print(){ console.log(char); }; return print();