פרק 7 - פקודות אריתמטיות לוגיות והזזה

Download Report

Transcript פרק 7 - פקודות אריתמטיות לוגיות והזזה

‫‪1‬‬
‫ברק גונן‬
‫‪2‬‬
‫‪‬‬
‫פקודות אריתמטיות‬
‫‪‬‬
‫פקודות לוגיות‬
‫‪‬‬
‫פקודות הזזה‬
‫◦‬
‫◦‬
‫◦‬
‫◦‬
‫◦‬
‫◦‬
‫◦‬
‫◦‬
‫‪ADD, INC‬‬
‫‪SUB, DEC‬‬
‫‪MUL‬‬
‫‪DIV‬‬
‫‪AND‬‬
‫‪OR‬‬
‫‪XOR‬‬
‫‪NOT‬‬
‫◦ ‪SHL‬‬
‫◦ ‪SHR‬‬
‫ברק גונן‬
‫‪‬‬
‫‪‬‬
‫‪3‬‬
‫מחברת את אופרנד המקור עם אופרנד היעד‬
‫התוצאה נשמרת באופרנד היעד‬
‫ברק גונן‬
‫‪‬‬
‫צרו מערך בן ‪ 4‬בתים‪ .‬בתחילת התוכנית הזינו לתוכו‬
‫ארבעה ערכים‪ -‬הזינו ערכים קטנים (פחות מ‪ .)50-‬חשבו‬
‫את סכום האיברים במערך לתוך רגיסטר כלשהו‪.‬‬
‫◦ כעת שימרו במערך ערכים שכולם גדולים מ‪ .100-‬האם התוכנית‬
‫עובדת? מה צריך לשנות בה?‬
‫‪‬‬
‫‪4‬‬
‫הגדירו משתנים‪ var1, var2 :‬בגודל בית ומשתנה ‪.sum‬‬
‫שימרו את סכום ‪ var1, var2‬בתוך ‪.sum‬‬
‫ברק גונן‬
‫‪‬‬
‫‪‬‬
‫‪5‬‬
‫קיצור של ‪Subtract‬‬
‫מחסרת את אופרנד המקור מאופרנד היעד‬
‫ברק גונן‬
‫‪‬‬
‫‪6‬‬
‫צרו שלושה מערכים בני ‪ 4‬בתים‪ .‬אתחלו את שני‬
‫המערכים הראשונים עם ערכים כלשהם‪ .‬הכניסו לתוך‬
‫המערך השלישי את החיסור של שני המערכים הראשונים‬
‫(לדוגמה המערך הראשון ‪ 9,8,7,6‬המערך השני‬
‫‪ .6,7,8,9‬חיסור המערכים הוא ‪)3,1,-1,-3‬‬
‫ברק גונן‬
‫‪‬‬
‫בעקבות הנפוצות של פעולות הוספת ‪ /‬חיסור ‪ ,1‬הוגדרו‬
‫פקודות מיוחדות‬
‫◦ ‪ -INC‬קיצור של ‪Increase‬‬
‫◦ ‪ -DEC‬קיצור של ‪Decrease‬‬
‫‪7‬‬
‫ברק גונן‬
‫‪‬‬
‫‪‬‬
‫‪ -MUL‬קיצור של ‪Multiply‬‬
‫כאשר מבצעים כפל בין שני אופרנדים‪ ,‬שמירת התוצאה‬
‫עשויה לדרוש כמות ביטים גדולה יותר‬
‫◦ כפל של אופרנדים בגודל ‪ 8‬ביט ‪ 16 >-‬ביטים‬
‫◦ כפל של אופרנדים בגודל ‪ 16‬ביט‪ 32 >-‬ביטים‬
‫‪8‬‬
‫ברק גונן‬
‫‪‬‬
‫‪‬‬
‫‪9‬‬
‫האסמבלר ישמור את התוצאה ב‪ax-‬‬
‫דוגמה‪:‬‬
‫◦ ‪al=0ABh‬‬
‫◦ ‪bl=10h‬‬
‫◦ ‪ax=al*bl=0AB0h‬‬
‫‪ah=0Ah ‬‬
‫‪al=0B0h ‬‬
‫ברק גונן‬
dx:ax-‫האסמבלר ישמור את התוצאה ב‬
:‫דוגמה‬
ax=0AB0h ◦
bx=1010h ◦
dx:ax=ax*bx=0ABAB00h ◦
dx=0ABh 
ax=0AB00h 
‫ברק גונן‬


10
‫‪‬‬
‫כמה זה ‪ 11111011b‬כפול ‪?00000010b‬‬
‫‪‬‬
‫בשיטת המשלים ל‪:2-‬‬
‫‪‬‬
‫אז מה התוצאה?‬
‫◦ ‪ 11111011‬שווה ‪ 251‬או ‪-5‬‬
‫◦ ‪ 00000010‬שווה ‪2‬‬
‫◦ ‪ 00000010‬אינו שווה ‪-254‬‬
‫‪ ‬מחוץ לתחום המוגדר ע"י ‪ 8‬ביט ‪signed‬‬
‫‪11‬‬
‫ברק גונן‬
-‫אנו חייבים להודיע לאסמבלר האם להתייחס לערכים כ‬
unsigned ‫ או‬signed

unsigned -MUL ‫◦ פקודת‬
signed -IMUL ‫◦ פקודת‬
mov
mov
imul
bl, 00000010b
al, 11111011b
bl ; -10
mov
mov
mul
bl, 00000010b
al, 11111011b
bl ; 502
‫ברק גונן‬
12
‫‪‬‬
‫הגדירו שני מערכים‪ ,‬בכל מערך ‪ 4‬ערכים מסוג בית‪,‬‬
‫‪ .signed‬שימו בהם ערכים התחלתיים‪ .‬בצעו כפל של‬
‫המערכים והכניסו את התוצאה לתוך ‪.sum‬‬
‫◦ לטובת הפשטות‪ ,‬הניחו שהתוצאה נכנסת ב‪word-‬‬
‫◦ הדרכה‪ :‬אם שמות המערכים הם ‪ a‬ו‪ ,b -‬אז‬
‫…‪sum = a[0]*b[0]+a[1]*b[1]+‬‬
‫‪13‬‬
‫ברק גונן‬
‫‪‬‬
‫‪‬‬
‫קיצור של ‪Divide‬‬
‫כאשר מבצעים חילוק באופרנדים‪ ,‬יש צורך לשמור הן את‬
‫המנה והן את השארית‬
‫◦ אופרנדים של ‪ 8‬ביט‪ :‬המנה ב‪ ,al-‬השארית ב‪ah-‬‬
‫◦ אופרנדים של ‪ 16‬ביט‪ :‬המנה ב‪ ,ax-‬השארית ב‪dx-‬‬
‫‪14‬‬
‫ברק גונן‬
‫‪‬‬
‫‪‬‬
‫נניח ‪.ax=10h, bx=2h‬‬
‫מה תהיה תוצאת הפקודה הבאה?‬
‫‪div bx‬‬
‫‪‬‬
‫התשובה תלויה בערך של ‪!dx‬‬
‫◦ לפני חלוקה של ‪ 16‬ביט יש לוודא שב‪ dx-‬אין ערך אקראי‬
‫◦ לפני חלוקה של ‪ 8‬ביט יש לוודא שב‪ ah-‬אין ערך אקראי‬
‫‪15‬‬
‫ברק גונן‬
IDEAL
MODEL small
STACK 100h
DATASEG
CODESEG
start:
mov
mov
mov
mov
mov
div
mov
mov
mov
div
quit:
mov
int
END start
ax, @data
ds, ax
al, 7
bl, 2
ah, 0
bl
ax, 7
dx, 0
bx, 2
bx
‫מה יהיו ערכי‬
‫הרגיסטרים בזמן ריצת‬
‫ לאחר הרצת‬,‫התוכנית‬
?‫הפקודות המודגשות‬

ax, 4c00h
21h
‫ברק גונן‬
16
‫‪‬‬
‫‪‬‬
‫‪17‬‬
‫פקודת ‪ div‬משמשת לחילוק מספרים ‪unsigned‬‬
‫פקודת ‪ idiv‬משמשת לחילוק מספרים ‪signed‬‬
‫ברק גונן‬
‫‪‬‬
‫‪‬‬
‫‪18‬‬
‫קיצור של ‪Negative‬‬
‫מציאת המשלים ל‪ 2-‬של האופרנד‬
‫ברק גונן‬
‫‪‬‬
‫‪‬‬
‫שימושיות כשרוצים לשנות ביטים בודדים‬
‫מתי רוצים לעבוד עם ביטים בודדים?‬
‫◦ "דחיסה" של מידע‬
‫◦ הצפנה‬
‫‪00000000 00000001 00000001 00000001 00000000 00000000 00000001 00000000‬‬
‫מידע דחוס‪:‬‬
‫מידע מוצפן‪ -‬כל ביט‬
‫שני הפוך‪:‬‬
‫‪19‬‬
‫ברק גונן‬
‫‪01110010‬‬
‫‪00100111‬‬
and
and
and
and
and
not
not
/
/
/
/
/
or/
or/
or/
or/
or/
xor
xor
xor
xor
xor
register, register
memory, register
register, memory
register, constant
memory, constant
register
memory
:‫סט הפקודות‬
AND
OR
XOR
NOT
◦
◦
◦
◦
‫להלן צורות‬
.‫הכתיבה החוקיות‬
‫ברק גונן‬


20
‫‪‬‬
‫‪‬‬
‫מקבלת כקלט שני אופרנדים‬
‫מבצעת את הפעולה על כל ביט בנפרד לפי טבלת האמת‬
‫‪0000 0111 and‬‬
‫‪1001 0110‬‬
‫‪---------‬‬‫‪0000 0110‬‬
‫‪21‬‬
‫ברק גונן‬
‫‪‬‬
‫איך אפשר לבדוק באמצעות פקודת ‪:AND‬‬
‫◦ אם מספר (‪ 8‬ביט) הוא זוגי?‬
‫◦ אם מספר (‪ 8‬ביט) מתחלק ב‪?4-‬‬
‫◦ אם מספר ‪ 8( signed‬ביט) הוא שלילי?‬
‫‪‬‬
‫מסכה )‪ (MASK‬אוסף של ביטים שמאפשר לנו לבודד‬
‫ולפעול על ביטים מסויימים‬
‫◦ מסכה לבדיקה אם מספר הוא זוגי ‪0000 0001‬‬
‫‪ ‬פעולת ‪ AND‬של מספר זוגי עם המסכה תיתן תמיד ‪0‬‬
‫‪ ‬פעולת ‪ AND‬של מספר אי זוגי עם המסכה תיתן תמיד ‪1‬‬
‫‪22‬‬
‫ברק גונן‬
‫‪‬‬
‫מקבלת שני אופרנדים ופועלת על כל ביט לפי טבלת האמת‬
‫‪‬‬
‫שימושית כשרוצים "להדליק" ביט‬
‫‪0100 0111 or‬‬
‫‪0001 0000‬‬
‫‪---------‬‬‫‪0101 0111‬‬
‫‪23‬‬
‫ברק גונן‬
‫‪‬‬
‫מקבלת שני אופרנדים ופועלת על כל ביט לפי טבלת האמת‬
‫‪‬‬
‫שקולה לחיבור מודולו ‪2‬‬
‫‪‬‬
‫‪24‬‬
‫‪ XOR‬של רצף ביטים עם רצף ביטים זהה תמיד שווה אפס‬
‫◦ תכונה שימושית להצפנה‬
‫‪◦ xor‬‬
‫‪ax, ax ; mov ax, 0‬‬
‫ברק גונן‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫ברשותנו מסר שאנו רוצים להצפין‬
‫נגדיר מפתח הצפנה‬
‫המסר המוצפן הוא ‪ XOR‬בין‬
‫המסר לבין מפתח ההצפנה‬
‫פענוח המסר בעזרת ‪ XOR‬נוסף‬
‫עם מפתח ההצפנה‬
‫◦ ללא המפתח אי אפשר לפענח את‬
‫המסר‬
‫‪25‬‬
‫ברק גונן‬
‫מסר‪:‬‬
‫‪1001 0011‬‬
‫מפתח‪:‬‬
‫‪0101 0100‬‬
‫‪1001 0011 xor‬‬
‫‪0101 0100‬‬
‫‪---------‬‬‫מסר מוצפן‪1100 0111 :‬‬
‫‪1100 0111 xor‬‬
‫‪0101 0100‬‬
‫‪---------‬‬‫מסר ‪1001 0011‬‬
‫מפוענח‪:‬‬
‫‪‬‬
‫הגדירו מערך בשם ‪ msg‬שהוא אוסף של תווי‬
‫‪ .ASCII‬לדוגמה '‪.'I LIKE ASSEMBLY$‬‬
‫◦ תו ה‪ $-‬משמש להדפסת המחרוזת‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪26‬‬
‫הגדירו מפתח הצפנה בן ‪ 8‬ביטים‪ ,‬לבחירתכם‪.‬‬
‫הצפינו את המסר בעזרת מפתח ההצפנה‬
‫פענחו את המסר בעזרת מפתח ההצפנה‪.‬‬
‫בידקו ב‪ DATASEG-‬את המסר לאחר ההצפנה‬
‫ולאחר הפענוח‪.‬‬
‫למעוניינים להדפיס את המסר ואת המסר המוצפן‪,‬‬
‫ניתן להשתמש בקוד הבא‪.‬‬
‫ברק גונן‬
‫‪; print msg‬‬
‫‪mov‬‬
‫‪dx, offset msg‬‬
‫‪mov‬‬
‫‪ah, 9h‬‬
‫‪int‬‬
‫‪21h‬‬
‫‪mov‬‬
‫‪ah, 2‬‬
‫‪; new line‬‬
‫‪mov‬‬
‫‪dl, 10‬‬
‫‪int‬‬
‫‪21h‬‬
‫‪mov‬‬
‫‪dl, 13‬‬
‫‪int‬‬
‫‪21h‬‬
‫‪‬‬
‫‪27‬‬
‫פקודת ‪ NOT‬הופכת את כל הביטים באופרנד‬
‫ברק גונן‬
‫‪‬‬
‫מקבלות אופרנד ו"מזיזות" את‬
‫הביטים שלו‬
‫‪‬‬
‫שימושים (נפרט בהמשך)‪:‬‬
‫◦ ‪SHR- Shift Right‬‬
‫◦ ‪SHL- Shift Left‬‬
‫◦‬
‫◦‬
‫◦‬
‫◦‬
‫‪‬‬
‫‪28‬‬
‫כפל וחילוק‬
‫תיקון שגיאות והצפנה‬
‫דחיסה ופריסה של מידע‬
‫כתיבה לזיכרון הוידאו‬
‫להלן צורות כתיבה חוקיות‪.‬‬
‫ברק גונן‬
‫‪register, const‬‬
‫‪register, cl‬‬
‫‪memory, const‬‬
‫‪memory, cl‬‬
‫‪shr‬‬
‫‪shr‬‬
‫‪shr‬‬
‫‪shr‬‬
‫‪/‬‬
‫‪/‬‬
‫‪/‬‬
‫‪/‬‬
‫‪shl‬‬
‫‪shl‬‬
‫‪shl‬‬
‫‪shl‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪29‬‬
‫מזיזה מקום אחד שמאלה את כל הביטים‬
‫דוחפת ‪ 0‬לביט הימני‬
‫מעתיקה לדגל הנשא את הביט הימני‬
‫מבצעת את השלבים הנ"ל כמספר הפעמים שהוגדר בפקודה‬
‫ברק גונן‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪30‬‬
‫מזיזה מקום אחד ימינה את כל הביטים‬
‫דוחפת ‪ 0‬לביט השמאלי‬
‫מעתיקה לדגל הנשא את הביט הימני‬
‫מבצעת את השלבים הנ"ל כמספר הפעמים שהוגדר בפקודה‬
‫ברק גונן‬
2 ‫ביצוע בקלות של פעולות כפל וחילוק בחזקות של‬
8 ‫ בגודל‬unsigned( counter ‫ של המשתנה‬2-‫ חלוקה ב‬:‫◦ דוגמה‬
)‫ביטים‬
shr
[counter], 1
shr ‫פקודת‬
mov
xor
mov
idiv
mov

al, [counter]
ah,ah
[divider], 2
[divider]
[counter], al
idiv ‫פקודת‬
‫ברק גונן‬
31
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫הכניסו ל‪ al-‬את הערך ‪ .3‬בעזרת פקודות הזזה‪ ,‬כיפלו את‬
‫‪ al‬ב‪.4-‬‬
‫הכניסו ל‪ al-‬את הערך ‪( 120‬דצימלי)‪ .‬בעזרת פקודות‬
‫הזזה‪ ,‬חלקו את ‪ al‬ב‪.8-‬‬
‫הכניסו ל‪ al-‬את הערך ‪( 10‬דצימלי)‪ .‬בעזרת פקודות‬
‫הזזה וחיבור‪ ,‬כיפלו את ‪ al‬ב‪.20-‬‬
‫◦ הדרכה‪ :‬התייחסו ל‪ 20-‬בתור סכום של ‪ 16‬ו‪ .4-‬השתמשו‬
‫ברגיסטרים נוספים כדי לשמור חישובי ביניים‪.‬‬
‫‪32‬‬
‫ברק גונן‬
:‫נושאים ללימוד עצמי‬

LFSR ‫◦ הצפנת‬
http://en.wikipedia.org/wiki/Linear_feedback_shift_register 
‫◦ קוד קונבולוציה לתיקון שגיאות‬
http://en.wikipedia.org/wiki/Convolutional_code 
‫ברק גונן‬
33
‫‪‬‬
‫בפרק זה למדנו מגוון פקודות‪:‬‬
‫◦ פקודות אריתמטיות‬
‫◦ פקודות לוגיות‬
‫◦ פקודות הזזה‬
‫‪‬‬
‫‪‬‬
‫סקרנו שימושים שונים של הפקודות‬
‫עדיין חסרה לנו יכולת לכתוב אלגוריתמים ותנאים‬
‫◦ בפרק הבא‬
‫‪34‬‬
‫ברק גונן‬