;程序功能:在显示器指定位置显示绿色前景的welcome to masm!
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;si用于保存输入字符的偏移地址
call show_str
mov ax,4c00h
int 21h
show_str:
push dx
push cx
push ds
push si;寄存器保存
mov ax,0b800h
mov es,ax;用es保存显存段地址
mov bx,0
mov al,0a0h
dec dh
mul dh
add dl,dl
mov dh,0
add ax,dx
mov bx,ax;用bx存放显存偏移地址
mov ah,cl;写入字符属性
s:
mov ch,0
mov cl,[si]
jcxz ok
mov al,cl;写入字符
mov es:[bx],ax;将字符和属性写入指定显存位置
inc si
add bx,2
jmp short s
ok:
pop si
pop ds
pop cx
pop dx;还原寄存器
ret
code ends
end start
;其中同过两次调试才通过,第一次mov dh,0;add ax,dx;2条指令我原来是用的add ax,dl
第二个bug是:mul指令执行8位乘法时书上错误写为,被乘数默认放在ah中,看了半天源程序找不到错误,后来调试才发现执行mul指令时,ax中的值不对,突然就想到是不是书上对这个指令的介绍有错误,后来在论坛上一查,果然印刷有错误。。!
经验:当写完一 个程序时,发现执行后结果与预想的不符,首先找出结果不同的地方,看哪个功能实现上不对,然后看源程序对这个功能实现上是不是有不当的地方,或者用debug单步执行检查(特别注意在执行实现出错功能的指令时),然后就是发现问题解决问题,一直到得出应有的结果为止。
- [游客] 以前遇到过。看了讲解,明白不少。 如果我们把断点设置到int 21以后就没事了? 04/09 12:48
- [游客] 这样的问题还是发到论坛好,在这里很容易就被埋没了,嘿嘿~ 12/26 15:17
- [游客] debug下默认是16进制的,也就是说用a命令输入mov ax,354 ,结果变成ax=3 12/26 15:14
- [游客] 支持。 12/22 21:21
- [游客] 博主厉害。 12/22 21:18
- [游客] 博主的第一小题有问题吧。 存放位移的为一个十六位寄存器,它所能表示的最大值为65535,所以最大转 12/22 21:15
- [游客] 检测点11.2 add al,80h ;cf=1,of=1,sf=1,zf=1,pf=1 12/22 20:50
- [mouse] 我前两天也调了半天才把这个弄出来,还费了半天劲精简,我看博主的代码也是可以再精简点的~ 12/22 20:36
- [mouse] 写的真好,我的还没做出来呢 呜呜~~ 12/22 20:33
- [游客] 书上的代码基本都全了,没有问题,自己可以验证后把结果也贴上来~_~ 12/22 20:27