0%

《汇编语言》(第四版) 实验 9

《汇编语言(第四版)》 . 王爽著 . 清华大学出版社 . 2019

实验 9 根据材料编程


编写程序的思路并不难,但是一定要计算清楚

首先根据规则,将属性字节写出来
黑底绿色:0 000 0 01002H
绿底红色:0 010 0 10024H
白底蓝色:0 111 0 00171H

显示器为 25 行乘 80 列的规格,算出显示在屏幕中间的情况
黑底绿色在 12 行
绿底红色在 13 行
白底蓝色在 14 行
整体都应位于第 33 列至第 48 列之间
一行共有 80 个字符,占 160 个字节,即 0AH 个字节
那么第 12 行第 1 个字节的偏移应为 6E0H
第 33 列的偏移为 40H

先将要显示的字符的 ASCII 码与其属性字节合并为一个字,倒序压入栈中,全部压入后再弹出至显示缓冲区,栈的大小为 48 个字即 96 个字节


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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
assume cs:code,ds:data,ss:stack

data segment
db 'welcome to masm!'
db 01110001b,00100100b,00000010b
;白底蓝字,绿底红字,黑底绿字
data ends

stack segment
dw 48 dup (0) ;将要显示的字符先倒序压入栈中
;16*3=48 个字
stack ends

code segment

start: mov ax,data ;ds 存放 data 段地址
mov ds,ax
mov ax,stack ;设置栈空间
mov ss,ax
mov sp,60h ;60h 即 96 个字节 = 48 个字 * 2 字节/字

mov cx,3
mov si,0

s1: mov dx,cx ;用 dx 暂存外层循环的 cx
mov bx,16
mov cx,16 ;设置内层循环的 cx

s2: dec bx ;倒序取字符
mov al,ds:[bx]
mov ah,ds:[si].10h ;将每个字符的 ASCII 码和属性合并,压入栈中
push ax
loop s2

inc si
mov cx,dx ;恢复外层循环的 cx
loop s1

mov ax,0b800h ;显示缓冲区的段地址
mov ds,ax

mov cx,3
mov si,6e0h ;第 12 行第 1 个字节的地址偏移

s3: mov dx,cx ;用 dx 暂存外层循环的 cx
mov cx,16 ;设置内层循环的 cx
mov bx,0

s4: pop ds:[bx].40h[si] ;偏移 64 个字节,使得显示的字符在显示器中央
add bx,2 ;每次填 2 个字节
loop s4

add si,0a0h ;一行共 80 个字符,160 个字节
mov cx,dx ;恢复外层循环的 cx
loop s3

mov ax,4c00h
int 21h

code ends

end start
用 Debug 跟踪程序运行


汇编语言实验合集

汇编语言实验合集

实验 1 查看 CPU 和内存,用机器指令和汇编指令编程
实验 2 用机器指令和汇编指令编程
实验 3 编程、编译、连接、跟踪
实验 4 [bx] 和 loop 的使用
实验 5 编写、调试具有多个段的程序
实验 6 实践课程中的程序
实验 7 寻址方式在结构化数据访问中的应用
实验 8 分析一个奇怪的程序
实验 9 根据材料编程
实验 10 编写子程序
课程设计 1
实验 11 编写子程序
实验 12 编写 0 号中断的处理程序
实验 13 编写、应用中断例程
实验 14 访问 CMOS RAM
实验 15 安装新的 int9 中断例程
实验 16 编写包含多个功能子程序的中断例程
实验 17 编写包含多个功能子程序的中断例程
课程设计 2