سورس محاسبه فاکتوریل (۱۶ بیتی) به زبان اسمبلی
در این بخش سورس محاسبه فاکتوریل (۱۶ بیتی) به زبان اسمبلی را برای شما آماده کرده ایم که با استفاده از زبان برنامه نویسی Assembly نوشته شده است. در ادامه می توانید توضیحات و تصاویر مربوط به این پروژه را مشاهده کنید.
توضیحات پروژه
فاکتوریل (Factorial) یکی از شاخه های ریاضی است که در ترکیبات بسیار مورد استفاده قرار می گیرد. در ریاضیات فاکتوریل هر عدد از حاصل ضرب آن عدد در تمام اعداد صحیح کوچکتر از خودش (به جز صفر) بدست می آید. علامتی که به منظور نمایش فاکتوریل استفاده می شود، علامت تعجب (!) است. مانند n! (به صورت n فاکتوریل خوانده می شود). برای مثال فاکتوریل عدد 5 به شکل زیر محاسبه می شود.
1 | 5! = 1 × 2 × 3 × 4 × 5 = 120 |
سورس کد این پروژه می تواند به شما کمک کند تا نحوه پیاده سازی الگوریتم ها در زبان برنامه نویسی اسمبلی را یاد بگیرید. این برنامه با استفاده از برنامه Emu8086 نوشته شده است که می توانید آن را از لینک مورد نظر دانلود کنید.
قسمت های از سورس کد
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 | putc macro char push ax mov al, char mov ah, 0eh int 10h pop ax endm org 100h jmp start result dw ? start: ; get first number: mov dx, offset msg1 mov ah, 9 int 21h jmp n1 msg1 db 0Dh,0Ah, 'enter the number: $' n1: call scan_num ; factorial of 0 = 1: mov ax, 1 cmp cx, 0 CMP AL, '0' JAE ok_AE_0 JMP remove_not_digit ok_AE_0: CMP AL, '9' JBE ok_digit remove_not_digit: PUTC 8 ; backspace. PUTC ' ' ; clear last entered not digit. PUTC 8 ; backspace again. JMP next_digit ; wait for next input. ok_digit: ; multiply CX by 10 (first time the result is zero) PUSH AX MOV AX, CX MUL CS:ten ; DX:AX = AX*10 MOV CX, AX POP AX ; check if the number is too big ; (result should be 16 bits) too_big: MOV AX, CX DIV CS:ten ; reverse last DX:AX = AX*10, make AX = DX:AX / 10 MOV CX, AX PUTC 8 ; backspace. PUTC ' ' ; clear last entered digit. PUTC 8 ; backspace again. JMP next_digit ; wait for Enter/Backspace. stop_input: ; check flag: CMP CS:make_minus, 0 JE not_minus NEG CX not_minus: PRINT_NUM_UNS PROC NEAR PUSH AX PUSH BX MOV CX, 0 ; set flag. MOV DX, 0 DIV BX ; AX = DX:AX / BX (DX=remainder). ; print last digit ; AH is always ZERO, so it's ignored ADD AL, 30h ; convert to ASCII code. PUTC AL MOV AX, DX ; get remainder from last div. skip: ; calculate BX=BX/10 PUSH AX MOV DX, 0 MOV AX, BX DIV CS:ten ; AX = DX:AX / 10 (DX=remainder). MOV BX, AX POP AX JMP begin_print print_zero: PUTC '0' end_print: POP DX POP CX POP BX POP AX RET PRINT_NUM_UNS ENDP ten DW 10 ; used as multiplier/divider by SCAN_NUM & PRINT_NUM_UNS. |
هیچ نظری ثبت نشده است