如何使用汇编语言对签名数字进行排序?

时间:2015-10-12 06:39:24

标签: sorting assembly x86 nasm

我有这个功课,我需要制作一个程序,询问用户的三个SIGNED号码,我的程序应该能够按升序对这些号码进行排序。我可以用C ++编写,但我不熟悉NASM /汇编语言。

到目前为止,这是我的代码:

%include "asm_io.inc"

segment .data
;
; Output strings
;
prompta         db    "Enter the 1st number: ", 0
promptb         db    "Enter the 2nd number: ", 0
promptc         db    "Enter the 3rd number: ", 0
promptd         db    "The sorted list is: ", 0

segment .bss
input   resd 1


segment .text
        global  _asm_main
_asm_main:
        enter   0,0               ; setup routine
        pusha

        mov     eax, prompta
        call    print_string

        call    read_int
        push eax

        mov    eax, promptb
        call    print_string

        call    read_int
        push eax

        mov     eax, promptc
        call    print_string

        call    read_int
        push eax


        call add_stack

        mov ebx, eax

        mov     eax, promptd 
        call    print_string
        mov     eax, ebx
        call    print_int
        call    print_nl

        sub esp, 16

        popa
        mov     eax, 0            ; return back to C
        leave                     
        ret


segment .data
; no need for .data

segment .bss
; no need for variables

segment .text
add_stack:
        enter   0,0

        mov ecx, [ebp+8]
        mov ebx, [ebp+12]
        mov eax, [ebp+16]

        cmp eax, ebx 
        jg A

        cmp ebx, ecx
        jg B 

        cmp ecx, eax
        jg C

        A:
        push eax 

        B:
        push ebx 

        C:
        push ecx 

        popa 
        leave
        ret

1 个答案:

答案 0 :(得分:0)

在C ++中,您不能更改函数内部的参数,稍后调用者可以使用它,但在汇编中,您可以执行所有操作。您将输入推送到堆栈以供稍后用作函数add_stack的参数。如何对这些值进行排序并将它们存储回堆栈中的原始位置:

%include "asm_io.inc"

segment .data
;
; Output strings
;
prompta         db    "Enter the 1st number: ", 0
promptb         db    "Enter the 2nd number: ", 0
promptc         db    "Enter the 3rd number: ", 0
promptd         db    "The sorted list is: ", 0

segment .text
        global  _asm_main
_asm_main:
        enter   0,0               ; setup routine
        pusha

        mov     eax, prompta
        call    print_string
        call    read_int
        push    eax

        mov     eax, promptb
        call    print_string
        call    read_int
        push    eax

        mov     eax, promptc
        call    print_string
        call    read_int
        push    eax

        call    sort_stack      ; Three arguments pushed before

        mov     eax, promptd
        call    print_string

        mov     ecx, 3          ; Pop and write the arguments for `sort_stack`
        .print_list:
        pop     eax
        call    print_int
        mov     al, 32
        call    print_char
        loop    .print_list
        call    print_nl

        popa
        mov     eax, 0            ; return back to C
        leave
        ret

sort_stack:
        enter   0,0

        mov     ecx, [ebp+8]
        mov     ebx, [ebp+12]
        mov     eax, [ebp+16]

        cmp     eax, ebx
        jg      .1
        xchg    eax, ebx

        .1:
        cmp     ebx, ecx
        jg      .2
        xchg    ebx, ecx

        .2:
        cmp     eax, ebx
        jg      .3
        xchg    eax, ebx

        .3:                     ; Write back the registers
        mov     [ebp+8], ecx
        mov     [ebp+12], ebx
        mov     [ebp+16], eax

        leave
        ret

我不确定,如果你的老师会喜欢这个“技巧”。