我对自己的任务感到困惑。问题是 : 编写一个完整的程序,按降序对dword无符号整数数组进行排序。
假设用户输入的整数不超过40个。
您必须使用模板并按照其中的所有说明进行操作。
您无法再向模板添加任何过程。 这些过程不能使用任何全局变量(.data段内的变量)。 任何过程的调用者都通过堆栈发送其参数。 在任何程序中,如果需要使用寄存器,则必须保留其原始值。您无法使用pushad运算符。 被叫方负责清理堆栈。 您的行不得超过80列 在程序结束时添加一个示例运行。在星期四上午9点,上午8点之前提交.asm文件。
示例运行:
输入最多40个无符号双字整数。要结束数组,请输入0 在每个元素之后按下输入:
1
4
3
8
99个
76个
34个
5
2
17个
0
初始数组:
1 4 3 8 99 76 34 5 2 17
数组按降序排列:
99 76 34 17 8 5 4 3 2 1
按任意键继续 。 。点。
目前,我所拥有的是:
include irvine32.inc
; ===============================================
.data
array dword 40 dup(?)
string1 byte "Enter up to 40 unsigned dword integers. To end the array, enter 0.",0
string2 byte "After each element press enter:", 0
string3 byte "Initial array:",0
string4 byte "Array sorted in descending order:",0
;=================================================
.code
main proc
; YOU NEED TO CALL ENTER_ELEM, SORT_ARR AND PRINT_ARR PROCEDURES
mov edx, offset string1
call writeString
call crlf
call crlf
mov edx, offset string2
call writeString
call crlf
mov esi, offset array
mov ecx, LENGTHOF array
push esi
mov eax, 0
L1:
call Readdec ; read integer into EAX
mov [esi],eax ; store in array
cmp eax, 0
JE end01
add esi,TYPE array ; next integer
call enter_elem
loop L1
end01:
mov edx, offset string3
call writeString
call print_arr
exit
main endp
; ================================================
; void enter_elem(arr_addr)
;
; Input:
; ARR_ADDRESS THROUGH THE STACK
; Output:
; ARR_LENGTH THROUGH THE STACK
; Operation:
; ?
;
enter_elem proc
push ebp ;set ebp
mov ebp, esp
push eax ; save register
mov esi, [ebp + 12]; pointing to value in array
mov ecx, [ebp+8]
add esi, 4 ; move pointer to next value in array
pop eax
pop ebp
ret 4
enter_elem endp
; ================================================
; void print_arr(arr_addr,arr_len)
;
; Input:
; ?
; Output:
; ?
; Operation:
; ?
;
print_arr proc
push ebp ;set ebp
mov ebp, esp
push eax
L2:
mov eax, DWORD ptr [esi] ;store in new array
call writeDec
add esi, TYPE array ;next integer
mov al,', '
call writeChar ;Displays value in EAX
loop L2
pop eax
pop ebp
ret 4
print_arr endp
谢谢,我真的很感激帮助:我不知道哪里出错了,为什么我不能打印出最初的数组。
答案 0 :(得分:0)
哦,我知道了,所以获取输入的循环应该在enter_elem过程中吗?我真的不懂堆栈。但我试过这个,现在它只需要1个输入。
enter_elem proc
mov eax, 0
L1:
call Readdec ; read integer into EAX
mov [esi],eax ; store in array
cmp eax, 0
JE end01
push ebp
mov ebp, esp
push eax ; save register
push esi ; save register
mov esi, [ebp+12] ; pointing to value in array
add esi,4
pop esi 流行的eax pop ebp 添加esi,4;将指针移动到数组中的下一个值
end01:
ret 4
enter_elem endp