第七章:更灵活的定位内存地址
实现双层循环的思路:
将外层的cx的值在覆盖前首先保存到一个位置存放,然后再进行覆盖,当内层的循环执行完了之后,再拿出外层的值赋给cx,进行外层循环,如此一来,便记忆了两次循环的次数
双层循环实现:
assume cs:aa
aa segment
start: mov ax,1
mov cx,3
s: add ax,ax
mov dx,cx ;保存原来的循环信息
mov bx,2
mov cx,4
s0: add bx,bx
loop s0
mov cx,dx ;恢复原来的保存信息
loop s
mov ax,4c00H ;妹的,要记住这段话啦,不然看不出结束....
int 21h
aa ends
end start
分析:在上面的程序中,si(后面的source寄存器),cx(直接控制循环次数),ax,bx(作为内存地址的寄存器[bx])显然不能用来暂存cx的值,因为这些寄存器在循环中也要使用,cs,ip,ds当然也不能使用,因为cs:ip时刻是指向当前指令,ds指向的数据段
可用的寄存器就只有:dx,di,es,ss,sp,bp等6个寄存器,呵呵,所以上面是拿dx开刀的(临时保险箱啊),
实现双层循环的思路:
将外层的cx的值在覆盖前首先保存到一个位置存放,然后再进行覆盖,当内层的循环执行完了之后,再拿出外层的值赋给cx,进行外层循环,如此一来,便记忆了两次循环的次数
双层循环实现:
assume cs:aa
aa segment
start: mov ax,1
mov cx,3
s: add ax,ax
mov dx,cx ;保存原来的循环信息
mov bx,2
mov cx,4
s0: add bx,bx
loop s0
mov cx,dx ;恢复原来的保存信息
loop s
mov ax,4c00H ;妹的,要记住这段话啦,不然看不出结束....
int 21h
aa ends
end start
分析:在上面的程序中,si(后面的source寄存器),cx(直接控制循环次数),ax,bx(作为内存地址的寄存器[bx])显然不能用来暂存cx的值,因为这些寄存器在循环中也要使用,cs,ip,ds当然也不能使用,因为cs:ip时刻是指向当前指令,ds指向的数据段
可用的寄存器就只有:dx,di,es,ss,sp,bp等6个寄存器,呵呵,所以上面是拿dx开刀的(临时保险箱啊),