我正在为我的汇编类做一个赋值,我已经完成了大部分工作,我唯一的问题是它不会从排序数组中打印正确的值而且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
答案 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,希望最后一个源保存到正确的磁盘,不会在某些磁盘缓存中丢失)或各种有趣的效果。