在其他论坛看到的问题,解决不了,用于显示字符,代码如下:
- Assembly code
assume cs:code;实验10.1data segment db 'welcome to masm!', 0data endscode segmentstart: mov dh, 15;行 mov dl, 12;列 mov cl, 2 mov ax, data mov ds, ax mov si, 0 call show_str mov ax, 4c00h int 21hshow_str: mov ch, 0 mov al, 2 mul dl mov di, ax mov al,0A0h mul dh mov bx, ax mov ax, 0b800h mov es, axs: push cx;感觉这边cx压栈和后面的出栈有问题,但是不懂为什么 mov es:[bx+di+1], cl mov cl, [si] jcxz ok mov es:[bx+di], cl inc si add bx, 2 pop cx jmp sok: ret code endsend start
单步调试的时候发现在 pop cx之后的mov语句总是不正确,显示要mov的值为F0,但cx寄存器的值还是0020h
不懂这是为什么,谢谢大家帮忙~~
人穷,分就少一点了~
------解决方案--------------------------------------------------------
push 那里有问题?不是的吧。你的 push 后到 pop 间的 jcxz 就出去了,导致堆栈不平衡,而且,接着就是 ret,会将刚才 push 的 cx 作为返回地址的。所以程序就 ret 错了,挂了。应该在 ret 前再加个 pop 指令平衡下。或者,你这里用其它寄存器也可用,别用 cx 。