Upload
jaguar
View
25
Download
1
Embed Size (px)
DESCRIPTION
Practical session 9. Assignment 3. Game of life. Simulates Evolution of an infinite two-dimensional matrix’s cells. Each cell can be alive or dead . A cell’s state in each iteration (generation) is set with accordance to its former state and its neighbors’ (former) states. A Cell. - PowerPoint PPT Presentation
Citation preview
Practical session 9
Assignment 3
Game of life• Simulates Evolution of an
infinite two-dimensional matrix’s cells.
• Each cell can be alive or dead.
• A cell’s state in each iteration (generation) is set with accordance to its former state and its neighbors’ (former) states.
A Cell• Just to be perfectly clear:
Each cell (organism) has 8 neighbors.
N1 N2 N3
N4 meme N5
N6 N7 N8
Border cells• Every cell has 8 neighbors Every cell has 8 neighbors even at the board
edges – cells of the first row are neighbors of the cells in the last row– cells of the first column are neighbors of the cells in the last column
Game rules1. If the cell is currently alivealive, then it will remain
alive in the next generation if and only if if and only if exactly 2 or 3 of its neighbors are exactly 2 or 3 of its neighbors are currently alivealive. Otherwise it dies.
2. A deaddead cell remains dead in the next generation, unless it has exactly 3 living unless it has exactly 3 living neighborsneighbors.
3. Organism age is the number of generation it was alive in a row. Maximum age is 9*.Maximum age is 9*.
*A cell does not die after age 9, it continues its life according to the game rules, but its age stays unchanged.
Our version• Each cell is given an initial state you read
from an input file on program startup to a global array.
• At each generation, a cell will determine its next state according to its former state and its neighbors’ former states, using the following rules.
1 11 1
1 1 11 1 1
1 1 11 1
empty (dead) cells are denoted by space in input file
alive cells are denoted by ‘1’ in input file
Implementation• Using the co-routine mechanism, we’ll write a
small simulator for the game.
• Running co-routines:–n n cell instances cell instances (2-dimensional matrix)
–a printera printer–a schedulera scheduler
A Cell
• Can be alive(‘1’-’9’) or dead(‘ ‘)• Cell executes a simple infinite loopinfinite loop:
1. Calculate next state using current state (of “me” and my neighbors).
2. Update current state of “me” to new state
• After each of these two stages, the cellcell co-routine must resume the schedulermust resume the scheduler.
In other words, it loops (forever) over:(1)(1) resume resume (2) (2) resumeresume
The printer
• Simply printsprints the entire “world” (the global the global arrayarray), whenever it gets “time”.
The scheduler• You are to implement a simple round-robin round-robin
schedulerscheduler• void scheduler (int cycles)
– iterate cycles times over all cells– after each after each KK resumes of cell co-routines, resume the resumes of cell co-routines, resume the
printer printer (1) resume (2) resume …– at the end of all cycles, resume the printer once
more, and then terminate the process
Program’s flowProgram’s flowrow=0, column=0while (numberOfGenerations < maximalNumberOfGenerations)
resume(cell (row, column))resume(cell (row, column))if (time to resume printer)
resume (printer)resume (printer)row=(row+1)%maximalNumberOfRowsif(row==0)
column=(column+1)%maximalNumberOfColumnsif (row==0 && column==0)
numberOfGenerations+=0.5
Scheduler Cell (0,0)Printer
calculate stage
update matrix
calculate stage
update matrix
…
calculate stage
update matrix
calculate stage
update matrix
…
calculate stage
update matrix
calculate stage
update matrix
…
Cell (0,1) Cell (n-1, n-1)…
Program’s flowProgram’s flowrow=0, column=0while (numberOfGenerations < maximalNumberOfGenerations)
resume(cell (row, column))resume(cell (row, column))if (time to resume printer)
resume (printer)resume (printer)row=(row+1)%maximalNumberOfRowsif(row==0)
column=(column+1)%maximalNumberOfColumnsif (row==0 && column==0)
numberOfGenerations+=0.5
Scheduler Cell (0,0)Printer
calculate stage
update matrix
calculate stage
update matrix
…
calculate stage
update matrix
calculate stage
update matrix
…
calculate stage
update matrix
calculate stage
update matrix
…
Cell (0,1) Cell (n-1, n-1)…
Program’s flowProgram’s flowrow=0, column=0while (numberOfGenerations < maximalNumberOfGenerations)
resume(cell (row, column))resume(cell (row, column))if (time to resume printer)
resume (printer)resume (printer)row=(row+1)%maximalNumberOfRowsif(row==0)
column=(column+1)%maximalNumberOfColumnsif (row==0 && column==0)
numberOfGenerations+=0.5
Scheduler Cell (0,0)Printer
calculate stage
update matrix
calculate stage
update matrix
…
calculate stage
update matrix
calculate stage
update matrix
…
calculate stage
update matrix
calculate stage
update matrix
…
Cell (0,1) Cell (n-1, n-1)…
Program’s flowProgram’s flowrow=0, column=0while (numberOfGenerations < maximalNumberOfGenerations)
resume(cell (row, column))resume(cell (row, column))if (time to resume printer)
resume (printer)resume (printer)row=(row+1)%maximalNumberOfRowsif(row==0)
column=(column+1)%maximalNumberOfColumnsif (row==0 && column==0)
numberOfGenerations+=0.5
Scheduler Cell (0,0)Printer
calculate stage
update matrix
calculate stage
update matrix
…
calculate stage
update matrix
calculate stage
update matrix
…
calculate stage
update matrix
calculate stage
update matrix
…
Cell (0,1) Cell (n-1, n-1)…
Program’s flowProgram’s flowrow=0, column=0while (numberOfGenerations < maximalNumberOfGenerations)
resume(cell (row, column))resume(cell (row, column))if (time to resume printer)
resume (printer)resume (printer)row=(row+1)%maximalNumberOfRowsif(row==0)
column=(column+1)%maximalNumberOfColumnsif (row==0 && column==0)
numberOfGenerations+=0.5
Scheduler Cell (0,0)Printer
calculate stage
update matrix
calculate stage
update matrix
…
calculate stage
update matrix
calculate stage
update matrix
…
calculate stage
update matrix
calculate stage
update matrix
…
Cell (0,1) Cell (n-1, n-1)…
Program’s flowProgram’s flowrow=0, column=0while (numberOfGenerations < maximalNumberOfGenerations)
resume(cell (row, column))resume(cell (row, column))if (time to resume printer)
resume (printer)resume (printer)row=(row+1)%maximalNumberOfRowsif(row==0)
column=(column+1)%maximalNumberOfColumnsif (row==0 && column==0)
numberOfGenerations+=0.5
Scheduler Cell (0,0)Printer
calculate stage
update matrix
calculate stage
update matrix
…
calculate stage
update matrix
calculate stage
update matrix
…
calculate stage
update matrix
calculate stage
update matrix
…
Cell (0,1) Cell (n-1, n-1)…
Program’s flowProgram’s flowrow=0, column=0while (numberOfGenerations < maximalNumberOfGenerations)
resume(cell (row, column))resume(cell (row, column))if (time to resume printer)
resume (printer)resume (printer)row=(row+1)%maximalNumberOfRowsif(row==0)
column=(column+1)%maximalNumberOfColumnsif (row==0 && column==0)
numberOfGenerations+=0.5
Scheduler Cell (0,0)Printer
calculate stage
update matrix
calculate stage
update matrix
…
calculate stage
update matrix
calculate stage
update matrix
…
calculate stage
update matrix
calculate stage
update matrix
…
Cell (0,1) Cell (n-1, n-1)…
Program’s flowProgram’s flowrow=0, column=0while (numberOfGenerations < maximalNumberOfGenerations)
resume(cell (row, column))resume(cell (row, column))if (time to resume printer)
resume (printer)resume (printer)row=(row+1)%maximalNumberOfRowsif(row==0)
column=(column+1)%maximalNumberOfColumnsif (row==0 && column==0)
numberOfGenerations+=0.5
Scheduler Cell (0,0)Printer
calculate stage
update matrix
calculate stage
update matrix
…
calculate stage
update matrix
calculate stage
update matrix
…
calculate stage
update matrix
calculate stage
update matrix
…
Cell (0,1) Cell (n-1, n-1)…
Program’s flowProgram’s flowrow=0, column=0while (numberOfGenerations < maximalNumberOfGenerations)
resume(cell (row, column))resume(cell (row, column))if (time to resume printer)
resume (printer)resume (printer)row=(row+1)%maximalNumberOfRowsif(row==0)
column=(column+1)%maximalNumberOfColumnsif (row==0 && column==0)
numberOfGenerations+=0.5
Scheduler Cell (0,0)Printer
calculate stage
update matrix
calculate stage
update matrix
…
calculate stage
update matrix
calculate stage
update matrix
…
calculate stage
update matrix
calculate stage
update matrix
…
Cell (0,1) Cell (n-1, n-1)…
Program’s flowProgram’s flowrow=0, column=0while (numberOfGenerations < maximalNumberOfGenerations)
resume(cell (row, column))resume(cell (row, column))if (time to resume printer)
resume (printer)resume (printer)row=(row+1)%maximalNumberOfRowsif(row==0)
column=(column+1)%maximalNumberOfColumnsif (row==0 && column==0)
numberOfGenerations+=0.5
Scheduler Cell (0,0)Printer
calculate stage
update matrix
calculate stage
update matrix
…
calculate stage
update matrix
calculate stage
update matrix
…
calculate stage
update matrix
calculate stage
update matrix
…
Cell (0,1) Cell (n-1, n-1)…
Program’s flowProgram’s flowrow=0, column=0while (numberOfGenerations < maximalNumberOfGenerations)
resume(cell (row, column))resume(cell (row, column))if (time to resume printer)
resume (printer)resume (printer)row=(row+1)%maximalNumberOfRowsif(row==0)
column=(column+1)%maximalNumberOfColumnsif (row==0 && column==0)
numberOfGenerations+=0.5
Scheduler Cell (0,0)Printer
calculate stage
update matrix
calculate stage
update matrix
…
calculate stage
update matrix
calculate stage
update matrix
…
calculate stage
update matrix
calculate stage
update matrix
…
Cell (0,1) Cell (n-1, n-1)…
Program’s flowProgram’s flowrow=0, column=0while (numberOfGenerations < maximalNumberOfGenerations)
resume(cell (row, column))resume(cell (row, column))if (time to resume printer)
resume (printer)resume (printer)row=(row+1)%maximalNumberOfRowsif(row==0)
column=(column+1)%maximalNumberOfColumnsif (row==0 && column==0)
numberOfGenerations+=0.5
Scheduler Cell (0,0)Printer
calculate stage
update matrix
calculate stage
update matrix
…
calculate stage
update matrix
calculate stage
update matrix
…
calculate stage
update matrix
calculate stage
update matrix
…
Cell (0,1) Cell (n-1, n-1)…
Program’s flowProgram’s flowrow=0, column=0while (numberOfGenerations < maximalNumberOfGenerations)
resume(cell (row, column))resume(cell (row, column))if (time to resume printer)
resume (printer)resume (printer)row=(row+1)%maximalNumberOfRowsif(row==0)
column=(column+1)%maximalNumberOfColumnsif (row==0 && column==0)
numberOfGenerations+=0.5
Scheduler Cell (0,0)Printer
calculate stage
update matrix
calculate stage
update matrix
…
calculate stage
update matrix
calculate stage
update matrix
…
calculate stage
update matrix
calculate stage
update matrix
…
Cell (0,1) Cell (n-1, n-1)…
Program’s flowProgram’s flowrow=0, column=0while (numberOfGenerations < maximalNumberOfGenerations)
resume(cell (row, column))resume(cell (row, column))if (time to resume printer)
resume (printer)resume (printer)row=(row+1)%maximalNumberOfRowsif(row==0)
column=(column+1)%maximalNumberOfColumnsif (row==0 && column==0)
numberOfGenerations+=0.5
Scheduler Cell (0,0)Printer
calculate stage
update matrix
calculate stage
update matrix
…
calculate stage
update matrix
calculate stage
update matrix
…
calculate stage
update matrix
calculate stage
update matrix
…
Cell (0,1) Cell (n-1, n-1)…
Program’s flowProgram’s flowrow=0, column=0while (numberOfGenerations < maximalNumberOfGenerations)
resume(cell (row, column))resume(cell (row, column))if (time to resume printer)
resume (printer)resume (printer)row=(row+1)%maximalNumberOfRowsif(row==0)
column=(column+1)%maximalNumberOfColumnsif (row==0 && column==0)
numberOfGenerations+=0.5
Scheduler Cell (0,0)Printer
calculate stage
update matrix
calculate stage
update matrix
…
calculate stage
update matrix
calculate stage
update matrix
…
calculate stage
update matrix
calculate stage
update matrix
…
Cell (0,1) Cell (n-1, n-1)…
Program’s flowProgram’s flowrow=0, column=0while (numberOfGenerations < maximalNumberOfGenerations)
resume(cell (row, column))resume(cell (row, column))if (time to resume printer)
resume (printer)resume (printer)row=(row+1)%maximalNumberOfRowsif(row==0)
column=(column+1)%maximalNumberOfColumnsif (row==0 && column==0)
numberOfGenerations+=0.5
Scheduler Cell (0,0)Printer
calculate stage
update matrix
calculate stage
update matrix
…
calculate stage
update matrix
calculate stage
update matrix
…
calculate stage
update matrix
calculate stage
update matrix
…
Cell (0,1) Cell (n-1, n-1)…
Program’s flowProgram’s flowrow=0, column=0while (numberOfGenerations < maximalNumberOfGenerations)
resume(cell (row, column))resume(cell (row, column))if (time to resume printer)
resume (printer)resume (printer)row=(row+1)%maximalNumberOfRowsif(row==0)
column=(column+1)%maximalNumberOfColumnsif (row==0 && column==0)
numberOfGenerations+=0.5
Scheduler Cell (0,0)Printer
calculate stage
update matrix
calculate stage
update matrix
…
calculate stage
update matrix
calculate stage
update matrix
…
calculate stage
update matrix
calculate stage
update matrix
…
Cell (0,1) Cell (n-1, n-1)…
Program’s flowProgram’s flowrow=0, column=0while (numberOfGenerations < maximalNumberOfGenerations)
resume(cell (row, column))resume(cell (row, column))if (time to resume printer)
resume (printer)resume (printer)row=(row+1)%maximalNumberOfRowsif(row==0)
column=(column+1)%maximalNumberOfColumnsif (row==0 && column==0)
numberOfGenerations+=0.5
Scheduler Cell (0,0)Printer
calculate stage
update matrix
calculate stage
update matrix
…
calculate stage
update matrix
calculate stage
update matrix
…
calculate stage
update matrix
calculate stage
update matrix
…
Cell (0,1) Cell (n-1, n-1)…
Program’s flowProgram’s flowrow=0, column=0while (numberOfGenerations < maximalNumberOfGenerations)
resume(cell (row, column))resume(cell (row, column))if (time to resume printer)
resume (printer)resume (printer)row=(row+1)%maximalNumberOfRowsif(row==0)
column=(column+1)%maximalNumberOfColumnsif (row==0 && column==0)
numberOfGenerations+=0.5
Scheduler Cell (0,0)Printer
calculate stage
update matrix
calculate stage
update matrix
…
calculate stage
update matrix
calculate stage
update matrix
…
calculate stage
update matrix
calculate stage
update matrix
…
Cell (0,1) Cell (n-1, n-1)…
Program’s flowProgram’s flowrow=0, column=0while (numberOfGenerations < maximalNumberOfGenerations)
resume(cell (row, column))resume(cell (row, column))if (time to resume printer)
resume (printer)resume (printer)row=(row+1)%maximalNumberOfRowsif(row==0)
column=(column+1)%maximalNumberOfColumnsif (row==0 && column==0)
numberOfGenerations+=0.5
Scheduler Cell (0,0)Printer
calculate stage
update matrix
calculate stage
update matrix
…
calculate stage
update matrix
calculate stage
update matrix
…
calculate stage
update matrix
calculate stage
update matrix
…
Cell (0,1) Cell (n-1, n-1)…
Program’s flowProgram’s flowrow=0, column=0while (numberOfGenerations < maximalNumberOfGenerations)
resume(cell (row, column))resume(cell (row, column))if (time to resume printer)
resume (printer)resume (printer)row=(row+1)%maximalNumberOfRowsif(row==0)
column=(column+1)%maximalNumberOfColumnsif (row==0 && column==0)
numberOfGenerations+=0.5
Scheduler Cell (0,0)Printer
calculate stage
update matrix
calculate stage
update matrix
…
calculate stage
update matrix
calculate stage
update matrix
…
calculate stage
update matrix
calculate stage
update matrix
…
print matrix
Cell (0,1) Cell (n-1, n-1)…
Program’s flowProgram’s flowrow=0, column=0while (numberOfGenerations < maximalNumberOfGenerations)
resume(cell (row, column))resume(cell (row, column))if (time to resume printer)
resume (printer)resume (printer)row=(row+1)%maximalNumberOfRowsif(row==0)
column=(column+1)%maximalNumberOfColumnsif (row==0 && column==0)
numberOfGenerations+=0.5
Scheduler Cell (0,0) Cell (0,1) Cell (n-1, n-1)…Printer
calculate stage
update matrix
calculate stage
update matrix
…
calculate stage
update matrix
calculate stage
update matrix
…
calculate stage
update matrix
calculate stage
update matrix
…
Program’s flow• Invoked using:
ass3 <filename> ass3 <filename> <length> <width><length> <width> <t> <K> <t> <K>• where:
–<filenamefilename> - name of a file contain the initial state initial state of the game board. A series of size <width> of ‘ ‘ and ‘1’ in each line. The file contain <length> lines. –<tt> - number of generationsnumber of generations, i.e. amount of scheduler cycles through each cell–<KK> - printing frequencyprinting frequency–your array dimensions array dimensions will be <width>*<length><width>*<length>
Program’s flow• When invoked, and using the co-routines mechanism from class,
your application will:
– Set up: a Set up: a state arraystate array, , Length, WidthLength, Width, , KK
– Initiate all co-routinesInitiate all co-routines:• each cell gets parameters i,j - its indices in the global array• a scheduler needs to get number of generation (t) as a parameter• initiate the printer
– Initiate an array Initiate an array CORSCORS of pointers to: : cellcell0,00,0,…,cell,…,celllength-1,width-1length-1,width-1, scheduler, printer , scheduler, printer
– Transfer control to schedulerTransfer control to scheduler
Program’s flowIn your implementation of co-routines each cell in CORS array will point directly to the top of the stack of the corresponded co-routine. You don’t have to implement the co-routine structure as presented in the practical session.
CORS: SP(0,0)SP(0,1)…SP(n-1, n-1)
CORS: CO(0,0)CO(0,1)…CO(n-1, n-1)
CO(i,j): FunctionFlagsSP(i,j)
Example
Let’s run an example using your simple scheduler:
ass3 inputFile 10 10 99 7
1 11 1
1 1 11 1 1
1 1 11 1
empty (dead) cells are denoted by space in input file
alive cells are denoted by ‘1’ in input file
Example code
• Try to run life.c or lifeG.c that simulate game of life with the same parameters as your assembly program.
• For lifeG.c you have to include openGL libraries:
gcc lifeG.c –lGL –lGLU –lglut –o life
Technicalities• Submit a single .zip .zip file, using the same
directory structure as in previous assignments.• src folder will include:
– ass3.s (with most of the code)– printer.s (printer function code)– scheduler.s (scheduler function code)
שאלות חזרה למבחן
1שאלה עלינו לממש את קטע הקוד הבא:
int a, b, x;x = blah(a,&b)
מהו קטע הקוד שיבצע זאת נכון ?
a) push a c) push dword b push b push dword [a] call blah call blah add esp, 8 add esp, 8 mov [x], eax mov [x], eax
b) push dword [b] d) push dword [b] push dword a push dword a call blah call blah add esp, 8 add esp, 8 mov [x], eax pop dword [x]
1שאלה עלינו לממש את קטע הקוד הבא:
int a, b, x;x = blah(a,&b)
מהו קטע הקוד שיבצע זאת נכון ?
a) push a c) push dword b push b push dword [a] call blah call blah add esp, 8 add esp, 8 mov [x], eax mov [x], eax
b) push dword [b] d) push dword [b] push dword a push dword a call blah call blah add esp, 8 add esp, 8 mov [x], eax pop dword [x]
2שאלה
:Position Independent Codeאיזה מקטעי הקוד הבאים יעבוד כ-
a)bla: db ‘tab\0’push blacall printfb)mov eax, 4mov ebx, 1mov ecx, dword [bla]int 0x80c)mov eax, ‘bla\0’call printfd)None of the above
3שאלה
: Position Independent Code-איזה מקטעי הקוד הבאים יעבוד כ
a)bla: db ‘tab\0’push blacall printfb)mov eax, 4mov ebx, 1mov ecx, dword [bla]int 0x80c)mov eax, ‘bla\0’call printfd)None of the above
4שאלה ע"י שחרור כל האיברים רשימה מקושרת עלינו לפנות מהזיכרון
בכל הראשון dword(. ה-C של freeשלה )בעזרת פונקציית null הוא 0רשומה הוא מצביע לרשומה הבאה. מצביע שערכו
pointer נניח כי אוגר .ecx ברשימה. יש מצביע לאיבר הראשוןלממש את הקוד הנדרש.
4שאלה ע"י שחרור כל האיברים רשימה מקושרת עלינו לפנות מהזיכרון
בכל הראשון dword(. ה-C של freeשלה )בעזרת פונקציית null הוא 0רשומה הוא מצביע לרשומה הבאה. מצביע שערכו
pointer נניח כי אוגר .ecx ברשימה. יש מצביע לאיבר הראשוןלממש את הקוד הנדרש.
תשובהfree_list:
cmp ecx, 0jz endpush [ecx] ; backup for the next pointerpush ecxcall freeadd esp, 4 pop ecx ; restore for the next pointerjmp free_list
end:ret
5שאלה
:Little Endianנתונות ההגדרות הבאות בייצוג x: db 10y: db 3
מה יהיה ערכו )בייצוג הקסא-דצימלי( של לאחר הפקודה:BXהרגיסטר
mov bx, [x]
5שאלה
:Little Endian נתונות ההגדרות הבאות בייצוגx: db 10y: db 3
מה יהיה ערכו )בייצוג הקסא-דצימלי( של:לאחר הפקודה BX הרגיסטרmov bx, [x]
תשובהbx = 0x30A
0000 0011 0000 1010
0x0 0x3 0x0 0xA
0x30A
6שאלה 2. מוצעות 3 פי eaxברצוננו לכתוב קוד לשימוש רב-פעמי, שמכפיל את ערך •
: Triple או קריאה לפונקציה tripleאפשרויות: שימוש במקרו
• %macro triple 0mov ebx, eaxadd eax, eaxadd eax, ebx
%endmacro• Triple: mov ebx, eax
add eax, eax add eax, ebx
ret האפשרויות אותו זמן ביצוע.2א( בזמן ריצה ל-
מהיר יותר, אבל דורש יותר זיכרון לקוד.macroב( השימוש ב-
ג( השימוש בפונקציה מהיר יותר, אבל דורש יותר זיכרון לקוד.
לא יכולה לעבוד, כי היא לא מוציאה משתנים מהמחסניתTripleד( הפונקציה
6שאלה 2. מוצעות 3 פי eaxברצוננו לכתוב קוד לשימוש רב-פעמי, שמכפיל את ערך •
: Triple או קריאה לפונקציה tripleאפשרויות: שימוש במקרו
• %macro triple 0mov ebx, eaxadd eax, eaxadd eax, ebx
%endmacro• Triple: mov ebx, eax
add eax, eax add eax, ebx
ret האפשרויות אותו זמן ביצוע.2א( בזמן ריצה ל-
מהיר יותר, אבל דורש יותר זיכרון לקוד.macroב( השימוש ב-
ג( השימוש בפונקציה מהיר יותר, אבל דורש יותר זיכרון לקוד.
לא יכולה לעבוד, כי היא לא מוציאה משתנים מהמחסניתTripleד( הפונקציה
7שאלה
המוגדרים בצורה הבאה:L1 ו- Lעלינו להחליף בין ערכי המשתנים
L: dw 7L1: dw 0xF7AC
יבצע את זאת כנדרש?לאאילו מקטעי הקוד הבאים
a) mov ax, [L] c) mov eax, [L1] mov bx, [L1] rol eax, 16
mov [L1], ax mov [L1], eaxmov [L], bx
b) mov eax, [L] d) mov eax, [L]rol eax, 16 xor ax, [L1]mov [L], eax xor [L], ax
xor [L1], ax
7שאלה
המוגדרים בצורה הבאה:L1 ו- Lינו להחליף בין ערכי המשתנים על
L: dw 7L1: dw 0xF7AC
יבצע את זאת כנדרשלאאילו מקטעי הקוד הבאים
a) mov ax, [L] c) mov eax, [L1] mov bx, [L1] rol eax, 16
mov [L1], ax mov [L1], eaxmov [L], bx
b) mov eax, [L] d) mov eax, [L]rol eax, 16 xor ax, [L1]mov [L], eax xor [L], ax
xor [L1], ax
8שאלה נתון מבנה נתונים המוגדר באופן הבא:
bla: dd bla + 8, bla + 16, bla + 24, bla + 32, bla + 24, 0, 0, 0, 0, 0:Fooכמו כן נתון הקוד של פונקציה
Foo: cmp ebx, 0jz Endinc ecxpush ebxmov ebx, dword [ebx + 4]call Foopop ebxmov ebx, dword [ebx]call Foo
End: ret bla לפני הקריאה היה ebx כאשר ערכו של Foo לאחר קריאה ל-ecxמה יהיה ערכו של 1.
?0 היה ecxוערכו של לפני הקריאה היה ebx כאשר ערכו של Foo לאחר קריאה ל-ecxמה יהיה ערכו של 2.
bla+4 וערכו של ecx 0 היה?
2 שונים. נשים לב כי ישנם EBX עבור ערכי incנספור את פעולות ה- תשובה יחושב עבורם incקריאות רקורסיביות. לכן, נדאג לכך שמספר פעולות ה-
מוקדם יותר )כלומר נבצע את הסכימה מ"למטה למעלה"( ונוסיף לכך פעולת inc:אחת המתבצעת בפונקציה, נמשיך באופן זה עד שנגיע לבעיה המקורית
foo(EBX=0) = 0 ; stop conditionfoo(EBX=bla+X) = 1 where X>=20foo(EBX=bla+16) = foo(EBX=0) + foo(EBX=bla+24) + 1 = 2foo(EBX=bla+12) = foo(EBX=bla+24) + foo(EBX=bla+32) + 1 = 3foo(EBX=bla+8) = foo(EBX=bla+32) + foo(EBX=bla+24) + 1 = 3foo(EBX=bla+4) = foo(EBX=bla+24) + foo(EBX=bla+16) + 1 = 5foo(EBX=bla) = foo(EBX=bla+16) + foo(EBX=bla+8) + 1 = 6
.ecx=5 ועבור סעיף שני ecx=6 מכאן שעבור סעיף ראשון