栈问题..若不加入栈操作 则程序可循环..若加入 则程序自动运行到DOS出口..

小白愛學習 2011-03-20 11:12:01
关键代码段如下..(代码太长,只把认为关键的上传).
show11: push si
mov ax,0


in al,60h


cmp al,10h ;判定是否为Q键
je quit ;是则 退出

cmp al,4dh ; 判定是否为→

je bus3 ;是则执行bus3
jmp show11

quit: mov ax,4c00h
int 21h

bus3: pop si
call bus1
jmp show11 ;执行完后返回循环体


问题如下:
若不加如红色栈操作 则程序可按照代码所示按Q退出
若加入红色栈操作 则程序直接..退出 无需按Q

敢问为何....


...全文
97 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
小白愛學習 2011-03-20
  • 打赏
  • 举报
回复
大功能上实现 按→键 控制屏幕上 显示的字符图形一步一步跳动...
小白愛學習 2011-03-20
  • 打赏
  • 举报
回复
1,用si记录按了多少次→的作用,用si决定call bus1里面的显示位置问题
2,要保留call bus1中的si不被外界破坏 而不是保留外界的si不受call bus1破坏

补充说明:我这里要实现的功能是在call bus1中 用xchg指令
按第一次 →键后 :A←→B 返回循环体
按第二次 →键后 :B←→C 返回循环体
按第三次 →键后 :C←→D 返回循环体
按第四次.... ...
按第N次....... ..
masmaster 2011-03-20
  • 打赏
  • 举报
回复
1,这里si起何作用?
2,在子程序bus1里先将si入栈,ret之前在将si出栈,如:
bus1 proc
push si
....
....
pop si
ret
bus1 endp
小白愛學習 2011-03-20
  • 打赏
  • 举报
回复
补充追问...

若要保存si 使在call bus1中的 si中的字符不受外界影响(每执行一次call bus1,call中的si会变化)
该如何做?
小白愛學習 2011-03-20
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 shzhfu 的回复:]

push与pop应该配对使用,你的出现中
show11: push si
...
je quit ;若从这里转走,则转到quit处,si留在栈中了。
...
je bus3 ;这里转走的把si出栈了
jmp show11 ;若返回去,则si又被压栈。这里不按键做的循环会有“很多”的si入栈。

所以你的分支程序造成栈段混乱,建议你不要用si计数了,改一个(全局)变……
[/Quote]

谢谢指出栈操作的混乱问题
小白愛學習 2011-03-20
  • 打赏
  • 举报
回复
按照LS的说法 我定义了一个字节单元用来储存次数..
assume cs:code ,ds:data
data segment

f db 0 ;用于保存按键→的次数
data ends

code segment
start:

...
...
...

show11:
mov ax,0


in al,60h


cmp al,10h ;Q键的扫描码
je quit

cmp al,4dh ; →扫描码

je bus3
jmp show11

quit:
mov ax,4c00h
int 21h

bus3:
call bus1
jmp show11
;*******************************************
bus1 proc near
mov bx,0
mov di,0

mov bx,0b800h
mov es,bx

mov bx,0
mov bl,f[di] ;调出次数特征值
add si,bx
add bl,8 ;每执行一次 视为+8
mov f[di],bl ;保存特征值



mov cx,8

show15: ;用于实现4字单元的数据交换 在第22和23行..第三列开始
mov bl,byte ptr es:[160*21+4][si]
xchg byte ptr es:[160*21+4+8][si],bl
mov byte ptr es:[160*21+4][si],bl

mov bh,byte ptr es:[160*22+4][si]
xchg byte ptr es:[160*22+4+8][si],bh
mov byte ptr es:[160*22+4][si],bh

inc si
loop show15


ret
bus1 endp ;子程序结束返回循环体




问题:
按照LS的建议改造后,还是不能实现单纯的数据交换..出现花屏...

补充说明:在此之前所有的子程序用到的寄存器都有入栈出栈保护

我怀疑是按一次→键后 call bus1执行了很多次?

感谢指教


shzhfu 2011-03-20
  • 打赏
  • 举报
回复
push与pop应该配对使用,你的出现中
show11: push si
...
je quit ;若从这里转走,则转到quit处,si留在栈中了。
...
je bus3 ;这里转走的把si出栈了
jmp show11 ;若返回去,则si又被压栈。这里不按键做的循环会有“很多”的si入栈。

所以你的分支程序造成栈段混乱,建议你不要用si计数了,改一个(全局)变量吧。

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧