mov dx,3是初始化dx,注意这时dx里二进制是0000 0000 0000 0011,后面要用到
inc ax
adc bx,ax
loope l20
这三句就是要把递增的整数累加到bx里,说白了就是
bx=1+2+3+......
现在重要的是这个循环要做几次,也就是bx累加到几结束
shr dx,1
就是用来控制这个循环结束的。它把dx右移一位,并且如果dx里面结果为零了,那么要置zf这个标志位。loope看到zf被置位了就不再跳到L20去执行了。
那么dx里面开始有两个1(二进制),所以,loope总共跳转成功两次,那么bx加了3个数
bx=1+2+3
然后结束。所以bx为6
对不起,前面有几个地方说错了,还有你的前面代码没仔细看。解释如下:
首先bx是初始为2的,
其次循环只做了2次,而不是3次,因为0000 0011右移第一次还不会为0,所以loop跳转成功,而再移1次就为0了,这是loop就跳转不成功了。
那么bx=2+1+2的,这样结果会是5,所以还差1,这个1是这样来的
在第一次右移时,0000 0011会移出去一位1,这是把cf置1了,这很重要,而loope判断zf不为1,所以跳转到inc那条指令,inc是不会改变cf的,这点也很重要,所以cf仍然是1,后面adc bx,ax就是bx=bx+ax+1了,这样就得到多出来的那个1了。
另外xor ax,ax除了你说的清ax为0外,它还有很多重要的功能,例如让cf为0,让zf为1等等,这些都会影响程序的运行
MOV DX,3 ;初始化dx
SHR DX,1 ;dx逻辑右移1位。
bx=x0c
MOV DX,3 ;是(dx)=3
SHR DX,1 ;dx逻辑右移1bit,将移走的1bit送flag寄存器的c标志位