the_king
مدیرکل انجمن
فرض کنیم که یک تابع داشته باشیم که بخواهد دو پارامتر ورودی 32 بیتی x و y را از درون پشته بخواند و بعد از محاسبه
عبارت زیر، حاصل 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