מטרת מדריך זה להשלים את הפער בין החומר התאורטי הנלמד בכתה או מספר לימוד, לבין העבודה המעשית על המערכת.
המדריך מיועד לתלמידים המתחילים את הלימוד התאורטי של שפת Assembly, וזקוקים להדרכה כיצד לכתוב ולהדר את התכניות הראשונות שלהם במערכת GNU/Linux.
המדריך נבנה על מערכת Ubuntu GNU/Linux אך כל מערכת לינוקס תתאים. הוראות ההתקנה המדוייקות ספציפיות למערכת מבוססת Debian GNU/Linux, אך ינתנו הסברים כלליים גם עבור מערכות אחרות.
במערכות Ubuntu הפקודות הבאות יתקינו את כל התכנות להן זקוקים בכתיבת תכנית Assembly בסיסית, ישנן שתי שיטות תחביר עיקריות לכתיבת Assembly, שיטת Intel ושיטת AT&T . מדריך זה יציג שני מהדרים, אחד התואם לכל שיטה, על התלמיד לבחור אחד מהמהדרים:
nasm מהדר Assembly התואם לשיטת Intel
sudo apt-get install nasm
gas מהדר Assembly התואם לשיטת AT&T
sudo apt-get install binutils
במערכות אחרות צריך להקפיד כי במערכת יהיה מותקן מהדר מסוג nasm או gas בהתאמה (gas - ארוז בד”כ בחבילה בשם binutils)
אם אתם תלמידים המחברת שלכם תספיק בהחלט, ספר לימוד טוב לא יזיק. כדאי לזכור כי לשפת Assembly מדריכים רבים ברשת.
Assembly היא שפת סף. בשונה משפות עיליות, שפת Assmebly קרובה יותר לשפת המכונה. מאחר ושפת המכונה שונה ממכונה למכונה גם שפת הסף (Assembly) שונה ממכונה למכונה. שפת Assmenly למעבד 80386 שונה משפת Assembly ל mips r10000 ששונה משפת Assembly למעבד ממשפחת Arm. המדריך הזה יביא דוגמה לשימוש ב Assembler המתאים למעבד ממשפחת x86. מהדר Assembly gas מסוגל להבין ולהדר מספר רב של שפות Assembly המיועדות למעבדים שונים.
כדי לפתח בשפת Assembly צריך ידע על המעבד, רצוי גם לדעת על הרכיבים האלקטרוניים המחוברים אליו וצורת החיבור שלהם אל המעבד. מידע על סט הפקודות ואוסף האוגרים של מעבד ניתן לקבל מיצרן המעבד. בהמשך מובאים קישורים למדריך ברשת המפרט את סט הפקודות והאוגרים של מעבד 8086. כדאי לחפש ברשת נתונים על המעבד הספצפי עליו אותם הולכים לתכנת, מעבדים ממשפחת x86 שומרים את סט הפקודות והאוגרים של מעבדים ישנים יותר מאותה משפחה ומוסיפים להם פקודות ואוגרים חדשים.
את התכנית ניתן לכתוב בכל עורך טקסט. אנו נשתמש בדוגמה זו בעורך הטקסט של Gnome.
כתוב תכנית פשוטה בעורך הטקסט,
קוד עבור gas לפי שיטת AT&T
#code .text # section declaration # we must export the entry point to the ELF linker or .global _start # loader. They conventionally recognize _start as their # entry point. Use ld -e foo to override the default. _start: # write our string to stdout movl $len,%edx # third argument: message length movl $msg,%ecx # second argument: pointer to message to write movl $1,%ebx # first argument: file handle (stdout) movl $4,%eax # system call number (sys_write) int $0x80 # call kernel # and exit movl $0,%ebx # first argument: exit code movl $1,%eax # system call number (sys_exit) int $0x80 # call kernel .data # section declaration msg: .ascii "Hello, world!\n" # our dear string len = . - msg # length of our dear string #code
קוד עבור nasm לפי שיטת Intel
;code section .text ;section declaration ;we must export the entry point to the ELF linker or global _start ;loader. They conventionally recognize _start as their ;entry point. Use ld -e foo to override the default. _start: ;write our string to stdout mov edx,len ;third argument: message length mov ecx,msg ;second argument: pointer to message to write mov ebx,1 ;first argument: file handle (stdout) mov eax,4 ;system call number (sys_write) int 0x80 ;call kernel ;and exit mov ebx,0 ;first syscall argument: exit code mov eax,1 ;system call number (sys_exit) int 0x80 ;call kernel section .data ;section declaration msg db "Hello, world!",0xa ;our dear string len equ $ - msg ;length of our dear string ;code
אנו נהדר את התכנית בעזרת מהדר Assembly, מתוך המסוף (ראה תמונת מסך בסוף המדריך)
הידור בעדרת gas
as hello.s -o hello.o
הידור בעזרת nasm
nasm -f elf hello.asm
קישור עבור שני המהדרים
ld -s -o hello hello.o
קוד:
hello/.
כך צריכה להראות התכנית בעורך הטקסט ובמסוף בו אתם מבצעים את ההידור וההרצה.
עבור gas
(לחץ על התמונה כדי לקבל תמונה מוגדלת)
עבור nasm
(לחץ על התמונה כדי לקבל תמונה מוגדלת)
בהמשך העבודה בודאי תרצו להתקין כלי פיתוח נוספים וספריות פיתוח חדשות. אפשר למצוא מדריכים לשימוש בכלים אלו ברשת ופה באתר.
מדריכי תכנות - אוסף מדריכי התכנות בפנגווין.