对给定数组的用户进行排序并找到数组中的第k个最小整数

时间:2017-09-18 10:00:26

标签: assembly x86-16

我正在为我的汇编类做一个赋值,我已经完成了大部分工作,我唯一的问题是它不会从排序数组中打印正确的值而且k也是错误的。

问题: 要求用户输入一个整数,这将是他们将添加到数组中的整数数,n。然后我创建了数组并循环了n次。然后我要求他们从阵列中看到的第k个最小值。然后我对数组进行了排序并将其打印出来并将其与第k个最小数字相对应。

感谢所有帮助。

我的代码:

    .model small
    .stack 100h
    .data

newline equ 0ah, 0dh
sizeprompt db newline, "Enter the number of elements in the array: ", "$"
requestnumber db newline, "Enter a number into the array: ", "$"
kthsortednoprompt db newline, "Enter the kth smallest number you wish to see: ", "$"
arraysize dw ?
valueofk dw ?
valueofkmessage db newline, "The value of k is: ", "$"
arraysizetest dw 0
arraysizeexceptionmessage db newline, "Array size cannot be less than or equal to zero!", "$"
outofboundsexceptionmessage db newline, "The value entered is out of bounds, please try again!", "$"
array db 50 DUP(?)
bubblesorttemp db ?
printsortedarray db newline, "The sorted array: ", "$"
printthekthsmallestvalue db newline, "The kth smallest value: ", "$"
kthtemp db ?
elemententered db newline, "Value entered: ", "$"

    .code

StartLabel:

extrn readsint : proc, writesint : proc

mov ax, @data
mov ds, ax

getarraysize:
        lea dx, sizeprompt  
        mov ah, 09h
        int 21h

        call readsint
        cmp ax, arraysizetest
        jle arraysizeexception

        mov arraysize, ax   

        mov si, 0
        mov cx, 0

        jmp elementinsertion

arraysizeexception:
        lea dx, arraysizeexceptionmessage
        mov ah, 09h
        int 21h

        jmp getarraysize

elementinsertion:
        cmp cx, arraysize       
        je kthelementprompt

        lea dx, requestnumber
        mov ah, 09h
        int 21h

        call readsint
        mov array[si], al

        inc si
        inc cx

        jmp elementinsertion

kthelementprompt:
        lea dx, kthsortednoprompt       
        mov ah, 09h
        int 21h

        call readsint
        cmp ax, 0
        jle outofboundsexception
        cmp ax, arraysize
        jg outofboundsexception

        mov valueofk, ax

        mov si, 0
        mov bx, 1

        jmp findkthsmallestvalue

outofboundsexception:
        lea dx, outofboundsexceptionmessage
        mov ah, 09h
        int 21h
        mov valueofk, ax

        jmp kthelementprompt

findkthsmallestvalue:
        mov al, 0
        mov ah, 0
        cmp si, arraysize
        je printarray

        mov ah, array[bx]
        cmp array[si], ah
        jg firstgreaterthansecond

        mov ah, array[bx]
        cmp array[si], ah
        jle firstlessthansecond

        inc si
        inc bx

        jmp findkthsmallestvalue

firstgreaterthansecond:
        mov al, array[si]
        mov bubblesorttemp, al
        mov al, array[bx]
        mov array[si], al
        mov al, bubblesorttemp
        mov array[bx], al

        inc si
        inc bx

        jmp findkthsmallestvalue

firstlessthansecond:
        inc si
        inc bx

        jmp findkthsmallestvalue

printarray:
        lea dx, printsortedarray
        mov ah, 09h
        int 21h

        iteratesortedarray:
                mov ah, array[si]
                call writesint
                inc si
                loop iteratesortedarray

        lea dx, printthekthsmallestvalue
        mov ah, 09h
        int 21h

        sub valueofk, 1
        mov bx, valueofk
        mov ah, array[bx]
        call writesint

end StartLabel

1 个答案:

答案 0 :(得分:2)

我会尝试做第一件事:

    .model tiny
    .code

extrn readsint : proc, writesint : proc

tryToWriteOneInt:
        mov     ah, 255
        call    writesint
        ; exit to DOS with return code 00
        mov     ax,4C00h
        int     21h

end tryToWriteOneInt

我猜它不会输出255,也不会输出-1,而是介于-1到-256(或65280到65535)之间。如果它甚至会输出任何内容,或任何与ah内容相关的内容(如果没有看到writesint代码本身,或者其中的某些文档,则无法说出来。)

我想它期望在ax中打印值,因此您必须学习如何将8位值转换为16位值,最后决定数组值的有符号/无符号类型(存储时)只有al readsint,而使用相同的过程来读取 size k 表示它将读取16b签名值,即用户输入值-255将获得存储在数组中的值1,或者输入值254将在排序期间作为值-2(它将如何显示取决于您如何更改writesint用法)。

然后您可以尝试按指令调试代码。我不能评论我不喜欢的所有内容,因为我会在这里写出大约15-20个关于样式的项目,以及关于冗余,无效或无法访问的代码,这些内容并没有真正影响代码的功能,只是让它更难以阅读,调试和维护(甚至修改为新的应用程序)并让我感到痛苦。

但是我还会给你一些其他问题。

冒泡排序只会进行单次传递,因此不会冒泡排序。它还将访问数组末尾之外的一个元素。

在最终输出之后,您不会退回到DOS,因此您的应用程序将执行代码后在内存中找到的任何随机垃圾。很多时候它会导致PC崩溃(如果你只是运行虚拟/模拟的那个,你比PC DOS时代的学生更幸运,这只是盯着重启PC,希望最后一个源保存到正确的磁盘,不会在某些磁盘缓存中丢失)或各种有趣的效果。