汇编中的插入排序

发布于 2024-10-31 01:06:01 字数 3566 浏览 0 评论 0原文

因此,我根据以下高级代码编写插入排序(在汇编中):

void insertionSort(int data[ ], int arraySize) {
        int insert;
        int moveItem;
        for(int next=1; next<arraySize; next++) {
                    insert=data[next];  //store the value in the current element
                    moveItem=next;    //initialize location to place element

                    while((moveItem>0)&&(data[moveItem-1]>insert)) {
                               //shift element one slot to the right
                                data[moveItem]=data[moveItem-1];
                                moveItem--;
                    }  //end while

                    data[moveItem]=insert;
        } //end for
} //end insertionSort

名为 myArray 的数组中恰好有 20 个随机数。我无法使用我们的书附带的库中的决策导数。所以基本上就是 movs、cmps、循环和跳转 这就是我得到的。我之前让它对 20 个随机数中的第一个进行排序,但我已经把自己搞糊涂了,不知道自己在做什么了。当它到达插入排序方法时它会崩溃。请帮忙。

TITLE Insertion Sort (main.asm)
INCLUDE Irvine32.inc
.data

elems = 20

myArray  sdword   elems dup(0)
str1 byte "Press enter" ,0
str2 byte "The array now is ",0
next sdword 1
start sdword ?

.code
main PROC
    call Clrscr
    call CreateRandom
    call Display
    call InsertionSort
    call Display
    exit
main ENDP

CreateRandom PROC
;;;;Creates 20 random numbers and populates myArray;;;;;
    call Randomize
    mov ecx, 20
    mov edx, OFFSET myArray

L1:                     
    call Random32                   ;create random number
    mov [edx], eax                  ; move random number to the appropriate spot in the array
    add edx, 4                      ; increase the address of what it is pointing to
    loop L1
    mov edx, OFFSET str1            ; "press enter to continue"
    call WriteString
    call ReadInt
    call Crlf
    ret
CreateRandom ENDP

Display PROC
;;;; Displays current form of the array myArray;;;;;
    mov edx, OFFSET str2                ; "The array now is:"
    call WriteString                    ; write string
    call Crlf
    mov esi, OFFSET myArray             ; offset of the array 
    mov ecx, 20                         ; index of the loop
L2:  
    mov eax, [esi]                      ; move array at that point to eax
    call WriteDec                       ; print out the array as a decimal
    call Crlf                           ; next line
    add esi, 4                          ; next element in the array
    loop L2
    call Crlf
    ret
Display ENDP

InsertionSort PROC
mov ecx, 19
mov edx, OFFSET myArray
mov ebx, OFFSET myArray            ; eax=next
add ebx, 4                        ;moves up the array to second element comparable to next

outterloop:
    mov    esi, [ebx]                    ; esi=data[next]
    mov eax, ebx                ;movelterm=ebx
    L1:
        mov edx, [eax-4]            ;move the number that is greater into edx
        mov [eax], edx                ;move the number into that 2nd element of the
        sub eax, 4
        mov esi, [eax]
        cmp eax, [edx]
        JNG endinner                        ; if the address is not greater than the first address, skip to the end
        mov edx, [eax-4]
        cmp edx, esi                        ; if the address is greater, than it already sorted, skip to end
        JG endinner
        loop L1
    endinner:
        mov [eax], esi  ; move first to the second to finish the sort
        add ebx, 4    ;move to the next element of the array
    inc next   ;counting outside loop
        cmp ecx, next
        JNE outterloop ;return to top of for loop

ret
InsertionSort ENDP

END main

So I'm coding out an insertion sort (in assembly) based on this high level code:

void insertionSort(int data[ ], int arraySize) {
        int insert;
        int moveItem;
        for(int next=1; next<arraySize; next++) {
                    insert=data[next];  //store the value in the current element
                    moveItem=next;    //initialize location to place element

                    while((moveItem>0)&&(data[moveItem-1]>insert)) {
                               //shift element one slot to the right
                                data[moveItem]=data[moveItem-1];
                                moveItem--;
                    }  //end while

                    data[moveItem]=insert;
        } //end for
} //end insertionSort

There are exactly 20 random numbers in an array called myArray. I cannot use an of the decision derivatives that come in the library that comes with our book. So basically movs, cmps, loops, and jumps
Here's what I got. I had it sorting the first of 20 random numbers earlier, but I've confused myself to death and have no idea what I'm doing any more. It crashes when it gets to the insertion sort method. Help please.

TITLE Insertion Sort (main.asm)
INCLUDE Irvine32.inc
.data

elems = 20

myArray  sdword   elems dup(0)
str1 byte "Press enter" ,0
str2 byte "The array now is ",0
next sdword 1
start sdword ?

.code
main PROC
    call Clrscr
    call CreateRandom
    call Display
    call InsertionSort
    call Display
    exit
main ENDP

CreateRandom PROC
;;;;Creates 20 random numbers and populates myArray;;;;;
    call Randomize
    mov ecx, 20
    mov edx, OFFSET myArray

L1:                     
    call Random32                   ;create random number
    mov [edx], eax                  ; move random number to the appropriate spot in the array
    add edx, 4                      ; increase the address of what it is pointing to
    loop L1
    mov edx, OFFSET str1            ; "press enter to continue"
    call WriteString
    call ReadInt
    call Crlf
    ret
CreateRandom ENDP

Display PROC
;;;; Displays current form of the array myArray;;;;;
    mov edx, OFFSET str2                ; "The array now is:"
    call WriteString                    ; write string
    call Crlf
    mov esi, OFFSET myArray             ; offset of the array 
    mov ecx, 20                         ; index of the loop
L2:  
    mov eax, [esi]                      ; move array at that point to eax
    call WriteDec                       ; print out the array as a decimal
    call Crlf                           ; next line
    add esi, 4                          ; next element in the array
    loop L2
    call Crlf
    ret
Display ENDP

InsertionSort PROC
mov ecx, 19
mov edx, OFFSET myArray
mov ebx, OFFSET myArray            ; eax=next
add ebx, 4                        ;moves up the array to second element comparable to next

outterloop:
    mov    esi, [ebx]                    ; esi=data[next]
    mov eax, ebx                ;movelterm=ebx
    L1:
        mov edx, [eax-4]            ;move the number that is greater into edx
        mov [eax], edx                ;move the number into that 2nd element of the
        sub eax, 4
        mov esi, [eax]
        cmp eax, [edx]
        JNG endinner                        ; if the address is not greater than the first address, skip to the end
        mov edx, [eax-4]
        cmp edx, esi                        ; if the address is greater, than it already sorted, skip to end
        JG endinner
        loop L1
    endinner:
        mov [eax], esi  ; move first to the second to finish the sort
        add ebx, 4    ;move to the next element of the array
    inc next   ;counting outside loop
        cmp ecx, next
        JNE outterloop ;return to top of for loop

ret
InsertionSort ENDP

END main

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

童话 2024-11-07 01:06:01

我没有详细检查您的代码,但我注意到 InsertionSort 似乎同时使用 edx 达到两个不同的目的:作为指向数组的指针,以及保存数组中的值之一。即使没有其他问题,这肯定会打破。

因此,在 InsertionSort 开始时,您可以说 mov edx, OFFSET myArray ——它是指向数组的指针。然后,几行之后,mov edx, [eax-4]——哎呀,不,这是数组中的一个值。几行之后,cmp eax, [edx]——哦,不,现在它又是一个指向数组的指针。

也许最后一条指令应该是 cmp edx, [eax] 或者其他什么?因为 eax 看起来确实是一个指向数组的指针。

I haven't examined your code in detail, but I notice that InsertionSort seems to be using edx for two different purposes at once: as a pointer into the array, and to hold one of the values from the array. This will certainly break even if nothing else is wrong.

So, at the start of InsertionSort you say mov edx, OFFSET myArray -- it's a pointer into the array. Then, a few lines later, mov edx, [eax-4] -- oops, no, it's a value from the array. And a few lines later again, cmp eax, [edx] -- oh, no, now it's a pointer into the array again.

Perhaps that last instruction should be cmp edx, [eax] or something? Because eax does seem to be a pointer into the array here.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文