红烧甲鱼 发表于 2018-9-22 15:44:59

关于双层循环的问题

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

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

data segment

         db 'ibm             '
       db 'dec             '
       db 'dos             '
       db 'vax             '
       
data ends

code segment

start:mov ax,data
      mov ds,ax
          mov bx,0
          mov cx,4

   s0:mov si,0
      mov cx,3
          
        s:mov al,
          and al,11011111b
          mov ,al
          inc si
          
          loop s
          
          add bx,16
          
          loop s0
          
          mov ax,4c00h
          int 21h
          
code ends

end start

20180906 发表于 2018-9-22 20:59:42

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

正确的做法应该是在修改cx值之前,先push cx进栈,然后进入内层循环,等内层循环结束后,pop cx恢复原来外层循环的cx值,进行外层判断。
这样解释可以理解吗?

红烧甲鱼 发表于 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,      ;内循环部分
      andal,11011111b;内循环部分
      mov ,al ;内循环部分
      incsi       ;内循环部分
      loop s      ;内循环部分

      add bx,16 ;外循环部分
      loop s0   ;外循环部分
执行顺序是先执行到loop s(内循环),然后是loop s0(外循环)吧,而且看这个规律,在有多个循环的时候,应该是MOV CX,IDATA开始到LOOP循环标记为一个层(MOV CX,IDATA;S:;LOOP S)可以这么理解吧,既然可以双重循环,是不是可以写N重循环呢

20180906 发表于 2018-9-23 15:00:46

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

当然可以写n重循环呀,内外层这样理解好像会更好,我之前没有把cx赋值那一步算在循环里,你这样理解好像更有道理一点{:5_106:}
页: [1]
查看完整版本: 关于双层循环的问题