Contents
  1. 1. 0x01基础知识
  2. 2. 0x02程序代码
  3. 3. 致谢

最近在学汇编,有一个实验是用16位汇编实现字符打印,记录下实验过程

0x01基础知识

输出打印,实际上就是往显存区写数据,将要显示的内容写入显存区空间

内存地址中B8000H~BFFFFH共32KB空间,为80*25彩色字符模式的显示缓冲区,向这个地址空间写入数据,写入的内容将立刻出现在显示器上

在80*25彩色字符模式下,显示器一屏可以显示25行,每行80个字符,分别存放字符的ASCII码和属性
一个字符在显示缓冲区中就要占用两个字节,一屏的内容在显示缓冲区总共占4000个字节

偏移为

000~9F 第一行

0A0~13F 第二行

140~1DF 第三行

N160~(N+1) 160-1 第N行

在显存缓冲区中,偶地址存放字符,奇地址存放字符的颜色属性

在一行中,一个字符占两个字节的存储空间(一个字),低位字节存储字符的ASCII码,高位字节存储字符的属性。一行有80个字符,占160个字节

在一行中:

00~01单元对应显示器上的第1列
02~03单元对应显示器上的第2列
04~05单元对应显示器上的第3列

一屏幕为25行,80列
在屏幕中间输出为,13行,40列,字符串长度为12,正中间输出为
(40*2)-(12)=

要写入显存的偏移地址为
160*13+68=2148=864H

B800:842H

0x02程序代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
assume cs:code
data segment
db 'Hello,World!'
db 02H
data ends

code segment;向第13行写入数据
start:mov ax,data
mov ds,ax
mov ax,0b800h
mov es,ax
mov bp,0 ;设置数据偏移变量
mov bx,864H ;设置显存偏移变量
mov cx,12 ;
s:
mov al,ds:[bp]
mov es:[bx],al;写入字符
mov al,ds:[12]
mov es:[bx+1],al;写入字符颜色
add bp,1
add bx,2
loop s
mov ax,4c00h
int 21h
code ends
end start

images

致谢

汇编语言(第3版)王爽

Contents
  1. 1. 0x01基础知识
  2. 2. 0x02程序代码
  3. 3. 致谢