鱼C论坛

 找回密码
 立即注册
查看: 1829|回复: 3

[已解决]关于双层循环的问题

[复制链接]
发表于 2018-9-22 15:44:59 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 红烧甲鱼 于 2018-9-22 15:46 编辑

这段代码是王爽汇编第二版,第七章 问题7.7
代码里涉及到一个双层循环的问题,没有研究明白是怎么回事,按照我的理解没有得到想要的结果,请坛子里各位高手给予指点。
还有就是这段代码能正常生成.asm文件,但是在link的时候报错,也没找到原因
  1. assume cs:code,ds:data

  2. data segment

  3.          db 'ibm             '
  4.          db 'dec             '
  5.          db 'dos             '
  6.          db 'vax             '
  7.          
  8. data ends

  9. code segment

  10. start:mov ax,data
  11.       mov ds,ax
  12.           mov bx,0
  13.           mov cx,4
  14.   
  15.    s0:mov si,0
  16.       mov cx,3
  17.           
  18.         s:mov al,[bx+si]
  19.           and al,11011111b
  20.           mov [bx+si],al
  21.           inc si
  22.           
  23.           loop s
  24.           
  25.           add bx,16
  26.           
  27.           loop s0
  28.           
  29.           mov ax,4c00h
  30.           int 21h
  31.           
  32. code ends

  33. end start
复制代码
最佳答案
2018-9-22 20:59:42
多重循环就是要注意保存cx的值!!!
你看你代码外层循环
  1. mov cx,4
复制代码
把cx设置为4,然后在内层循环s0处
  1. mov cx,3
复制代码
把cx设置为3。内层循环执行3次后,cx值为0,退出内层循环。
这时来到外层循环,就发现cx的值为0,执行
  1. loop s
复制代码
,把cx值减一,cx的值就变为FFFFH(-1的补码),然后进行cx是否等于0的判断,所以没有按照你的想法执行。

正确的做法应该是在修改cx值之前,先
  1. push cx
复制代码
进栈,然后进入内层循环,等内层循环结束后,
  1. pop cx
复制代码
恢复原来外层循环的cx值,进行外层判断。
这样解释可以理解吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-9-22 20:59:42 | 显示全部楼层    本楼为最佳答案   
多重循环就是要注意保存cx的值!!!
你看你代码外层循环
  1. mov cx,4
复制代码
把cx设置为4,然后在内层循环s0处
  1. mov cx,3
复制代码
把cx设置为3。内层循环执行3次后,cx值为0,退出内层循环。
这时来到外层循环,就发现cx的值为0,执行
  1. loop s
复制代码
,把cx值减一,cx的值就变为FFFFH(-1的补码),然后进行cx是否等于0的判断,所以没有按照你的想法执行。

正确的做法应该是在修改cx值之前,先
  1. push cx
复制代码
进栈,然后进入内层循环,等内层循环结束后,
  1. pop cx
复制代码
恢复原来外层循环的cx值,进行外层判断。
这样解释可以理解吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-23 08:59:20 | 显示全部楼层
本帖最后由 红烧甲鱼 于 2018-9-23 09:03 编辑
20180906 发表于 2018-9-22 20:59
多重循环就是要注意保存cx的值!!!
你看你代码外层循环把cx设置为4,然后在内层循环s0处把cx设置为3。内 ...


谢谢你的回答,程序执行后发生的错误书上有解释,和你说的一样,之前我是没整明白内外循环的过程,就是说哪部分为内循环开始结束,哪部分为外循环开始结束,因为书上没有说是怎么回事,当时看的一脸慒,现在看明白是怎么回事了,虽然是看明白了,但是我想问问有没有双重循环的概念理论来解释。
    mov cx,4  ;外循环部分
s0:mov si,0  ;外循环部分
    mov cx,3  ;;内循环部分
      
    s:mov al,[bx+si]        ;内循环部分
      and  al,11011111b  ;内循环部分
      mov [bx+si],al ;内循环部分
      inc  si       ;内循环部分
      loop s      ;内循环部分

      add bx,16 ;外循环部分
      loop s0     ;外循环部分
执行顺序是先执行到loop s(内循环),然后是loop s0(外循环)吧,而且看这个规律,在有多个循环的时候,应该是MOV CX,IDATA开始到LOOP循环标记为一个层(MOV CX,IDATA;S:;LOOP S)可以这么理解吧,既然可以双重循环,是不是可以写N重循环呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-23 15:00:46 | 显示全部楼层
红烧甲鱼 发表于 2018-9-23 08:59
谢谢你的回答,程序执行后发生的错误书上有解释,和你说的一样,之前我是没整明白内外循环的过程,就是 ...

当然可以写n重循环呀,内外层这样理解好像会更好,我之前没有把cx赋值那一步算在循环里,你这样理解好像更有道理一点
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-2 05:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表