- [游客] 你说的就是传说中的易语言么?(*^__^*) 嘻嘻…… 03/22 21:44
- [taotling] 你啊,肯定是太贪快,所以细节上的东西没注意。。。。 来晚了,报个到。 04/09 23:46
- [wdm] mov es:[di],cx ;原来是mov es:[di],cl mov es:[ 04/09 15:11
- [wdm] 看到内存b850:0006处的变化真的很奇怪 ============= 数据必然都是你些进入的 04/09 14:41
- [wdm] 我不明白为什么sp=4的时候,用t单步就会错?明明堆栈还有2个字的空间啊?! --------- 04/09 14:34
- [wdm] 书里哪里说过吗?还有没什么会出现这个情况?按理说,堆栈不是还有2个字的位置吗? ========= 04/09 14:30
- [hantangtianxia] debug跟踪的问题 如果直接运行或debug g命令 执行,不会出问题 04/08 23:17
- [rsice] wdm:博主看看这里的sp的值,mov dx,0000后的T命令的时候,你的sp只剩下4了,记得前面 04/08 23:12
- [游客] 功能子程序dtoc中应该添加保护现场和恢复现场语句序列! 答:确实没有保护现场,我觉得可能下面的 04/08 21:18
- [游客] 将行偏移添加到了段地址中?!应该把行、列偏移都放在偏移地址寄存器di中。 答:是这样的,我是把行 04/08 21:17
[2008-04-08 23:08] 终于完成了实验10子程序3:显示字符串!真实不容易啊!
第一个是wdm指出的:“由于sp值过小,在debug下的T单步跟踪时候出错的情况”,我按照这个把堆栈扩大,果然我在上一篇文章中令我百思不得其解的问题表面上解决了,但是我不明白为什么sp=4的时候,用t单步就会错?明明堆栈还有2个字的空间啊?!
第二个是这个程序,我沿用原来现成的show_str子程序,无法正确显示字符串,但我认为应该是能行得通的,但我调试的时候,看到内存b850:0006处的变化真的很奇怪,我修改了一下,问题虽然解决,但是我也想不通为什么,我准备再研究研究,同学们也请帮帮我!我在下面的语句中,把我原来的语句作为注释放在边上一边大家比较。
assume cs:code,ds:data,ss:stack
data segment
db 10 dup (0)
data ends
stack segment
db 160 dup (0)
stack ends
code segment
start: mov bx,data
mov ds,bx
mov si,0
mov ax,stack
mov ss,ax
mov sp,160
mov ax,12666
mov dx,0
call dtoc
mov dh,8
mov dl,3
mov cl,2
call show_str
mov ax,4c00h
int 21h
dtoc: mov bx,0 ;说实话,这是我挺得意的一个地方。
push bx
mov bx,0ah
s1: div bx
push dx ;dx存放余数,压栈备用
mov dx,0 ;dx清零,准备循环
mov cx,ax ;ax是商放入cx以判断是否为0
jcxz transform ;跳走开始处理
jmp s1
transform: pop cx;依次从堆栈中出栈到cx,顺序应该是1,2,6,6,6,0
mov ch,0;
jcxz ok
add cl,30h
mov [si],cl
add si,2
jmp transform
ok: ret
show_str: mov ch,0
push cx ;颜色参数入栈备用
mov ax,0
mov al,dh
mov bl,0ah
mul bl
mov bx,0b800h
add bx,ax
mov es,bx ;定位字符串起始行的位置,ax=8×10=80=50h,es=50h+b850h=b850h
mov ax,0
mov al,dl
mov bh,0
mov bl,2
mul bl
mov di,ax ;定位字串起始列的位置:di初始值3×2=6 es:[di]=b850:0006是字符串的起始位置
pop ax ;ax放颜色参数
mov si,0 ;上次的程序这里疏忽了,漏了这句,结果上个si=10没有清零。
s2: mov cx,ds:[si] ;原来是mov cl,ds:[si]
jcxz over
mov es:[di],cx ;原来是mov es:[di],cl
mov es:[di+1],al;
add si,2 ;原来是add si,2
add di,2 ;我觉得这两种写法不是完全一样的嘛,为什么一个行一个不行?
jmp short s2
over: ret
code ends
end start
[ wdm 发表于 2008-04-09 14:34 ]
我不明白为什么sp=4的时候,用t单步就会错?明明堆栈还有2个字的空间啊?!
--------------
T是一个中断显示例程,中断例程运行的时候,会用到当前的栈空间来存放cpu运行现场数据,所以,如果你的栈空间比较小,t中断的时候就放入的数据就会造成栈溢出了,那么操作系统就会将你的这行为给毙掉了。这个将在后面的中断章节详细介绍。
[ wdm 发表于 2008-04-09 14:41 ]
看到内存b850:0006处的变化真的很奇怪
=============
数据必然都是你些进入的,之所以有问题,肯定是你再定位数据和写输入的时候的寻址变化不一致或这混乱造成的。
[ wdm 发表于 2008-04-09 15:11 ]
mov es:[di],cx ;原来是mov es:[di],cl
mov es:[di+1],al;
这里是有认识问题的。
本来就应该是mov es:[di],cl,如果你是mov es:[di],cx 那么你存放的是一个字单元,你的ch会放在es:[di+1]处,虽然你后面有es:[di+1],al重新覆盖了此处的数据,但是,这种思维逻辑就是有隐患的。
[ taotling 发表于 2008-04-09 23:46 ]
你啊,肯定是太贪快,所以细节上的东西没注意。。。。
来晚了,报个到。