本帖最后由 兰陵月 于 2017-10-31 21:06 编辑 ;源基本程序来源地址:http://bbs.fishc.com/forum.php?mod=viewthread&tid=99149&page=1&extra=#pid3065138
;源程序属该帖一楼楼主所发,位于一楼。
;以下为修改程序
;时间:2017-10-31 20:55
;by 鱼C论坛 ID:兰陵月
assume cs:cjh,ds:sy
sy segment
db 'wo ai wo jia',0
sy ends
cjh segment
ks: mov ax,sy
mov ds,ax
mov si,0
mov dh,8
mov dl,3
mov cl,2
call show_str
mov ax,4c00h
int 21h
show_str:
;第8行行首偏移量为(行号-1)*160=1120 ,本处行号为dh=8
mov al,160
sub dh,1
mul dh
;上一行的结果保存在AX中。
;第3列的偏移量:某列在该行的偏移量(N-1)*2
sub dl,1 ;第3列,3-1
shl dl,1 ;乘以2,即左移1位。
;得到第8行第3列在显存中的总偏移值,并给BX。
mov dh,0
add ax,dx
mov bx,ax
;上一句执行完毕后,bx的值为1124,这就是第8行第3列的总偏移值
mov ax,0b800h
mov es,ax
mov ah,cl
s: mov ch,0
mov cl,ds:[si]
jcxz over
mov es:[bx],cl
inc bx
mov es:[bx],ah
inc bx
;inc cx ;此处来这么一条inc cx是什么意思?我觉得不需要。
inc si
loop s
over: ret
cjh ends
end ks
如下图,调试没有问题!!!
下图清屏,准备看运行结果!!!
下图,运行结果完全符合要求!!!
楼主错误主要发生行号列号求偏移地址时发生了错误。
以后程序调用过程的时候最好能把一些寄存器压栈保存一下,以防发生错误了,我这里就没帮你加了。 |