关于双层循环的问题
本帖最后由 红烧甲鱼 于 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 多重循环就是要注意保存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 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重循环呢 红烧甲鱼 发表于 2018-9-23 08:59
谢谢你的回答,程序执行后发生的错误书上有解释,和你说的一样,之前我是没整明白内外循环的过程,就是 ...
当然可以写n重循环呀,内外层这样理解好像会更好,我之前没有把cx赋值那一步算在循环里,你这样理解好像更有道理一点{:5_106:}
页:
[1]