本帖最后由 莫名其妙 于 2012-3-20 14:05 编辑 assume cs:code
data segment
db "welcome to masm!",0
data ends
code segment
start:
mov ax,cs
mov ds,ax
mov si,offset no7c ;设置si入口地址
mov ax,0
mov es,ax
mov di,200h
mov cx,offset no7cend-offset no7c
cld
rep movsb ;此9句为安装中断例程 将offset no7c 处代码复制进0:200h处
;中断安装以上代码都一样这就是 格式
mov word ptr es:[7ch*4],200h
mov word ptr es:[7ch*4+2],0 ;此2句为设置中断向量
mov dh,10 ;行号
mov dl,10 ;列号
mov cl,2 ;颜色属性
mov ax,data
mov ds,ax
mov si,0
int 7ch ;调用中断例程
mov ax,4c00h
int 21h
no7c: push ax ;定义中断例程[开始]
push bx
push di
mov bx,0b800h
mov es,bx
mov al,160d ; 每行160
mul dh
mov di,ax ;将多少行 传递给di
mov al,2 ;此6句为确定符合题意的显存的偏移地址,
mul dl ;乘法以后ax为列数
; 不可用"mov di,160*dh+2*dl"试图达到此6句指令的功能。
add di,ax ;将行数与列数相加得出显示位置开始单元
mov bl,cl
again: mov cx,[si]
jcxz no7cret ;判断是否结束 为0 结束并跳转
mov es:[di],cl ; 因为mov cx,[si] 所以cl 存放的是[si]的值也就是每一位字母
mov es:[di+1],bl ; 这里bl是颜色
inc si
add di,2
jmp short again
no7cret: pop di
pop bx
pop ax
iret ; 将先前保存的int 7ch中断时push进来的各项出栈恢复cs:ip 继续执行下面代码
no7cend: nop ;定义中断例程[结束]
|