فراخوانی پارامتر های تابع از درون پشته در زبان اسمبلی

the_king

مدیرکل انجمن
فرض کنیم که یک تابع داشته باشیم که بخواهد دو پارامتر ورودی 32 بیتی x و y را از درون پشته بخواند و بعد از محاسبه
عبارت زیر، حاصل 32 بیتی آنرا در پشته قرار دهد (مقدار بازگشتی تابع) :
کد:
2 * x + 3 * x * y - 5 * y

در برنامه زیر، تابع مذکور پیاده سازی شده و با دو مقدار نمونه که در x و y قرار می گیرد فراخوانی شده و مقدار
بازگشتی نمایش داده می شود :

کد:
.MODEL SMALL
.STACK
.DATA
    msg1    DB 13,10,"x = $"
    msg2    DB " , y = $"
    msg3    DB 13,10,"2 * x + 3 * x * y - 5 * y = $"
    msg4    DB 13,10,"Press any key to continue.",13,10,"$"
.CODE
.STARTUP
.386
    MOV     AH, 9
    LEA     DX, msg1
    INT     21H
    MOV     EAX, 2
    PUSH    AX
    CALL    print_dec_eax
    MOV     AH, 9
    LEA     DX, msg2
    INT     21H
    MOV     EAX, 3
    PUSH    AX
    CALL    print_dec_eax
    MOV     AH, 9
    LEA     DX, msg3
    INT     21H
    CALL    my_function
    POP     EAX
    CALL    print_dec_eax
    MOV     AH, 9
    LEA     DX, msg4
    INT     21H
    MOV     AH, 8
    INT     21H
    .EXIT

my_function:
    PUSH    BP
    MOV     BP, SP
    MOV     BL, SS:[BP+6]
    MOV     BH, SS:[BP+4]
    MOV     ECX, 0
    MOV     CL, BL
    ADD     CX, CX
    MOV     EAX, 0
    MOV     AL, BL
    MUL     BH
    MOV     EDX, 3
    MUL     EDX
    ADD     ECX, EAX
    MOV     EAX, 5
    MUL     BH
    SUB     ECX, EAX    
    MOV     SS:[BP+4], ECX
    POP     BP
    RET

print_dec_eax:
    PUSH    EAX
    PUSH    EBX
    PUSH    ECX
    PUSH    EDX
    CMP     EAX, 0
    JGE     next_1
    PUSH    EAX
    MOV     AH, 2
    MOV     DL, "-"
    INT     21H
    POP     EAX
    NEG     EAX
next_1:
    MOV     CX, 0
    MOV     EBX, 10
loop_1:
    MOV     EDX, 0
    DIV     EBX
    PUSH    DX
    INC     CX
    CMP     EAX, 0
    JNE     loop_1
    MOV     AH, 2
loop_2:
    POP     DX
    ADD     DL, "0"
    INT     21H
    LOOP    loop_2
    POP     EDX
    POP     ECX
    POP     EBX
    POP     EAX
    RET
END
 

جدیدترین ارسال ها

بالا