;2*Column + 16*2 = 160 ==》Column = 64
;在下列示例中,BX代表从11行开始的首列,所以他的初始值是11*160=1760,即12行的首地址
;对于显示屏要写的中间的内存地址用[BX].idata来表示,显然idata的初始值是64
;处理的过程大致如下:
; R=第12行的地址
; mov cx,3 //这个字符串要显示三次
;s: C=第一个要修改的列
; mov cx,16 //共16个字符
;s0: 改变R行,64+C列的字节为字符串的第一个字符,64+1+C为
; 字符的属性。因为不同行有不同的显示,所以使用了jcxz 来判定
; 现在是第几次显示.
; loop s0
; R = 下一行的地址即是R + 160
; loop s
assume cs:code
datasg segment
db 'welcome to masm!'
datasg ends
stacksg segment
db 16 dup(0)
stacksg ends
code segment
j1: mov al,00100100B ;绿底红字
jmp j0
j2: mov al,01110001B ;白底蓝字
jmp j0
start:
mov ax,stacksg
mov ss,ax
mov sp,16
mov ax,datasg
mov ds,ax
mov ax,0B800H
mov es,ax
mov cx,3
mov bx,1760
mov di,0
;控制文字显示位置: BX and [bx].0
s: push cx
mov di,cx
mov si,0
mov cx,16
push bx
s0:
mov al,[si]
mov es:[bx].64,al
inc bx
mov al,00000010B ;绿色
push cx
mov cx,di
dec cx
jcxz j2
dec cx
jcxz j1
j0: pop cx
mov es:[bx].64,al
inc bx
inc si
loop s0
pop bx
pop cx
add bx,160
loop s
mov ax,4c00h
int 21h
code ends
end start
汇编确实有帮助了解整个computer如何工作,啃完王爽的汇编语言,接下来就是自己动手写操作系统了。