Computer Architecture and Assembly Language

Slides:



Advertisements
Similar presentations
Calling sequence ESP.
Advertisements

C Programming and Assembly Language Janakiraman V – NITK Surathkal 2 nd August 2014.
Computer Organization And Assembly Language
Assembly Language for Intel-Based Computers Chapter 8: Advanced Procedures Kip R. Irvine.
Practical Session 3 Computer Architecture and Assembly Language.
Assembly Language for Intel-Based Computers Chapter 5: Procedures Kip R. Irvine.
Practical Session 9 Co-Routines. Co-Routines Co-routine state.
PC hardware and x86 3/3/08 Frans Kaashoek MIT
1 Lecture 5: Procedures Assembly Language for Intel-Based Computers, 4th edition Kip R. Irvine.
Practical Session 3. The Stack The stack is an area in memory that its purpose is to provide a space for temporary storage of addresses and data items.
Accessing parameters from the stack and calling functions.
Practical Session 3. The Stack The stack is an area in memory that its purpose is to provide a space for temporary storage of addresses and data items.
Web siteWeb site ExamplesExamples Irvine, Kip R. Assembly Language for Intel-Based Computers, Stack Operations Runtime Stack PUSH Operation POP.
CEG 320/520: Computer Organization and Assembly Language ProgrammingIntel Assembly 1 Intel IA-32 vs Motorola
Procedures and the Stack Chapter 5 S. Dandamudi To be used with S. Dandamudi, “Introduction to Assembly Language Programming,” Second Edition, Springer,
6.828: PC hardware and x86 Frans Kaashoek
Computer Architecture and Operating Systems CS 3230 :Assembly Section Lecture 7 Department of Computer Science and Software Engineering University of Wisconsin-Platteville.
Today’s topics Parameter passing on the system stack Parameter passing on the system stack Register indirect and base-indexed addressing modes Register.
Practical Session 4. Labels Definition - advanced label: (pseudo) instruction operands ; comment valid characters in labels are: letters, numbers, _,
Assembly Language for Intel-Based Computers, 6 th Edition Chapter 8: Advanced Procedures (c) Pearson Education, All rights reserved. You may.
Practical Session 7 Computer Architecture and Assembly Language.
The x86 Architecture Lecture 15 Fri, Mar 4, 2005.
Today’s topics Procedures Procedures Passing values to/from procedures Passing values to/from procedures Saving registers Saving registers Documenting.
Assembly 07. Outline Boxes within Boxes Procedure Definition call, ret Saving / Restoring Registers Argument(s) Return Value(s) Global vs. Local Data.
Compiler Construction Code Generation Activation Records
Practical Session 7. Co-Routines co-routines are assembly implementation of threads each co-routine decides to which co- routine to pass a control - unlike.
Introduction to Assembly II Abed Asi Extended System Programming Laboratory (ESPL) CS BGU Fall 2014/2015.
Computer Architecture and Assembly Language
1 Assembly Language: Function Calls Jennifer Rexford.
CSC 221 Computer Organization and Assembly Language Lecture 16: Procedures.
Assembly Language Data Movement Instructions. MOV Instruction Move source operand to destination mov destination, source The source and destination are.
CSC 221 Computer Organization and Assembly Language Lecture 15: STACK Related Instructions.
Microprocessors CSE- 341 Dr. Jia Uddin Assistant Professor, CSE, BRAC University Dr. Jia Uddin, CSE, BRAC University.
Assembly Language Addressing Modes. Introduction CISC processors usually supports more addressing modes than RISC processors. –RISC processors use the.
ICS51 Introductory Computer Organization Accessing parameters from the stack and calling functions.
Practical Session 3 Computer Architecture and Assembly Language.
Practical Session 3.
Section 5: Procedures & Stacks
Practical Session 5.
Stack Operations Dr. Hadi AL Saadi.
Computer Architecture and Assembly Language
Assembly language.
C function call conventions and the stack
CS-401 Computer Architecture & Assembly Language Programming
Computer Architecture and Assembly Language
Computer Architecture and Assembly Language
Chapter 4 Data Movement Instructions
Introduction to Compilers Tim Teitelbaum
Practical Session 7.
Computer Architecture and Assembly Language
Machine-Level Programming 4 Procedures
Stack Frames and Advanced Procedures
Assembly Language Programming II: C Compiler Calling Sequences
Practical Session 9.
Computer Architecture and Assembly Language
MIPS Procedure Calls CSE 378 – Section 3.
Practical Session 4.
Multi-modules programming
Week 2: Buffer Overflow Part 1.
EECE.3170 Microprocessor Systems Design I
Computer Architecture CST 250
Computer Architecture and System Programming Laboratory
Low-Level Thread Dispatching on the x86
Computer Organization and Assembly Language
ICS51 Introductory Computer Organization
Computer Architecture and System Programming Laboratory
Computer Architecture and Assembly Language
Computer Architecture and System Programming Laboratory
Computer Architecture and System Programming Laboratory
Computer Architecture and System Programming Laboratory
Presentation transcript:

Computer Architecture and Assembly Language Practical Session 7

Co-Routines co-routines are assembly implementation of threads each co-routine decides to which co-routine to pass a control (unlike “usual” threads) We would implement “silly” round robin scheduling algorithm: main() scheduler co-routine1 scheduler co-routine2 scheduler  co-routine1 scheduler co-routine2 scheduler main()

Co-routine state co-routine is denoted by Coi (i is co-routine’s id) scheduler is also a co-routine co-routine suspends itself after some “time slice” co-routine resumes a scheduler co-routine should save its current state before it suspends itself (in order to continue its execution later) stack state registers flags stack pointer (ESP) instructions pointer (EIP)

Co-routine structure We define an array of co-routines’ structures: why SPi points to the end of stack ? to be able to use push and pop stack functionality with ESP Co-routine structure: STKSIZE equ 16*1024 ;(16 Kb) STKi: resb STKSIZE COi: dd Functioni ; pointer to co-routine function Flags: dd 0 ; 0 if co-routine is not initialized, 1 otherwise SPi: dd STKi + STKSIZE ; pointer to the beginning of co-routine stack SPi Funci co-routine structure co-routine stack

Variables Declaration STKSZ equ 16*1024 ; co-routine stack size CODEP equ 0 ; offset of pointer to co-routine function in co-routine structure FLAGSP equ 4 ; offset of pointer to flags co-routine structure SPP equ 8 ; offset of pointer to co-routine stack in co-routine structure section .rodata align 16 global numco numco: dd 3 CORS: dd CO1 dd CO2 dd CO3 section .data CO1: dd Function1 ; structure for first co-routine Flags1: dd 0 SP1: dd STK1+STKSZ CO2: dd Function1 ; structure for second co-routine Flags2: dd 0 SP2: dd STK2+STKSZ CO3: dd Function2 ; structure for third co-routine Flags3: dd 0 SP3: dd STK3+STKSZ section .bss CURR: resd 1 SPT: resd 1 ; temporary stack pointer variable SPMAIN: resd 1 ; stack pointer of main STK1: resb STKSZ STK2: resb STKSZ STK3: resb STKSZ Variables Declaration

Run example – data declaration .bss .data CURR SPT SPMAIN STK1 STK2 STK3 3 numco CO1 CORS CO2 CO3 Function1 Flags1 SP1 Flags2 SP2 Function2 Flags3 SP3 COUNTER MAX_ITER

Co-routine initialization - save initial co-routine state init_co_from_c: … mov ebx, [ebp+8] ; get co-routine ID number mov ebx, [4*ebx + CORS] ; get COi pointer call co_init main() { /* initialize co-routines*/ for(i = 0; i < numco; i++) init_co_from_c(i); /* start a scheduler co-routine*/ start_co_from_c (2); } co_init: … mov eax, [ebx+CODEP] ; get initial PC mov esp, [EBX+SPP] ; get initial SP push eax ; push initial “return” address pushfd ; push flags pushad ; push all other registers mov [ebx+SPP], esp ; save new SPi value (after all the pushes) SPi Funci co-routine structure co-routine stack

Co-routine initialization - save initial co-routine state init_co_from_c: … mov ebx, [ebp+8] ; get co-routine ID number mov ebx, [4*ebx + CORS] ; get COi pointer call co_init main() { /* initialize co-routines*/ for(i = 0; i < numco; i++) init_co_from_c(i); /* start a scheduler co-routine*/ start_co_from_c (2); } co_init: … mov eax, [ebx+CODEP] ; get initial PC mov esp, [EBX+SPP] ; get initial SP push eax ; push initial “return” address pushfd ; push flags pushad ; push all other registers mov [ebx+SPP], esp ; save new SPi value (after all the pushes) ESP SPi Funci co-routine structure co-routine stack

Co-routine initialization - save initial co-routine state init_co_from_c: … mov ebx, [ebp+8] ; get co-routine ID number mov ebx, [4*ebx + CORS] ; get COi pointer call co_init main() { /* initialize co-routines*/ for(i = 0; i < numco; i++) init_co_from_c(i); /* start a scheduler co-routine*/ start_co_from_c (2); } co_init: … mov eax, [ebx+CODEP] ; get initial PC mov esp, [EBX+SPP] ; get initial SP push eax ; push initial “return” address pushfd ; push flags pushad ; push all other registers mov [ebx+SPP], esp ; save new SPi value (after all the pushes) ESP Funci SPi co-routine structure co-routine stack

Co-routine initialization - save initial co-routine state init_co_from_c: … mov ebx, [ebp+8] ; get co-routine ID number mov ebx, [4*ebx + CORS] ; get COi pointer call co_init main() { /* initialize co-routines*/ for(i = 0; i < numco; i++) init_co_from_c(i); /* start a scheduler co-routine*/ start_co_from_c (2); } co_init: … mov eax, [ebx+CODEP] ; get initial PC mov esp, [EBX+SPP] ; get initial SP push eax ; push initial “return” address pushfd ; push flags pushad ; push all other registers mov [ebx+SPP], esp ; save new SPi value (after all the pushes) ESP Funci EFlags SPi co-routine structure co-routine stack

Co-routine initialization - save initial co-routine state init_co_from_c: … mov ebx, [ebp+8] ; get co-routine ID number mov ebx, [4*ebx + CORS] ; get COi pointer call co_init main() { /* initialize co-routines*/ for(i = 0; i < numco; i++) init_co_from_c(i); /* start a scheduler co-routine*/ start_co_from_c (2); } co_init: … mov eax, [ebx+CODEP] ; get initial PC mov esp, [EBX+SPP] ; get initial SP push eax ; push initial “return” address pushfd ; push flags pushad ; push all other registers mov [ebx+SPP], esp ; save new SPi value (after all the pushes) ESP Funci EFlags registers SPi co-routine structure co-routine stack

Co-routine initialization - save initial co-routine state init_co_from_c: … mov ebx, [ebp+8] ; get co-routine ID number mov ebx, [4*ebx + CORS] ; get COi pointer call co_init main() { /* initialize co-routines*/ for(i = 0; i < numco; i++) init_co_from_c(i); /* start a scheduler co-routine*/ start_co_from_c (2); } co_init: … mov eax, [ebx+CODEP] ; get initial PC mov esp, [EBX+SPP] ; get initial SP push eax ; push initial “return” address pushfd ; push flags pushad ; push all other registers mov [ebx+SPP], esp ; save new SPi value (after all the pushes) ESP Funci EFlags registers SPi 1 co-routine structure co-routine stack

After co-routine initialization .bss .data CURR SPT SPMAIN STK1 Registers Flags Function1 STK2 STK3 Function2 3 numco CO1 CORS CO2 CO3 Function1 1 Flags1 SP1 Flags2 SP2 Function2 Flags3 SP3 COUNTER MAX_ITER

Co-routine initialization section .text align 16 extern printf global init_co_from_c global start_co_from_c global end_co init_co_from_c: push EBP mov EBP, ESP push EBX mov EBX, [EBP+8] ; EBX contains a number of the co-routine to be initialized mov EBX, [EBX*4+CORS] ; EBX contains a pointer to co-routine structure to be initialized call co_init pop EBX pop EBP ret co_init: pushad bts dword [EBX+FLAGSP],0 ; test if already initialized jc init_done mov EAX,[EBX+CODEP] ; get initial PC mov [SPT], ESP ; save original SP mov ESP,[EBX+SPP] ; get initial SP mov EBP, ESP ; also use as EBP push EAX ; push initial "return" address (initial PC) pushfd ; push flags pushad ; push all other registers mov [EBX+SPP],ESP ; save new SP in structure mov ESP, [SPT] ; restore original SP init_done: popad ‘bts’ instruction tests one bit of its first operand, whose index is given by the second operand, and stores the value of that bit in the carry flag (CF). In addition, ‘bts’ sets the bit to be 1.

Start co-routine scheduler We start scheduling by suspending main() and resuming a scheduler co-routine. start_co_from_c: push EBP mov EBP, ESP pushad mov [SPMAIN], ESP ; save ESP of main () mov EBX, [EBP+8] ; gets ID number of a scheduler mov EBX, [EBX*4 + CORS] ; gets a pointer to a scheduler structure jmp do_resume ; resume a scheduler co-routine We end scheduling by going back to main(). end_co: mov ESP, [SPMAIN] ; restore state of main code popad pop EBP ret main() { /* initialize co-routines*/ for(i = 0; i < numco; i++) init_co_from_c(i); /* start a scheduler co-routine*/ start_co_from_c (2); }

Scheduler co-routine function Scheduler function is started by main. scheduler_Function: pick up some thread ID i mov EBX, [CORS + i*4] ; resumes Coi call resume pick up some other thread ID j mov EBX, [CORS + j*4] ; resumes Coj … jmp end_co ; resume main ‘call resume’ save a state of the current co-routine resume a state of the next co-routine (EBX should contain a pointer to it) EBX is pointer to co-init structure of the co-routine to be resumed. CURR holds a pointer to co-init structure of the current co-routine. resume: ; save state of caller pushfd pushad mov EDX, [CURR] mov [EDX+SPP],ESP ; save current SP do_resume: ; load SP for resumed co-routine mov ESP, [EBX+SPP] mov [CURR], EBX popad ; restore resumed co-routine state popfd ret ; "return" to resumed co-routine! after ‘call resume’ return address (i.e. EIP) is pushed automatically into (co-routine) stack we only have to save EFLAGS, ESP, and registers

Function2 This function used as code for co-routine 3 (scheduler) FMT2: db "Function2, co %lx, called by %lx, pass %ld", 10, 0 Function2: push dword 1 push dword [CORS] ; indeed, called by main push dword [CURR] push dword FMT2 call printf add ESP, 16 mov EBX, [CORS] ; resume CO1 call resume push dword 2 push dword [CORS] mov EBX, [CORS+4] ; resume CO2 call resume push dword 3 push dword [CORS+4] push dword [CURR] push dword FMT2 call printf add ESP, 16 mov EBX, [CORS] ; resume CO1 push dword 4 push dword [CORS] jmp end_co ; resume main

Function1 This function used as code for co-routines 1 and 2 FMT1: db "Function1, co %lx, called by %lx, pass %ld", 10, 0 Function1: push dword 1 push dword [CORS+8] push dword [CURR] push dword FMT1 call printf add ESP, 16 mov EBX, [CORS+8] ; resume a scheduler call resume push dword 2 add ESP, 16 mov EBX, [CORS+8] ; resume a scheduler

Run example – data declaration .bss .data CURR SPT SPMAIN STK1 STK2 STK3 3 numco CO1 CORS CO2 CO3 Function1 Flags1 SP1 Flags2 SP2 Function2 Flags3 SP3 COUNTER MAX_ITER

After co-routine initialization .bss .data CURR SPT SPMAIN STK1 Registers Flags Function1 STK2 STK3 Function2 3 numco CO1 CORS CO2 CO3 Function1 1 Flags1 SP1 Flags2 SP2 Function2 Flags3 SP3 COUNTER MAX_ITER

Resuming - right before .bss .data CO2 CURR SPT SPMAIN STK1 Registers Flags Addr1 STK2 ………. STK3 Addr3 3 numco CO1 CORS CO2 CO3 Function1 1 Flags1 SP1 Flags2 SP2 Function2 Flags3 SP3 COUNTER MAX_ITER resume: pushfd pushad mov EDX, [CURR] mov [EDX+SPP],ESP do_resume: mov ESP, [EBX+SPP] mov [CURR], EBX popad popfd ret ESP

Resuming – resume is called .bss .data CO2 CURR SPT SPMAIN STK1 Registers Flags Addr1 STK2 Addr2 ………. STK3 Addr3 3 numco CO1 CORS CO2 CO3 Function1 1 Flags1 SP1 Flags2 SP2 Function2 Flags3 SP3 COUNTER MAX_ITER resume: pushfd pushad mov EDX, [CURR] mov [EDX+SPP],ESP do_resume: mov ESP, [EBX+SPP] mov [CURR], EBX popad popfd ret ESP

Resuming – backup registers .bss .data CO2 CURR SPT SPMAIN STK1 Registers Flags Addr1 STK2 Addr2 ………. STK3 Addr3 3 numco CO1 CORS CO2 CO3 Function1 1 Flags1 SP1 Flags2 SP2 Function2 Flags3 SP3 COUNTER MAX_ITER resume: pushfd pushad mov EDX, [CURR] mov [EDX+SPP],ESP do_resume: mov ESP, [EBX+SPP] mov [CURR], EBX popad popfd ret ESP

Resuming – backup stack pointer .bss .data CO2 CURR SPT SPMAIN STK1 Registers Flags Addr1 STK2 Addr2 ………. STK3 Addr3 3 numco CO1 CORS CO2 CO3 Function1 1 Flags1 SP1 Flags2 SP2 Function2 Flags3 SP3 COUNTER MAX_ITER resume: pushfd pushad mov EDX, [CURR] mov [EDX+SPP],ESP do_resume: mov ESP, [EBX+SPP] mov [CURR], EBX popad popfd ret ESP

Resuming - load stack pointer of resume co-routine .bss .data CO2 CURR SPT SPMAIN STK1 Registers Flags Addr1 STK2 Addr2 ………. STK3 Addr3 3 numco CO1 CORS CO2 CO3 Function1 1 Flags1 SP1 Flags2 SP2 Function2 Flags3 SP3 COUNTER MAX_ITER resume: pushfd pushad mov EDX, [CURR] mov [EDX+SPP],ESP do_resume: mov ESP, [EBX+SPP] mov [CURR], EBX popad popfd ret ESP

Resuming – set current co-routine variable .bss .data CO3 CURR SPT SPMAIN STK1 Registers Flags Addr1 STK2 Addr2 ………. STK3 Addr3 3 numco CO1 CORS CO2 CO3 Function1 1 Flags1 SP1 Flags2 SP2 Function2 Flags3 SP3 COUNTER MAX_ITER resume: pushfd pushad mov EDX, [CURR] mov [EDX+SPP],ESP do_resume: mov ESP, [EBX+SPP] mov [CURR], EBX popad popfd ret ESP

Resuming – restore a state of loaded co-routine .bss .data CO3 CURR SPT SPMAIN STK1 Registers Flags Addr1 STK2 Addr2 ………. STK3 Addr3 3 numco CO1 CORS CO2 CO3 Function1 1 Flags1 SP1 Flags2 SP2 Function2 Flags3 SP3 COUNTER MAX_ITER resume: pushfd pushad mov EDX, [CURR] mov [EDX+SPP],ESP do_resume: mov ESP, [EBX+SPP] mov [CURR], EBX popad popfd ret ESP

Resuming – go to execute the loaded co-routine .bss .data CO3 CURR SPT SPMAIN STK1 Registers Flags Addr1 STK2 Addr2 ………. STK3 3 numco CO1 CORS CO2 CO3 Function1 1 Flags1 SP1 Flags2 SP2 Function2 Flags3 SP3 COUNTER MAX_ITER resume: pushfd pushad mov EDX, [CURR] mov [EDX+SPP],ESP do_resume: mov ESP, [EBX+SPP] mov [CURR], EBX popad popfd ret ESP