PDA

View Full Version : سوال: راهنمای در مورد فاکتوریل به روش بازگشتی



ali682344
چهارشنبه 28 مهر 1389, 12:32 عصر
با عرض سلام و خسته نباشيد

چطور در اسمبلي ميشه يه تابع رو به روش بازگشتي نوشت؟

كسي در مورد توابع بازگشتي آموزشي داره؟
اگه يه نمونه تابع بازگشتي مثلا فاكتوريل داريد هم ممنون ميشم (فقط تابع)

tdkhakpur
چهارشنبه 28 مهر 1389, 12:46 عصر
خروجی را خودتان تست کنید.


;extrn proc1:far
stacksg segment para stack 'stack'
stacksg ends
datasg segment para 'data'
res dw 0
cnt dw 4
datasg ends
codes segment para 'code'

main proc
assume ss:stacksg, ds:datasg, cs:codes
mov ax, datasg
mov ds, ax
;------------ ur programm
call proc1
mov dx, res ; خروجی تابع بازگشتی
;------------ end of program
mov ax, 4c00h
int 21h
main endp
proc1 proc
mov cx, cnt
cmp cnt, 0
je jmp1
sub cnt, 1
mov dx, cnt
add res, dx
call proc1
jmp1:
ret
proc1 endp
codes ends
end main

ali682344
چهارشنبه 28 مهر 1389, 13:38 عصر
خروجی را خودتان تست کنید.


;extrn proc1:far
stacksg segment para stack 'stack'
stacksg ends
datasg segment para 'data'
res dw 0
cnt dw 4
datasg ends
codes segment para 'code'

main proc
assume ss:stacksg, ds:datasg, cs:codes
mov ax, datasg
mov ds, ax
;------------ ur programm
call proc1
mov dx, res ; خروجی تابع بازگشتی
;------------ end of program
mov ax, 4c00h
int 21h
main endp
proc1 proc
mov cx, cnt
cmp cnt, 0
je jmp1
sub cnt, 1
mov dx, cnt
add res, dx
call proc1
jmp1:
ret
proc1 endp
codes ends
end main


اقا ممنون ولي من با اين كد مي خواستم خروجيشو ببينم اين علامت چاپ ميشد(◊)

MOV AH,02
INT 21H

tdkhakpur
چهارشنبه 28 مهر 1389, 14:18 عصر
خروجی شما بعد از فراخوانی تابع بازگشتی داخل res و بعد از آن داخل dx قرار داده میشه شما باید عدد موجود در dx را به رشته تبدیل کنید(DECIMAL) و بعد چاپ کنید.

ali682344
چهارشنبه 05 آبان 1389, 10:23 صبح
سلام

من مي خوام اين كد رو به اسمبلي تبديل كنم

double fact(int tofact){ //Recursive function | fact(n) = n!
if(tofact==0)
return 1;
else
return tofact*(fact(tofact-1));
}

اگه در اين مورد راهنمايي كنيد ممنونم ميشم

tdkhakpur
چهارشنبه 05 آبان 1389, 13:16 عصر
من مي خوام اين كد رو به اسمبلي تبديل كنم

double fact(int tofact){ //Recursive function | fact(n) = n!
if(tofact==0)
return 1;
else
return tofact*(fact(tofact-1));
}

اگه در اين مورد راهنمايي كنيد ممنونم ميشم
برای اینکه داخل اسمبلی از پارامتر برای پروسه ها استفاده کنید باید از پشته کمک بگیرید ولی در ایی میان باید مواظب ip هم باشید تا از دست نره به همین دلیل با استفاده از push و pop در محل مناسب از از دست رفتن ip جلوگیری میشه بقیه کاری هست که همه الگوریتمها استفاده میکنند.


; This Macro Chenge HEX Or Binary To Decimal .........................
; NUMBER Is (WORD) .................................................. ..
; BUFFER is address of buffer
; digit is len of buffer or digit numbers
; RETURN : This Macro Return In bp Decimal Number That It
; Has In His End 0
DECIMAL MACRO NUMBER, BUFFER, DIGIT
LOCAL E0, E1, LOOP__, EXIT_
MOV BX, DIGIT
MOV BYTE PTR BUFFER[BX], '$' ;0
MOV CX, BX
LOOP__:;----------------------------------;
DEC BX ;
MOV BYTE PTR BUFFER[BX], 32 ; clear the buffer
LOOP LOOP__;------------------------;
MOV BX, DIGIT
MOV AX, NUMBER
E0:
MOV DX, 0
MOV CX, 10
DIV CX
DEC BX
MOV BYTE PTR BUFFER[BX], DL ; BAGIMANDEH IN DX
ADD BYTE PTR BUFFER[BX], 30H
CMP BX, 0
JE EXIT_
CMP AX, 10
JNL E0
E1:
DEC BX
MOV BYTE PTR BUFFER[BX], AL
ADD BYTE PTR BUFFER[BX], 30H
EXIT_:
ENDM
;---------------------------------------------
stacksg segment para stack 'stack'
stacksg ends
datasg segment para 'data'
toFact dw 4
buf db 12 dup(?)
datasg ends
codes segment para 'code'
main proc far
assume ss:stacksg, ds:datasg, cs:codes
mov ax, datasg
mov ds, ax
;------------ ur programm
call proc1
pop ax
mov toFact , ax
DECIMAL toFact , buf, 5
;;;;;;;;;;;;;;print
mov ah, 9
lea dx, buf
int 21h
;------------ end of program
mov ax, 4c00h
int 21h
main endp
;// toFacr*(proc(toFact-1))
proc1 proc
cmp toFact, 0
jne again;-------------------------------------;
pop bp ; get ip position ;
mov ax, 1 ;
push ax ; push data to stack ;
push bp ; set ip position to rrtuen there ;
ret ;
jmp exit ;
again: ;---------------------------------------;
mov bx, toFact ;----------------------------;
push bx ;
sub toFact, 1 ;
call proc1 ;
pop ax ; first stack data is return value ;
pop bx ; and second is our Current toFact value.;---;
mul bx
pop bp
push ax
push bp
ret
exit:
proc1 endp
codes ends
end main

موفق باشید.