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)。不管怎样,它都会被排序。