
27-05-2006, 12:37
|
|
|
|
חבר מתאריך: 26.05.06
הודעות: 19
|
|
אני קצת לא מבין את ההסבר שרשמת על התוכנית... :(
אז אני אנסה להסביר את התוכנית שרשמתי... (ניסיתי לכתוב תוכנית ב-8086 אבל אני ממש לא זוכר את כל הפקודות, מצטער).
בכל מקרה:
MOV R0,#50 ; מעביר את כתובת ההתחלה של המערך למשתנה R0
MOV R4,#3 ; מעביר את מספר האיברים במערך למשתנה R4
DEC R4 ; מחסר ב-1 את R4
MOV R1,R4 ; מעביר את מספר האיברים שבמערך (פחות 1) למשתנה R1
MOV R2,R4 ; מעביר את מספר האיברים שבמערך (פחות 1) למשתנה R2
AGAIN: MOV A,@R0 ; (תווית AGAIN) + העברת התוכן עליה מצביע R0 בזיכרון למשתנה A
INC R0 ; קידום ההצבעה בזיכרון בכתובת 1
MOV R3,@R0 ; העברת התוכן עליה מצביע כעת R0 בזיכרון למשתנה R3
CJNE A,R3,CONT1 ; חיסור בין המשתנה A ל-R3 (ללא שמירת התוצאה, אלא, להשפעה על הדגלים בלבד) + אם התוצאה יוצאת 0, קפיצה ל-CONT1 (הלוא היא השורה הבאה בכל מקרה ).
CONT1: JC CONT2 ; אם היה נשא, כלומר, התוצאה ב-A קטנה מהתוצאה ב-R3, נקפוץ להמשך התוכנית (ללא החלפת המספרים במערך).
; אם לא היה נשא, כלומר, התוצאה ב-R3 קטנה מזו שב-A (כלומר, המערך לא מסודר נכון), נבצע פעולת החלפת המספרים במערך.
MOV @R0,A ; העברת המספר שבמשתנה A למיקומו החדש במערך.
DEC R0 ; החזרת המצביע R0 מקום 1 אחורה בזיכרון.
MOV @R0,R3 ; העברת המספר שבמשתנה R3 למיקומו החדש במערך.
INC R0 ; קידום המצביע R0 מקום 1 קדימה (חזרה למקומו המקורי) במערך.
CONT2: DJNZ R1,AGAIN ; נוריד 1 ממונה מספר הפעמים שיש לבצע את המעבר על המערך, אם לא הגענו ל-0, נחזור לתווית AGAIN.
MOV R0,#50 ; אתחול כתובת המצביע לתחילת המערך שוב.
DEC R4 ; חיסור 1 ממונה כללי של מספר איברי המערך.
MOV R1,R4 ; אתחול המונה R1 במספר האיברים הנותרים שיש לסרוק במערך.
DJNZ R2,AGAIN ; חיסור 1 ממונה R2 שסופר כמה פעמים נותרו למעבר על איברי המערך.
בעיקרון, הנה הסבר לשיטת הפעולה של התוכנית:
בוא ניקח דוגמא מערך של 3 איברים המסודר כך: 1 2 3, אנו רוצים להגיע למערך כך: 3 2 1.
התוכנית תיקח את שני המספרים הראשונים, תשווה בינהם ובמקרה שלנו, תגלה ש-3 גדול מ-2 ותחליף בינהם (המערך החדש 1 3 2). לאחר מכן התוכנית תבדוק את שני המספרים האחרונים, תגלה ש-3 גדול מ-1 ותחליף בינהם (המערך החדש 3 1 2). כעת, התוכנית תעבור שוב על המערך מהתחלתו אבל עבור איבר אחד פחות, כלומר, היא תשווה שוב בין המספר הראשון לשני, בין 2 ל-1, תגלה ש-2 גדול מ-1 ותחליף בינהם (המערך החדש 3 2 1). כעת תיגמר התוכנית כאן.
מקווה שבעזרת ההסברים תוכל לתרגם את התוכנית לאסמבלר של ה-8086 (כי אני ממש לא זוכר את הפקודות) ומצטער שלא יכולתי לעזור יותר... אם עדיין יש לך שאלות, אני אשמח לענות 
|