פרק 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
ברק גונן