学汇编快一个礼拜了,终于可以在显示器上看到编写出来的算法的效果了~~
这个对80*25 彩色字符模式下显示字符串的算法参考了网上的资料,是目前写的比较一个比较完整的算法。
代码如下:
assume cs:code,ds:data,ss:stack

data segment
db
'
welcome to masm!
'
;定义要显示的字符串(共16字节)
db 12h,24h,71h ;定义三种颜色属性
data ends

stack segment
dw
8
dup(
0
) ;定义栈,存储循环中需要保存的数据
stack ends

code segment

start:

mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
mov sp,10h
mov bx,
0
mov di,
0
mov ax,0b872h ;算出屏幕第12行中间的显存的段起始位置放入ax中

mov cx,
3
;外循环为3次,因为要显示三个字符串
s3: push cx ;三个进栈操作为外循环s3保存相关寄存器的值
push ax ;以防止它们的值在内循环中被破坏
push di
mov es,ax ;此时es为屏幕第12行中间的显存的段起始位置
mov si,
0
mov di,
0

mov cx,10h ;内循环为10h次,因为一个字符串中含10h个字节
s1: mov al,ds:[bx
+
si]
mov es:[bx
+
di],al
inc si
add di,
2

loop s1 ;此循环实现偶地址中存放字符

mov si,
1
;si的值设为1,从而为在显存奇地址中存放字符的颜色属性做准备
pop di ;将di的值恢复成进入内循环之前的时候的值
mov al,ds:[bx
+
di
+
10h] ;取颜色属性[源OP寻址方式:相对基址变址]


mov cx,10h ;第二个内循环也为10h次

s2: mov es:[bx
+
si],al
add si,
2

loop s2

inc di
pop ax
add ax,0ah ;将显存的段起始地址设为当前行的下一行
pop cx

loop s3

mov ax,4c00h
int
21h

code ends

end start

























