. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->CALL和RET指令
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  两个疑惑  [已解决] 回复[ 5次 ]   点击[ 474次 ]  
regex
[帖 主]   [ 发表时间:2010-01-23 23:41 ]   [引用]   [回复]   [ top ] 
荣誉值:61
信誉值:0
注册日期:2009-12-19 01:51
程序如下:
  1 assume  cs:code
  2 data    segment
  3         db      'abc'
  4 data    ends
  5
  6 code    segment
  7 conv:   and byte ptr [si],11011111b
  8         inc si
  9         loop conv
 10         ret
 11
 12 start:  mov ax,data
 13         mov ds,ax
 14         mov si,0
 15         call conv
 16
 17         mov ah,4ch
 18         int 21h
 19 code    ends
 20 end     start

这里是书里10.11节例题。
这里少了一句
mov cx,12
可是程序一样运行的非常好, 
疑问1:
那个mov cx,12到底有没有用?
疑问2:
子程序里如果计数的? 我感觉CX还在起作用!
scuzg
[第1楼]   [ 回复时间:2010-01-24 08:42 ]   [引用]   [回复]   [ top ] 
荣誉值:307
信誉值:0
注册日期:2009-03-15 23:46
先说疑问 2:无论程序是否给 cx 设置了正确的初值,loop 指令总是先将 cx 的内容减一,然后根据 cx 是否为 0 决定跳转还是退出循环,所以楼主的感觉是对的(CX还在起作用!)。
然后再说疑问 1:字符串'abc'的长度为 3,将 cx 设置成 12 程序将操作到数据段之外的内存单元,所以对应 'abc' 正确的设置应该是 3。如果不对 cx 作设置,cx 中是一个其他程序使用后留下的当前程序无法预知的随机值,如果大于 0 且小于 3 ,则不能完成将串 'abc' 改成大写的处理;如果大于 3 (包括 0 ),程序将操作到数据段之外的内存单元,除了增加了不必要的运行时间外,如果 cx 长度足够,将会把代码段的程序也做“大写转换处理”了,这必然会导致程序功能紊乱。楼主可以通过单步跟踪,看看调用子程序前的 cx 是什么值,或者将 cx 值设置成大于 0 且小于 3 及比较大的情况,应该发生转换不完全和程序紊乱的情况。
3167676
[第2楼]   [ 回复时间:2010-01-24 08:42 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:4
注册日期:2010-01-14 02:50
我的一点看法:
疑问1:没有mov cx,12 如果是用debug加载的话,cx值是程序的长度。如果是直接运行的话,就不能确定cx的值了。
疑问2:书上后面有讲到为避免寄存器冲突,在子程序用到的寄存器要进行入出栈操作。
regex
[第3楼]   [ 回复时间:2010-01-24 11:33 ]   [引用]   [回复]   [ top ] 
荣誉值:61
信誉值:0
注册日期:2009-12-19 01:51
回复:[第1楼]
------------------
感谢! 把cx保存为循环次数,是最安全的。明白啦。 就跟开始要初始化一些寄存器一样的道理。
regex
[第4楼]   [ 回复时间:2010-01-24 11:34 ]   [引用]   [回复]   [ top ] 
荣誉值:61
信誉值:0
注册日期:2009-12-19 01:51
我的一点看法:
疑问1:没有mov cx,12 如果是用debug加载的话,cx值是程序的长度。如果是直接运行的话,就不能确定cx的值了。
疑问2:书上后面有讲到为避免寄存器冲突,在子程序用到的寄存器要进行入出栈操作。
------------------
回复:
没错, 忘考虑cx是代码长度这茬啦~~⊙﹏⊙b汗
regex
[第5楼]   [ 回复时间:2010-02-02 17:18 ]   [引用]   [回复]   [ top ] 
荣誉值:61
信誉值:0
注册日期:2009-12-19 01:51
此贴由 贴主 于 [ 2010-02-02 17:18 ] 结贴。 结贴原因:问题已解决
得分情况:
此问题已结贴!
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved