PDA

View Full Version : سوال: فاکتوریل



maryam*
چهارشنبه 07 اردیبهشت 1390, 21:53 عصر
محاسبه ی فاکتوریل در زبان اسمبلی:ناراحت:
اگه کسی کمکم کند ممنون میشم

tdkhakpur
پنج شنبه 08 اردیبهشت 1390, 02:02 صبح
برای یادگیری اسمبلی و برنامه نویسی پیشرفته در ان بهترین راه اینه که برنامه رو با زبانهای سطح بالاتری مانند سی یا پاسکال بنویسید بعد عمل تبدیل به کد اسمبلی رو انجام بدید.


; 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
LOCAL E0, E1, E2, E3, EXIT_
;-------------------------------------------------------------;
MOV AX, NUMBER ;
MOV BX, 0 ;
MOV CX, 10 ;
E0: ;----------------------------------------------; ;
XOR DX, DX ; ;
DIV CX ; ;
MOV BYTE PTR BUFFER[BX], DL ; BAGIMANDEH IN DX ; ;
ADD BYTE PTR BUFFER[BX], 30H ; ;
INC BX ; ;
CMP AX, 10 ; KHAREGE GHESMAT IN AX ; ;
JNL E0 ;----------------------------------------------; ;
CMP AL, 0 ;
JE E1 ;--------------------------; ;
MOV BYTE PTR BUFFER[BX], AL ; ;
ADD BYTE PTR BUFFER[BX], 30H ; ;
JMP E2;-----------------------; ; ;
E1: ;---------------------------;---; ;
DEC BX ; ;
E2: ;---------------------------; ;
;-------------------------------------------------------------;
MOV DI, 0
MOV SI, BX
MOV CX, BX
INC CX
SHR CX, 1 ; DIVID BY 2
CMP CX, 1
JL EXIT_
E3: ;----------------------------------------------;
MOV DL, BYTE PTR BUFFER[DI] ;
MOV DH, BYTE PTR BUFFER[SI] ;
MOV BYTE PTR BUFFER[SI], DL ;
MOV BYTE PTR BUFFER[DI], DH ;
INC DI ;
DEC SI ;
LOOP E3 ;----------------------------------------------;
EXIT_:
INC BX
MOV BYTE PTR BUFFER[BX], '$' ;0
ENDM
;---------------------------------------------
stacksg segment para stack 'stack'
stacksg ends
datasg segment para 'data'
toFact dw 5
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
;;;;;;;;;;;;;;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