|

楼主 |
发表于 2014-4-11 13:50:11
|
显示全部楼层
assume cs:code
data segment
db 'welcome to masm!',0
data ends
code segment
start: mov dh,8
mov dl,3
mov cl,2 ;字体颜色
mov ax,data
mov ds,ax
mov si,0 ;字符串索引
call show_str
mov ax,4c00h
int 21H
show_str:mov al,160 ;每一行 160个字节
mul dh ;*8行 计算出行数位置 储存在AX中
mov bx,ax ;将 行数位置 赋值给 BX
mov al,2 ;第一列 占2个字节
mul dl ;计算出 首列的位置
add bx,ax ;首行位置加上 首列位置.........计算出首字符的显示位置偏移
mov ax,0b800h ;B800 为显存初始位置
mov es,ax ;显存地址段开始位置 ES:[BX] 为要显示的初始位置
kscopy: mov ch,[si] ; 将字符数据赋值给 CH ,CL 为字体颜色没有改变
push cx ;将CX 字符数据,和字体颜色 压入栈
mov cl,0 ;将 CL 赋值为0,CX的数据没有变化 为字符数据
jcxz ok ; 如果 CX的值为0 跳出子程序
pop cx ; CX的值不为0 恢复CX原先的数据
mov es:[bx],ch ;将 CH的字符数据 赋值给 显示的初始位置 ES:[BX] 低位字节
mov es:[bx+1],cl ;将 CL的字体颜色数据赋值给 ES:[BX+1] 高位字节存放的是字符属性
inc si ;字符串索引 自增1 字节为1
add bx,2 ;显示位置 自增2//原先这里也写错了写成 DI
jmp short kscopy
ok: pop cx ;当CX 为0时 直接跳转 并没有执行 POP 指令, 此时 栈顶指针指向的是 前面PUSH进去的 CX值,上面没有POP 出来. 造成 RET 返回的数据错误..
ret
code ends
end start |
|