Assembly 计数排序数组中重复数字的实例,存储计数数组

Assembly 计数排序数组中重复数字的实例,存储计数数组,assembly,x86,masm,Assembly,X86,Masm,本部分任务的背景: 计数列表: 生成保存次数的数组计数 在randArray中可以看到每个值[10,29]。例如,计数[0] 应等于数组中值10的实例数。 计数[14]应等于中值24的实例数 随机阵列 添加的上下文:在调用countList之前,列表数组按升序排序。因此,一个数字为10,10,11,12,12的数组将作为2,1,2复制到另一个数组中 countList PROC push EBP mov EBP, ESP mov ESI,

本部分任务的背景:

计数列表:
生成保存次数的数组计数 在randArray中可以看到每个值[10,29]。例如,计数[0] 应等于数组中值
10
的实例数。 计数[14]应等于中值
24
的实例数 随机阵列

添加的上下文:在调用countList之前,列表数组按升序排序。因此,一个数字为10,10,11,12,12的数组将作为2,1,2复制到另一个数组中

countList PROC
    push    EBP
    mov     EBP, ESP
    
    mov     ESI, [ESP + 20]            ; randArray (200 digits w/n this array)
    mov     ECX, [ESP + 16]            ; loop counter (ARRAYSIZE, which is 200)
    dec     ECX                        ; 200 - 1

    mov     EBX, [ESP + 12]            ; array we want to add to (countArray)
    mov     EDX, [ESP + 8]             ;"counter" for # of repeats for a digit

    _FirstLoop:
        ; grab first digit of sorted array
        mov     EAX, [ESI]

        ; compare current value to next value
        cmp     EAX, [ESI + 4]
        je      _NextDigit
        jne     _AddCountArray

    _NextDigit:
        ; move to next item in array
        inc     EDX
        add     ESI, 4
        loop    _FirstLoop

    _AddCountArray:
        ; add total number of instances of specified digit to countArray
        mov     [EBX], EDX
        add     EBX,  TYPE DWORD
        loop    _FirstLoop

    pop     EBP
    RET     16

countList ENDP
也许是因为我看这个作业看得太久了,我不知道循环到底在哪里搞砸了?要向其中添加值的数组为空


朝着正确方向迈出的任何一步都是值得赞赏的。

您是否尝试过在调试器中运行代码,以便查看代码的混乱之处?ESI不会像预期的那样增加到下一个元素,但AddCountArray不会向新数组添加任何值。至少从我从调试器和显示过程的一般输出中看到的情况来看,您计算的是数组元素,而不是单个数字。你只需要计算数组元素(一个正常的直方图),而不仅仅是重复的元素。已知的值范围允许您轻松地将值范围映射到计数索引范围,如果您想这样做,只需添加dword ptr[counts+eax*4],1。(这就是在未排序的列表上所做的。但是,对于排序列表上的大量重复,计数1+重复次数可能更快。)当内部
循环
指令使ECX=0,然后执行到达第二个
循环
指令时会发生什么?在存储之后,您需要在外部循环的底部处理可能的情况。e、 g.如果您坚持使用
循环
指令将ECX绑定为计数器,则可能是
jecxz
,即使您已经有一个指针在数组中递增,这将形成一个非常好的循环条件。(
do{…}while(p!=endp)
)不幸的是,我不能使用do/while循环或ptr。对于这项任务,整个过程必须尽可能地“放松”(这里没有更好的短语)。我必须生成一个由200个10-29之间的随机数字组成的数组,然后对列表进行排序,然后执行上面列出的过程(countList)。不管怎样,它都会被排序。