|
发表于 2012-3-20 11:07:10
|
显示全部楼层
本帖最后由 莫名其妙 于 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 ;定义中断例程[结束]
复制代码 |
|