א ר כי טקטור ת מ ח ש בים ד"ר טל שיקלר סו ב ול אימייל: stal@bgu.ac.il
Mother board לוח אם
CPU central processing unit מעבד
דוגמאות: 80x86 ו תואמיו Intel 80x86 Intel Core 2 Duo 64 bits 80x86 compatible AMD Athlon (technically different) 80x86 compatible
ארגון המ חשב ו שפת סף (אסמ ב לי) כל פעולות המחשב מתבצעות באמצע ות הוראות תוכנית לאחר שתורגמו לשפת מכונה. הארכיטקטורה - שפת הסף (Assembly)
מה נל מד ב קו רס? High-Level Languages, e.g. ML Compiled Languages, e.g. C++ Assembly Languages Programs Machine Code/ Architecture Computer Organization Level Digital Logic Level Transistors & Layout Materials/ Physics Physical Layers
דוגמה : A=A+B 0 3 c 3 0 0 0 0 0 0 1 1 1 1 0 0 0 0 1 1
למ ה ל למ ו ד? הבנת מנגנוני הפעולה של המחשב: המכונה הבנת נושאים שונים במד עי המחשב ובשפות עיליות ארכיטקטורה ייצוג המידע והפקודות במחשב טיפול במשתנים ובקבועים מבנה המערך ותפקיד המצביעים מנגנון המחסנית (stack) יישום תנאי מבנה לולאה טיפול בערכי קצה תנאי כניסה ויציאה פונקציות והעברת פרמטרים
מה ז ה מ אפשר?
הארכיט ק ט ור ה ו שפת האסמ ב לי תל ויות בארגון ה מח שב
שכבו ת ויר ט ואליות ב מכונה High-Level Languages Compiled Languages, e.g. C++ Assembly Languages Programs Machine Code/ Architecture Computer Organization Level Digital Logic Level Transistors & Layout Materials/ Physics Physical Layers
ה ארכיט ק ט ו רה ארכיטק ט ור ת Von-Neumann
Mother board לוח אם
דיאגרמ ת ב לו קי ם פשו ט ה של ה מח שב
מ חשב מוד רני (פשוט)
ז יכרון 0000 3F 0001 2C 0002 41 0003 FF 0004 00 0005 1E 1 byte = bits -בית -מלbit 1 word = bytes - סיבית מידע
Buses
Address Buses 2 קווי כתובת מקוד ד ים _ _כתובות: = כתובות 4 קוים = כתובות 8 קוים = כתובות 16 קוים 32 קוים = כתובות
קרי אה מ ה זי כרון 0001 0001 Address Bus Other registers Data Bus Arithmetic and Logic Unit Control Unit Control Bus Main Memory CPU Clock
כתיב ה ל זי כרון 0001 0001 Address Bus Other registers Data Bus Arithmetic and Logic Unit Control Unit Control Bus WRITE LINE Main Memory CPU Clock
תכנית מ חשב המחשב מבצע תכנית השמורה בזיכרון באופן בסיסי בצע תמיד/ :DO FOREVER The Fetch-Execute Cycle Fetch Execute (interrupts) בפועל מסובך יותר, למש ל בשל פסיקות
Fetch & execute cycle מ ח זו ר ה בא ובצע הבא את הפק ודה הבאה Fetch Next Instruction Execute Instruction עדכן את מ ונה ה תכנ ית בצע הפקודה Update PC תרגם הפקוד ה Decode Instruction
קצת יו תר ע ל אר גו ן המע ב ד...
CPU central processing unit יחי דת עיבוד מר כזי ת (המ עבד)
בג דול...
Registers (accumulators) רגי סטרים (אוגרים) רגיסטרים ר כיבי זיכרון מהירים מאוד ע ל המעבד ע צמו ( (על הצ' פי
רגיסט רים ב- 80x86 This register file unit contains registers of the following types (partial list): 8-bit general registers: AL, BL, CL, DL, AH, BH, CH, DH 16- bit general & special registers: AX, BX, CX, DX, SP, BP, SI, Dl 32-bit general & special registers: EAX, EBX, ECX, EDX, ESP, EBP, ESI, EDI (Accumulator, Base, Counter, Data, Stack pointer, Base pointer, Source index string op., Destination Index string op.) Segment registers: ES, CS,SS, DS, FS, GS Instruction pointer: EIP
Flags דגלים כל דגל (FLAG) מייצג סיבית (bit) ש ל מיד ע חשו ב: מצב המכונה מ צ ב החישו ב
Execution unit יחידת ביצוע
ALU- arithmetic Logic Unit יחידת חישובים (אריתמטיים ולוגיים) 1 0 1 0 0 1 1 0 0 0 1 0
דוגמה ALU: 1 bit
Bus Interface
סדר ה פקודות
Control unit יחידת הבקרה מיי צרת אותות תז מון וב ק רה בוחרת פעולות לביצוע ב: :ALU :Register file :Program counter :Bus control פסיקות
The Fetch-Decode-Execute Cycle Fetch PC=PC+1 Decode Execute
Fetch Decode- Execute Cycle הבא את הפק ודה הבאה Fetch Next Instruction תרגם הפקוד ה עדכן את מ ונה ה תכנ ית Update PC Decode Instruction בצע הפקודה Execute Instruction
ביצו עי ם
Clock & Frequency שעון ותדר
ביצועים (performance) זמנים מחושבים לפי השעון,(frequency) מחזור השעון cycle) (clock או תדר למשל: 4 GHz כל פעולה לוקחת לפחות מחזור שע ון אחד. גישה לזיכרון access) (memory לוקחת בד"כ יותר ממחזור שעון אחד. זמן הגישה time) (access לזיכרון הוא קריטי! ביצוע פקודה (execution) מורכב ממספר צעדים גישה לזיכרון. ע לול לכלול
ביצועים (performance) הבי צ ו עים (performance) ת ל ויים במ יד ה רבה ב:
בשיע ורים הבאים: מ הי שפת אסמ בלי
אסמ ב לי ו אסמ ב לר שפת אסמבלי היא (כמעט) תרגום ישיר של שפת המכונה. מרכיבי שפת אסמבלי: mnemonics גרסה סימבולית לפקודות בשפת המכונה - תוויות לייצוג לכתובות בזיכרון labels שמות רגיסטרים pseudo-operations (פקודות המתרגמות לכמה פקודות מכונה, או פקודות המבוצעות ע"י האסמבלר ולא בזמן הרצת התכנית ע"י ה- macros,(cpu ועוד... תכנת Assembler מתרגמת את ה- Assembly לשפת המכונה. התרגום מתבצע בשני שלבים: 1. תרגום הפקודות לקוד בינארי ויצירת טבלה סימבולית ) table (Symbolic לתרגום ה-.labels 2. תרגום ה- labels לכתובות (הניתנות לאיתור ולהעברה,,(relocatable תיקון הקוד הבינארי בהתאם, ויצירת,Object file המכיל את אינפורמציית ההעברה.
;"Hello world!" program for Linux in NASM style assembly (Wikipedia) ;; section.data ; section for initialized data str: db 'Hello world!', 0Ah ; message string with new-line char at the end (10 decimal) str_len: equ $ - str ; calcs length of string (bytes) by subtracting this' address ; ($ symbol) from the str's start address section.text ; this is the code section global _start ; _start is the entry point and needs global scope to be 'seen' by ; linker - equivalent to main() in C/C++ _start: ; procedure start mov eax, 4 ; specify the sys_write function code (from OS vector table) mov ebx, 1 ; specify file descriptor stdout -in linux, everything's treated ; as a file, even hardware devices mov ecx, str ; move start _address_ of string message to ecx register mov edx, str_len ; move length of message (in bytes) int 80h ; tell kernel to perform the system call we just set up - ; in linux services are requested through the kernel mov eax, 1 ; specify sys_exit function code (from OS vector table) mov ebx, 0 ; specify return code for OS (0 = everything's fine) int 80h ; tell kernel to perform system call
"Hello world!" program for Linux in NASM style assembly using the C standard library (Wikipedia) global main ;main must be defined as it being compiled against the C-Standard Library extern printf segment.data ;declares use of external symbol as printf is declared in a different object- ;module. Linker resolves this symbol later ;section for initialized data string db 'Hello world!', 0Ah ;message string with new-line char at the end (10 decimal) segment.text main: ;string now refers to the starting address at which 'Hello, World' ;is stored. push string ;push the address of first character of string onto stack. call printf ;This will be argument to printf ;calls printf add esp, 4 ;advances stack-pointer by 4 flushing out the pushed string ; argument ret ;return
דוגמה 1 2 %define STK_UNIT 4 3 4 %macro Iamalive 0 5 push Str1 6 call printf 7 add esp, STK_UNIT 8 %endmacro 9 10 %macro my_printf 2 11 section.rodata 12 %%Str2: db %2, 10, 0 13 section.text 14 push %1 15 push %%Str2 16 call printf 17 add esp, STK_UNIT*2 18 %endmacro 19 20 section.rodata 21 00000000 4920616D20616C6976- Str1: db 'I am alive', 10, 0 22 00000009 650A00 23 0000000C 0F000000 num1: dd 15 24 25 section.text 26 align 16 27 global my_func 28 extern printf
1 2 %define STK_UNIT 4 3 4 %macro Iamalive 0 5 push Str1 6 call printf 7 add esp, STK_UNIT 8 %endmacro 9 10 %macro my_printf 2 11 section.rodata 12 %%Str2: db %2, 10, 0 13 section.text 14 push %1 15 push %%Str2 16 call printf 17 add esp, STK_UNIT*2 18 %endmacro 19 20 section.rodata 21 00000000 4920616D20616C6976- Str1: db 'I am alive', 10, 0 22 00000009 650A00 23 0000000C 0F000000 num1: dd 15 24 25 section.text 26 align 16 27 global my_func 28 extern printf
דוגמה 1 2 %define STK_UNIT 4 3 4 %macro Iamalive 0 5 push Str1 6 call printf 7 add esp, STK_UNIT 8 %endmacro 9 10 %macro my_printf 2 11 section.rodata 12 %%Str2: db %2, 10, 0 13 section.text 14 push %1 15 push %%Str2 16 call printf 17 add esp, STK_UNIT*2 18 %endmacro 19 20 section.rodata 21 00000000 4920616D20616C6976- Str1: db 'I am alive', 10, 0 22 00000009 650A00 23 0000000C 0F000000 num1: dd 15 24 25 section.text 26 align 16 27 global my_func 28 extern printf
29 30 my_func: 31 00000000 60 pusha 32 Iamalive 33 00000001 68[00000000] <1> push Str1 34 00000006 E8(00000000) <1> call printf 35 0000000B 81C404000000 <1> add esp, STK_UNIT 36 37 my_printf dword [num1], "The number is %ld" 38 <1> section.rodata 39 00000010 546865206E756D6265- <1> %%Str2: db %2, 10, 0 40 00000019 7220697320256C640A- <1> 41 00000022 00 <1> 42 <1> section.text 43 00000011 FF35[0C000000] <1> push %1 44 00000017 68[10000000] <1> push %%Str2 45 0000001C E8(00000000) <1> call printf 46 00000021 81C408000000 <1> add esp, STK_UNIT*2 47 my_printf dword [num1], "The number again is %ld" 48 <1> section.rodata 49 00000023 546865206E756D6265- <1> %%Str2: db %2, 10, 0 50 0000002C 7220616761696E2069- <1> 51 00000035 7320256C640A00 <1> 52 <1> section.text 53 00000027 FF35[0C000000] <1> push %1 54 0000002D 68[23000000] <1> push %%Str2 55 00000032 E8(00000000) <1> call printf 56 00000037 81C408000000 <1> add esp, STK_UNIT*2 57 58 0000003D 61 popa 59 0000003E C3 ret