程序集MASM:按降序对双字无符号整数数组进行排序的程序

时间:2017-03-08 00:11:54

标签: assembly masm irvine32

我对自己的任务感到困惑。问题是 : 编写一个完整的程序,按降序对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

谢谢,我真的很感激帮助:我不知道哪里出错了,为什么我不能打印出最初的数组。

1 个答案:

答案 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