שבוע 4 סינטקס של HACK ASSEMBLY ניתן להשתמש בשלושה אוגרים בלבד:,A,D,M כולם בעלי 16 ביטים. M אינו אוגר ישיר- הוא מסמן את האוגר של ה RAM שאנחנו מצביעים עליו כרגע )A מצביע עליו(. יש שני סוגי פקודות, פקודת A ופקודת C. פקודת A: הדרך היחידה להכניס קבוע השונה מ 1\1\0 - למערכת. לאחר השימוש בפקודה זו נוכל לגשת למקום בזיכרון עם הכתובת שבאוגר A, )או ל RAM בעזרת האוגר M או לROM בעזרת פקודת C( או להכניס את הקבוע לתוך אוגר D ע"מ להשתמש בו בהמשך. הפנייה למיקום כלשהו. לדוגמה, יגרום למחשב להסתכל על אוגר מספר 4. אז לאחר פקודה זו נקבל @4 A=4 ]4[RAM הוא האוגר ש M מתייחס אליו. דוגמה פשוטה: איך נשנה את הערך של אוגר 150 ל 5? @5 D=A @150 פקודות C: מורכבת מבחירת יעד התוצאה, החישוב והאם לאחר ביצוע הפקודה נבצע קפיצה ומאיזה סוג )קפיצה למקום אחר בקוד-בROM המוצבע ע"י הערך באוגר A(.
השפעה על המסך המסך מוגדר ברצף של 8192 אוגרים, החל מכתובת 16384 ועד כתובת 24575. התוכן של האוגרים הללו מגדיר את הפיקסלים שעל המסך- ביט 0 משמעו לבן, בין 1 משמעו שחור. כמובן, כל אוגר מוגדר להיות 16 ביטים, ולכן כדי להציג משהו על המסך נצטרך לעדכן את כל הביטים שברצוננו. בשפה יש כמה מילים שמורות: SCREEN האוגר הראשון של המסך. 16384. KBD האוגר של המקלדת )נדבר עליו עוד מעט(. 24576. באופן טבעי,,KBD-SCREEN=8192 אז לא צריך באמת לזכור את המספרים מהפסקה הקודמת R0,R1,R2,, R15 כתובות.15,0,1
נוסחה לשינוי פיקסל ספציפי על המסך: i=32*row+col\16 כך נקבל את המקום בזכרון בו הפיקסל שלנו נמצא )באותו מקום בזכרון גם 16 פיקסלים נוספים( ע"מ לשנות פיקסל ספציפי אנו נצטרך להשתמש בBITWISE OR\AND כאשר הפיקסל אותו נרצה לשנות יהיה במקום הcol%16 בbus )בספירה מLSB לMSB ( איך מבצעים את זה? האמת שזה חלק מהמטלה שלכם. יש לכם לבנות קוד שממלא מסך בפיקסלים, ויש לכם לכתוב קוד שמבצע מכפלה. אינטואיציה: times).a*b = a+a+a+ +a (b דוגמה שכן נעשה: חישוב סכום מ 1 עד n כאשר n רשום באוגר 0, את התוצאה יש לשים באוגר 1. Psuedo code: n=r0 i=1 sum=0 LOOP: if i>n goto STOP sum=sum+i i++ goto LOOP STOP: R1=sum איך מתרגמים את זה לאסמבלי של?Hack לשלוף את הערך מהאוגר הראשון// הערך נכנס לאוגר D// @R0 נשים את הערך בתוך אוגר שיהווה המשתנה n// @sum //נאפס את האוגר שיהווה המונה שלנו 0=M תחילת לולאה// נבדוק מהוi // נבדוק האם כבר הגענו ל n// לאיפה קופצים אם באמת סיימנו// (LOOP) @i D=D-M @STOP אם באמת i עקף את n קפוץ// D;JGT
קדם את הסכום// @sum שים באוגר את הערך הקודם// מהו i?// הוסף אותו לסכום שהיה// שמור את הסכום החדש// קדם את המונה באחד// הקפיצה תהיה לתוויתLOOP //.קפוץ ללא תנאי. פשוט קפוץ// @i D=D+M @sum @i M=M+1 @LOOP (STOP) @sum משוך את הסכום מהאוגר// שים אותו באוגר שהוגדר להכיל את התוצאה// לאיפה לקפוץ// (END).בלי תנאי. לולאה אינסופית // למה צריך לולאה סופית בסוף הקוד? אם לא נשים אותה, PC ימשיך להתקדם ולקרוא את הפקודות הבאות, שהן ריקות, ואז האקר יכול לשתול בהן פקודות זדוניות. נציג גם קוד שמבצע מניפולציה על פיקסלים של המסך: התרגיל: צבעו פיקסלים בשחור על המסך, ככמות האוגרים הרשומה באוגר R2. שימו לב, אנחנו צריכים לאתחל את האוגר R2 לערך כלשהו, ולשים לב להוסיף למה שרשמנו את הערך של,SCREEN כלומר,.16384 //put in R2 value of a register greater than SCREEN @SCREEN //use SCREEN address D=A //we want to get the number of the address to which we print @addr //put the address in a variable addr (LOOP) @addr //make the pixes black A=M //now RAM[A] = RAM[address] M=-1 //-1 = 1111111111111111
@addr M=M+1 //addr++ for next 16 pixels @R2 //check if we finished, by the value written in R2. //pull R2 value @addr D=D-M //check if R2-addr>0 @LOOP D;JGT //yes. We haven't finished. Loop. (END) //finished. Infinite loop pseudo code: n=r0 R1=0; fib1=1; fib0=0; for(int i=1 ;i<n;i++){ R1=fib0+fib1; fib0=fib1; fib1=r1; } @R0 M=0 //R1=0 חישוב מספר fibonacci הn לפי הערך שנמצא ברגיסטר R0 ואחסון התוצאה בR1. קוד באסמבלי.HACK )אפשר אולי לקצר עם קצת יותר השקעה( //n=r0 what fibonacci number we want to calculate. @f0 M=0 M=1
D;JEQ //if n=0 we can finish since R1 has 0 in it @test -1 1//if n=1 we can put 1 in R1 and finish. D;JEQ M=M-1 M=M-1 (LOOP)//otherwise n>=2 so we decrement m by 2 and start caculating. @f0 M=M+D @f0 M=M-1 @LOOP D;JGT
(END) (END1) M=1