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那里去了。