פייסבוק
Facebook Pagelike Widget
פרסומת

מוודא ריבוע קסם באסמבלי

;התוכנה הבודקת מערך דו מימדי של 3 על 3

;ומוודאת אם הוא ריבוע קסם

;אנו מניחים שהסכום של שורה אינו עולה על 255 (בית אחד) וזהו

.model small

.stack 100h

.data

index db 3; מסמן את מיקום תחילת המערך בזיכרון

sentinal db 0; הערך של השורה הראשונה והזקיף אליו משווים הכל

.code

mov ax,@data

mov ds, ax

; here your program starts

mov ah, 0

mov al, index

push ax

call mem; initializes a square beginning in index

mov ah, 0

mov al, index

push ax

call colomn ; checks equality of columns.

pop cx; בודק מה החזירה התת-תכנית ואם זה 0 היא מסיימת את התוכנה

cmp cl,0;

jz kill;

mov ah, 0

mov al, index

push ax

call rows ; checks for rows' equality

pop cx; בודק מה החזירה התת-תכנית ואם זה 0 היא מסיימת את התוכנה

cmp cl,0;

jz kill;

mov ah, 0

mov al, index

push ax

call diagonal ; checks for diagonals' equality

pop cx; בודק מה החזירה התת-תכנית ואם זה 0 היא מסיימת את התוכנה

cmp cl,0;

jz kill;

jmp good;

kill: mov al, 1 ; כדי להדליק נורה אחת

jmp e-n-d ; קופץ לסוף התוכנית

good: mov al,255; מדליק את כל הנורות כדי לאמר שזהו ריבוע קסם

jmp e-n-d ; קופץ לסוף התוכנית

e-n-d: out 2,al

; here you program ends

mov ah,4ch

int 21h

;——————————תת-תכנית לבדיקת העמודות———

colomn: mov al, 3 ; מונה ללולאה הקטנה

pop dx

pop bx

xor cl, cl ; מאפס

sum: add cl, [bx] ;מייצר זקיף לבדיקה

inc bl

dec al

jnz sum ; סוף לולאת הסכום

mov [1], cl ; מניח את הזקיף

mov ah, 2; לבדוק עוד שתי עמודות

xor cl, cl; מאפס את האוגר

loop: ; לולאה ראשית שמעבירה בין העמודות

cosum: add cl, [bx] ; לולאה שמחשבת את הסכום של העמודה

inc bl

inc al

cmp al, 3 ; בודק אם הוא עבר שלושה תאים

jnz cosum ; סוף הלולאה של סכום העמודה

cmp cl, sentinal ; בודק אם העמודה שווה לעמודה הראשונה

jnz sofnot ; לא שווה מסקנה שזה לא ריבוע קסם

dec ah ; מוריד את המונה כדי להראות כמה עמודות יש עוד לבדוק

jz sof ; כבר בדק שתי עמודות

xor cl, cl; מאפס את האוגר בשביל הבדיקה השנייה

xor al, al; מאפס את הקאונטר

jmp loop; עובר כדי לבדוק את עמודה 2

sofnot: mov cl, 0 ;מעביר שאין ריבוע קסם

push cx

push dx

jmp sofprog; מדלג על ההוראה הבאה על מנת לשמור את ערך האוגר נכון

sof: mov cl, 1; מעביר שיש ריבוע קסם

push cx

push dx

sofprog:

ret

;————————————————-

;——————- תת – תכנית לבדיקת השורות —-

rows: pop dx

pop bx

mov al, 3; מונה ללולאה הקטנה

mov ah, 3; מונה ללולאה הגדולה

xor cl,cl; מאפס את הצובר

rowsum: add cl,[bx] ; מחשב את הסכום של השורה

add bl, 3 ; קופץ לתא הבא בשורה לדוגמה מ- 1,1 ל- 2,1

dec al ; מוריד את המונה באחד

jnz rowsum ; קופץ חזרה עד שהוא מסיים את השורה

cmp cl, sentinal; משווה את השורה לעמודה הראשונה

jnz wrong; אין ריבוע קסם

dec ah ; מוריד אחד מהמונה של הלולאה הגדולה וכך מודיע שעבר לשורה הבאה

jz right; סיים את השורה השלישית

cmp ah, 1; בודק אם הוא בשורה השלישית

jz rowthee; סימן שזו כבר השורה השלישית

mov bl, index;

inc bl ; השורה הזו והשורה הקודמת מעבירות את התוכנה לתא הראשון בשורה השנייה

xor cl,cl ; לאפס את הצובר

mov al, 3; מחזיר את המונה ל – 3

jmp rowsum; חוזר חזרה ללולאה הראשית

rowthee: mov bl, index ; הלולאה מודיעה לתוכנית שזו כבר שורה שלישית

add bl, 2; תא ראשון בשורה השלישית

xor cl,cl ; לאפס את הצובר

mov al, 3; מחזיר את המונה ל – 3

jmp rowsum; חוזר חזרה ללולאה הראשית

wrong: mov cl, 0 ;מעביר שאין ריבוע קסם

push cx

push dx

jmp sofsub; קופץ לסוף התוכנה על מנת לשמור על ערכי המשתנה בוליאן

right: mov cl, 1; מעביר שיש ריבוע קסם

push cx

push dx

sofsub:

ret

;————————————————-

;——————–תת-תכנית לבדיקת אלכסונים —-

diagonal: pop dx

pop bx

mov al, 3; מונה של 3 כדי לספור תאים

mov ah, 2; מונה של הלולאה הראשית לדעת באיזה אלכסון הוא נמצא

xor cl,cl; מאפס את האוגר

jmp diag1sum; קופץ לחשב את האלכסון הראשון

diag2sum: add cl,[bx]; מחשב את האלכסון השני

add bl, 2; קופץ למשבצת הבאה באלכסון

dec al ; מוריד את המונה באחד

jnz diag2sum ; בודק אם הוא כבר עבר על שלושת התאים באלכסון השני

jmp compare; הולך להשוות את האלכסון השני לזקיף

diag1sum: add cl, [bx]; מחשב את האלכסון הראשון

add bl,4; קופץ למקום הבא באלכסון

dec al; מוריד את המונה באחד

jnz diag1sum; בודק אם הוא כבר עבר על שלושת התאים באלכסון הראשון

compare: cmp cl, sentinal; משווה את האלכסון לזקיף

jnz diagwrong; האלכסון לא שווה לזקיף משמע אין ריבוע קסם

dec ah ; מורידה את המונה באחד וככה מסמנת שבדקה כבר אלכסון

jz diagright; הת"ת בדקה את שני האלכסונים והם בסדר

mov bl, 5; מעביר את הנקודה של התחלת האלכסון השני לאוגר

xor cl, cl; מאפס את הצובר

mov al, 3; מחדש את המונה

jmp diag2sum; התכנית בדקה רק את האלכסון הראשון והיא קופצת כדי לחשב את השני

diagwrong: mov cl, 0 ;מעביר שאין ריבוע קסם

push cx

push dx

jmp diagsof; קופץ לסוף התכנה כדי לשמור על ערכי משתנה הבוליאן

diagright: mov cl, 1; מעביר שיש ריבוע קסם

push cx

push dx

diagsof:

ret

;——————————————————————-

;————————- תת – תכנית למילוי ריבוע קסם ————-

mem: pop dx

pop bx

mov [bx], 4

inc bl

mov [bx], 6

inc bl

mov [bx], 2

inc bl

mov [bx], 2

inc bl

mov [bx], 4

inc bl

mov [bx], 6

inc bl

mov [bx], 6

inc bl

mov [bx], 2

inc bl

mov [bx], 4

mov al, 0

out 2 ,al

push dx

ret

;—————————————————————-

end

כתיבת תגובה

האימייל לא יוצג באתר. שדות החובה מסומנים *

*

צ\'אט
  • קצת סאסי אם אתה שואל אותי
    דוד שקלברג
    10 January 2022
  • shaked liberman
    איזה גבר
    10 October 2021
  • אבי
    מגנובי
    19 July 2021
  • מלי
    יש למישהו הערכה חלופית במחשבת
    10 May 2021
  • Simba The King
    סימבה יא מלך יא סוס רצח, אחי אתה מלך אחושרמוטה הצלת לי את התחת בכמה עבודות מזוינות שנתנו לי מהבצפר יא מלך רצח נודץץץץ נדץץץץץץ אחי יא מלך באמת חברה שימו מסכה או אני נותן דוח פאק כואב לי ה...
    17 January 2021
  • JJ
    JJJ
    20 October 2020
  • ד
    דינה אקסלרוד
    29 September 2020
  • רעות אהרון
    גל דרומי גל דרומי גל דרומי גל דרומי גל דרומי גל דרומי גל דרומי גל דרומי גל דרומי גל דרומי גל דרומי גל דרומי גל דרומי גל דרומי גל דרומי גל דרומי גל דרומי גל דרומי גל דרומי
    29 September 2020
  • ד
    גכגכ
    29 September 2020
  • דן ביקלס
    @sagi_amram
    29 September 2020
Your Shout