Logo

רד-בורד: ארכיון

ראשי > תיכנות > לימוד אסמבלר

08/09/2004 00:19:26 11010010110
מתחילים ללמד אותנו אסמבלר בבצפר (מגמת אלקטרוניקה)

אני ישים לפה תחומר (גראס חחח) הנלמד בכיתה

אם תתנהגו יפה בסמסטר הבא נלמד סי


אסמבלר
האסמבלר הזה זה של 8086/8088 (XT)

- - - - שיעור 1 - - - -
מבנה המחשב

במחשב יש מעבד, זיכרון ועוד כ מיני שטויות מסביב (כרטיסים עכברים דיסקים וכו)
כל אלה מקושרים ביניהם ע"י 3 פסים של מידע בינארי

פס נתונים Data Bus - מעביר נתונים בין חלקים במחשב
פס כתובות Address Bus - מעביר את הכתובות (של זיכרון וכו’) בין חלקים במחשב
פס בקרה - Control Bus - מבקר על פעולת החלקים של המחשב

מבנה המעבד

במעבד הזה (שהשתמשו איתו לפני +- 20 שנה) יש את החלקים:

IP - Interaction pointer - זה לא "168.192.45.2" אלא מצביע שמבקר על מקום העברת הנתונים במעבד
אוגרים (לא העכברים האלה) - 4 "לוקרים" שבהם אפשר לאחסן מידע בתוך המעבד - בהם נמצאים כל נהתונים שהמעבד עובד איתם אחשו
האוגרים נקראים A, B, C, D. כל אוגר מכיל 16 ביטים ואפשר לחלק כל אחד ל2 חלקים זהים של 8 ביטים (כמו המדף שיש בלוקר) - ואז הם נקראים Ah, Al, Bh, Bl וכו’ - H זה HIGH כלומר הביטים שיהיו ה"גדולים" אם א מחלקים תאוגר וLOW - הנמוכים
כימט לכל אוגר יש תפקיד מסויים למשל B יכול גם להצביע על כתבות בזיכרון וכו’
ALU - יחידה מתמטית לוגית - זה ה"מחשבון" שעושה פעולות על תוכן האוגרים
Flags - דגלים (נתייחס אליהם בעתיד הרחוק)
יחידת בקרה - השוטר של המערכת

שיעורי בית - למי שיש מחשב פתוח יכול להסתכל על הלוח אם (בדרך כלל רואים טוב מאחורה) - יש אזור שלם של חוטים מקבילים ש"יורדים" דרך כל החיבורים של הכרטיסים - זה חלק מהקווים של ה Data Bus & Address Bus & Control Bus .


למנהל - לא לנעול את הנושא כי אנלא הולך להחזיק פה נושא אחד ענק שתוקע תמחשב כשמנסים לגלול אותו (במידת האפשר גם לא למחוק)
08/09/2004 22:42:46 11010010110
- - - - שיעור 2 - - - -
פקודות העברה Mov

פקודת Mov מעבירה מידע בין אוגרים במעבד או בין אוגר וכתובת זיכרון (מה שנמצא במקום שאליו מעתיקים נמחק והמידע החדש נכתב במקום, המידע במקור שממנו מעתיקים נשאר).

דוגמה:
Mov al, ah מעתיקה את המידע של ah ל- al
Mov al, 5 עושה שהמידע בal ייה 5 (בבינארי 00000101)
Mov al, ch עושה שהמידע בal ייה c (בhex) כלומר 12 בעשרוני (או 00001100 בינארי)
Mov [bl], al מעתיקה את המידע שיש בal לכתובת בזיכרון שעליה מצביע bl - סתכלו פה למטה ב"Bx"

סימון הפקודות בתרשימים
mov al, bl
bl -> al

וכו’

שימוש ב- Bx בתור מצביע לכתובת בזיכרון
Bx (האוגר B כשהוא לא מחולק ל- bh/bl) יכול לשמש כמו מצביע לכתובת זיכרון
בשביל זה קודם נכתוב את הכתובת לתוך Bx בבסיס 16 (hex)
Mov bx, 000h
ואז נשתמש איתו בתור מצביע
Mov [bx], al
ואז מה שהי בAl מועתק לזיכרון בכתובת שהמספר שלה רשום בBx

- - אבל - -
Mov bx, al זה לא אותו דבר (בגלל ה- []) ומה שיצא זה העתקה של האוגר al לאוגר bx.


- - - - שיעור 3 - - - -
פעולות חשבון : חיבור וחיסור

הגדלת המספר באוגר ב- 1
Inc al

הקטנת המספר באוגר ב- 1
Dec al

חיבור מספרים
Add ah, al מחשב כמה זה ah+al וכותב תתוצאה בah

חיסור מספרים
Sub ah, al מחשב כמה זה ah-al וכותב תתוצאה בah

אפשר גם לכתוב דברים כמו

Sub ah, 2 (זה עושה ah-2) וכו’

-> נראה לי ש Sub 2,ah לא יעבוד, שיעורי בית : תחשבו למה
08/09/2004 23:15:11 11010010110
- - - - שיעור 4 - - - -
התוכנה הראשונה שלי!!!

לפעמים המחשב עלול להיתקע כשאתם מריצים תתוכניות שלכם זה קורה אם אתם מכניסים מידע משלכםלכתובת זיכרון שנמצאת בשימוש עם תוכנה אחרת. זה לא הורס תמחשב

תיכנסו לדוס
start - run - command
בשביל שהדוס ייה על כל המסך תעשו Alt+Enter

תכתבו Debug MyApp.com
אל תיתנו לתוכנית שלכם שם של יותר מ- 8 אותיות באורך או עם רווחים וכו’

ייה הודעת שגיאה File Not Found זה הברכה של הDebug אל תיקחו את זה ללב

אחשו במקום ה<\:C יש לכם _-
המינוס זה השורת פקודה של הDEBUG

תכתבו a 100 ותעשו Enter
זה נותן לכם לכתוב תוכנית באורך של עד 100 פקודות (אל תתקמצנו, תשאירו את זה 100) - מפנה לה מקום וכו’

אחשו ייה לכם במקום המינוס 2 מספרים בhex עם : ביניהם. זה השורת פקודה החדשה שבה "מקליטים" את התוכנית.

תכתבו שמה תתוכנית (שורה לכל פקודה, לא ללחוץ 2 פעמים אחד אחרי השני על enter ואם יש טעויות למחוק אותם עם Backspace ולא עם טיפקס.

mov al, 6
mov ah, 8
add ah, al
mov bx, 2000
mov [bx], ah
mov ah, 4c
int 21h

אחרי השורה של ה- int תלחצו 2 פעמים enter ואז שוב ייה לכם שורת פקודה של -

תכתבו rcx (אין לי מוסג מה זה עושה אבל צריך את זה (; אני יבדוק אחרכך)
בנקודתיים תכתבו את המספר שהיה לכם בשורה הריקה (שעשיתם פעמים Enter) פחות המספר שכתבתם בa (במקרה שלנו 100)
נגיד אם זה היה 011C ובהתחלה כתבתם a 100 אז תכתבו בנקודתיים 1C (11C-100=1C)
במינוס הבא תכתבו w זה כותב תקובץ של התוכנית בקובץ com
תכתבו u 100 - זה בשביל לעלות תתוכנית שלכם למקום המתאים בדיבאג
אחשו תעשו t ENTER הרבה פעמים לפי מספר השורות של התוכנית- הרצת התוכנית שלב שלב
תכתבו: d 2000

במקום הראשון בשורה הראשונה של ה"מטריצה" השמאלית אתם תראו תמספר 0E. זה התוצאה בhex של החישוב שעשיתם (8+6=14=Eh)
זהו . .. תצאו עם q


הפקודות האחרונות בתוכנית שהן
mov ah, 4c
int 21h

תפקידן להפסיק את פעולת התוכנית ולפנות את המעבד לשטויות אחרות. אם לא תעשו ככה המחשב עלול להיתקע כי התוכנית נגמרה אבל היא לא מאפשרת למעבד להתעסק אם תוכנות אחרות.

היה פה כמה טעויות וזה לא עבד . אחשו זה בסדר [ההודעה נערכה על-ידי 11010010110 ב-15/09/2004 23:45:46]
10/09/2004 21:26:35 Collateral Damag
מתכנת שלא יודע אסמבלר זה פשוט פשע לא נורמלי.

מלמדים אותכם שם win16 או win32?
10/09/2004 21:40:22 Alpha1
שמרקה יא פושע אני חייב כזאות תוכנה!!
אבל אני לא מבין את המדריך שלך ~~
ככה שאני לא יכול לעשות כ-ל-ו-ם.
חוץ מזה אין לי כמעט ידע בתכנות חוץ מאיזה פה ושם רופף כזה ב
VB6
10/09/2004 22:31:50 Collateral Damag
עוד דבר, אני לא מבין למה אתם משתמשים בדוס????
יש הרבה קומפיילרים חינמיים מעולים באינטרנט. אני אישית מעדיף את MASM.
הנה דף הבית, אם אתה מתעניין.
www.masm32.com

MASM תוכנן במקור בשביל HLA - High Level Assembly אבל אל דאגה אפשר לכתוב בו באסמבלר רגיל בלי בעיות.
הוא מכיל עורך קוד, דיבאגר, אסמבלר, ולינקר הכל בחבילה אחת בלי סיבוכים.

כמו שאני וכולנו מכירים מורים, כנראה לא יתנו לך להשתמש בזה בשיעור.
אבל זה יעזור לך להכין שיעורים.

זה הכל עיניין של העדפה, לדעתי הרבה יותר פשוט לעבוד עם MASM (או לחלופין NASM, TASM, HLA, FASM, GAS, GoAsm, WASM, NBASM וכו’...).
רק רציתי להציג לך את האפשרות, ובהצלחה בלימודים.

לכל אלו מכם שלא יודעים אסמבלי, ומפחדים ללמוד.
אל תפחדו, זה פשוט מאד!! וזה מאד יעזור לכם להבין את מה שהולך בשפות הגבוהות יותר.
11/09/2004 00:18:21 11010010110
מלמדים אותנו על מחשבי פנטיום 3/4 עם וינדוס 98 את האסמבלר של 8086 (המחשב שהיה לפני 286) של דוס בגירסה מוקדמת במיוחד שלו.

ה"תוכנה" שאנחנו עובדים איתה היא חלק שיש בכל דוס/וינדוס (אולי חוץ מאקס-פי) וקוראים לה Debug.

אקספי הוא מערכת הפעלה מנייקית במיוחד כלפי כל מה ששייך לדוס אז אם זה יעשה בעיות תעלו תמחשב מדיסקט של דוס או וינדוס 95/98 ולעתיק עליו תDEBUG ואולי עוד כמה קבצים

למי שרוצה את MASM או Turbo Asembler נראה לי שיש לנו את זה בבצפר ואני יעתיק למי שצריך
בנתיים אנחנו עוד לא התעסקנו עם זה.

Alpha - תעשה לפי המדריך שלב-שלב את תסתדר עם זה
16/09/2004 00:02:39 11010010110
- - - - שיעור 5 - - - -
הפקודה JNZ ותפקיד האוגר CX כמו מונה לולאה
דוגמה של מצב דומה ל - overflow

קוד:

C:\WINDOWS\Desktop>debug rcx.com
File not found

a 100-
1A8E:0100 mov ax, 0
1A8E:0103 mov bx, 0000
1A8E:0106 mov cx, 20
1A8E:0109 add ax, [bx]
1A8E:010B inc bx
1A8E:010C dec cx
1A8E:010D jnz 0109
1A8E:010F mov bx, 6000
1A8E:0112 mov [bx], ax
1A8E:0114 mov ah, 4c
1A8E:0116 int 21h
1A8E:0118
rcx-
CX 0000
:18
w-
Writing 00018 bytes

t-

AX=883B BX=0015 CX=000B DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=1A8E ES=1A8E SS=1A8E CS=1A8E IP=0109 NV UP EI PL NZ NA PO NC
1A8E:0109 0307 ADD AX,[BX] DS:0015=1014
t-

AX=883B BX=0014 CX=000C DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=1A8E ES=1A8E SS=1A8E CS=1A8E IP=010B OV UP EI NG NZ NA PO NC
1A8E:010B 43 INC BX
t-

AX=883B BX=0015 CX=000C DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=1A8E ES=1A8E SS=1A8E CS=1A8E IP=010C NV UP EI PL NZ NA PO NC
1A8E:010C 49 DEC CX
t-

AX=883B BX=0015 CX=000B DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=1A8E ES=1A8E SS=1A8E CS=1A8E IP=010D NV UP EI PL NZ NA PO NC
1A8E:010D 75FA JNZ 0109

...
...
...

t-

AX=AD72 BX=0020 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=1A8E ES=1A8E SS=1A8E CS=1A8E IP=010D NV UP EI PL ZR NA PE CY
1A8E:010D 75FA JNZ 0109
t-

AX=AD72 BX=0020 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=1A8E ES=1A8E SS=1A8E CS=1A8E IP=010F NV UP EI PL ZR NA PE CY
1A8E:010F BB0060 MOV BX,6000
t-

AX=AD72 BX=6000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=1A8E ES=1A8E SS=1A8E CS=1A8E IP=0112 NV UP EI PL ZR NA PE CY
1A8E:0112 8907 MOV [BX],AX DS:6000=0000
t-

AX=AD72 BX=6000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=1A8E ES=1A8E SS=1A8E CS=1A8E IP=0114 NV UP EI PL ZR NA PE CY
1A8E:0114 B44C MOV AH,4C
t-

AX=4C72 BX=6000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=1A8E ES=1A8E SS=1A8E CS=1A8E IP=0116 NV UP EI PL ZR NA PE CY
1A8E:0116 CD21 INT 21
d 6000-
...............1A8E:6000 72 AD 00 00 00 00 00 00-00 00 00 00 00 00 00 00 r
................ 1A8E:6010 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00
................ 1A8E:6020 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00
................ 1A8E:6030 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00
................ 1A8E:6040 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00
................ 1A8E:6050 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00
................ 1A8E:6060 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00
................ 1A8E:6070 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00
-




התוכנית מחברת את כל מה שיש בכתובות זיכרון 0000 - 0019 ושומרת תתוצאה בזיכרון ב6000

JNZ 0109 - הוא עשה GOTO לפקודה שנמצאת בשורה 109 אם הערך של CX הוא לא 0
JNZ - Jump Not Zero

ב- t t t t t אני הרצתי את התוכנית עד שראיתי שהוא עשה תפקודה האחרונה (int 21) ואז עם d 6000 הסתכלתי בכתובת 6000 בזיכרון.

הגודל של AX הוא 16 ביט - 2 בתים לכן התוצאה תופםת 2 כתובות בזיכרון - 6000 ו- 6001.

קצת אחר אבל גם דומה מה שקורה ב - buffer / stack overflow שעליו יש די הרבה פיטפוט ב"אבטחת מידע" כי אפשר לשנות ("למחוץ") איתו מידע שאין לנו גישה אליו, ע"י הכנסת יותר מדי מידע למקום שיש לנו גישה אליו. כאן הכנסנו מידע של 2 בתים לכתובת אחת בזיכרון והוא גלש גם לכתובת הבאה.[ההודעה נערכה על-ידי 11010010110 ב-17/09/2004 17:52:57]
17/09/2004 03:33:15 CoDeR
שם האוגר הוא
cx
ולא rcx...
17/09/2004 17:50:09 11010010110
ואללה. .[ההודעה נערכה על-ידי 11010010110 ב-17/09/2004 17:52:06]
17/09/2004 19:44:03 silicon_wolf
איזה שמנים אתם...ואף אחד לא העיר שאומרים אסמבלי ולא אסמבלר כי האסמבלר הוא בעצם המתרגם של אסמבלי לשפת המכונה...
סיפי-בושה פשוט בושה.
22/09/2004 01:18:18 cp77fk4r
רק עכשיו באתי..

אגב, קראתי בריפרוף, ואמרת שאתה לא יודע מה זה "rcx", אז הפקודה קודם כל, היא "r cx" ולא "rcx", והפקודה הזאת קוראת לאוגר בכדי שנכתוב בו את גודל התוכנית שלנו, לפני שהתוכנית נכתבת ע"ג הדיסק אנחנו צריכים לדעת מה גודלה.

יש מבין?[ההודעה נערכה על-ידי cp77fk4r ב-22/09/2004 01:18:32]
עמודים: 1