当前位置: 代码迷 >> 汇编语言 >> 循环cx如何从6 -> 0 -> ffff 了
  详细解决方案

循环cx如何从6 -> 0 -> ffff 了

热度:10661   发布时间:2013-02-26 00:00:00.0
循环cx怎么从6 -> 0 -> ffff 了?
data segment
  M dw 0001h,0002h,0000h,0f234h,1455h,0fa69h
  P dw 6 dup(?) ;正数存入此数组 di
  N dw 6 dup(?) ;负数存入此数组
data ends
stack segment stack
  buff dw 100 dup(?)
stack ends
code segment
;-------------------------------
main proc far
  assume ds:data,cs:code,ss:stack
start:
  push ds
  sub ax,ax
  push ax
  mov ax,data
  mov ds,ax 
  mov ax,stack
  mov ss,ax  
  mov di,0
  mov si,0
  mov bx,0
  mov cx,6
rotate:
  mov ax,M[bx]
  cmp ax,0
  jl less
  jg great
  add bx,2
  loop rotate
  jmp print
less:
  mov N[si],ax
  add si,2
  add bx,2
  loop rotate
great:
  mov P[di],ax
  add di,2
  add bx,2
  loop rotate
print:
  shr di,1
  mov dx,di
  add dx,30h
  mov ah,02h
  int 21h ;输出正数的个数
  shr si,1
  mov dx,si
  add dx,30h
  mov ah,02h
  int 21h ;输出负数的个数?
  ret
main endp
;------------------------------------
code ends
end start
  



------解决方案--------------------------------------------------------
还没搞定吗?
原因:第二个loop后面少了个jmp print。
执行过程:
(1)M序列最后一个数值(0fa69h)是负数,处理到这个数字时,程序会跳转到less那一段去执行,此时cx=1。
(2)在less这一段,0fa69被存储到N数组后,loop指令将cx减1,变为0。
(3)由于cx=0,所以loop指令不会再跳回rotate,应该执行loop后面一条指令。
(4)由于这个loop后面少了一条jmp指令,所以程序继续执行great部分的指令。
(5)执行完great部分的指令,到达print前面那条loop时,cx又被减1。由于此时cx=0,0减去1等于0ffffh,所以cx的数值变为0ffffh。
(6)由于cx又不等于0了,所以又跳转到rotate那里去了。