notebook/notes/x86-64/procedures.md

27 KiB

title TARGET DECK FILE TAGS tags
Procedures Obsidian::STEM x86-64
x86-64

Overview

The x86-64 stack grows towards lower addresses. When a procedure is invoked, more spack on the top of the stack is allocated for that procedure to make use of. This portion of the stack is called a frame. The general shape of the stack looks as follows:

!x86-64-stack.png

Note parts of this diagram are omitted when possible. For instance, a stack frame may not exist at all if all arguments to a leaf procedure can be passed through registers. A leaf procedure is a function that does not call another function.

%%ANKII Basic What ADT is used internally in procedure-calling mechanisms? Back: A stack. Reference: Bryant, Randal E., and David O'Hallaron. Computer Systems: A Programmer's Perspective. Third edition, Global edition. Always Learning. Pearson, 2016. END%%

%%ANKII Cloze The x86-64 stack grows towards {lower} addresses. Reference: Bryant, Randal E., and David O'Hallaron. Computer Systems: A Programmer's Perspective. Third edition, Global edition. Always Learning. Pearson, 2016. END%%

%%ANKI Basic What is a frame w.r.t. the x86-64 stack? Back: A region of the stack dedicated to a particular function call. Reference: Bryant, Randal E., and David O'Hallaron. Computer Systems: A Programmer's Perspective. Third edition, Global edition. Always Learning. Pearson, 2016.

END%%

%%ANKI Basic What two instructions are used to adjust the top of the x86-64 stack? Back: pushq and popq. Reference: Bryant, Randal E., and David O'Hallaron. Computer Systems: A Programmer's Perspective. Third edition, Global edition. Always Learning. Pearson, 2016.

END%%

%%ANKI Basic What does the "stack pointer" refer to w.r.t. the x86-64 stack? Back: Register %rsp. Reference: Bryant, Randal E., and David O'Hallaron. Computer Systems: A Programmer's Perspective. Third edition, Global edition. Always Learning. Pearson, 2016.

END%%

%%ANKI Basic How is the stack pointer manipulated to allocate space on the x86-64 stack? Back: By decrementing %rsp by an appropriate amount. Reference: Bryant, Randal E., and David O'Hallaron. Computer Systems: A Programmer's Perspective. Third edition, Global edition. Always Learning. Pearson, 2016.

END%%

%%ANKI Basic How is the stack pointer manipulated to deallocate space on the x86-64 stack? Back: By incrementing %rsp by an appropriate amount. Reference: Bryant, Randal E., and David O'Hallaron. Computer Systems: A Programmer's Perspective. Third edition, Global edition. Always Learning. Pearson, 2016.

END%%

%%ANKI Basic Suppose procedure P calls Q. What data sits at the end of P's frame? Back: A return address. Reference: Bryant, Randal E., and David O'Hallaron. Computer Systems: A Programmer's Perspective. Third edition, Global edition. Always Learning. Pearson, 2016.

END%%

%%ANKI Cloze A {leaf} procedure is a function that {does not call another function}. Reference: Bryant, Randal E., and David O'Hallaron. Computer Systems: A Programmer's Perspective. Third edition, Global edition. Always Learning. Pearson, 2016.

END%%

%%ANKI Basic Suppose procedure P calls Q. The return address belongs to who's frame? Back: P Reference: Bryant, Randal E., and David O'Hallaron. Computer Systems: A Programmer's Perspective. Third edition, Global edition. Always Learning. Pearson, 2016.

END%%

%%ANKI Basic Suppose procedure P calls Q. Why is the return address considered to be in P's frame? Back: It is state relevant to P. Reference: Bryant, Randal E., and David O'Hallaron. Computer Systems: A Programmer's Perspective. Third edition, Global edition. Always Learning. Pearson, 2016.

END%%

%%ANKI Basic Q is about to call another procedure. What is the highlighted portion of its stack frame for? !saved-registers.png Back: Callee-saved registers. Reference: Bryant, Randal E., and David O'Hallaron. Computer Systems: A Programmer's Perspective. Third edition, Global edition. Always Learning. Pearson, 2016.

END%%

%%ANKI Basic Q is about to call another procedure. What is the highlighted portion of its stack frame for? !local-variables.png Back: Local variables. Reference: Bryant, Randal E., and David O'Hallaron. Computer Systems: A Programmer's Perspective. Third edition, Global edition. Always Learning. Pearson, 2016.

END%%

%%ANKI Basic Q is about to call another procedure. What is the highlighted portion of its stack frame for? !arg-build-area.png Back: Additional integral arguments. Reference: Bryant, Randal E., and David O'Hallaron. Computer Systems: A Programmer's Perspective. Third edition, Global edition. Always Learning. Pearson, 2016.

END%%

%%ANKI Basic What must still be added to the stack before Q passes control to another procedure? !stack-frame.png Back: The return address. Reference: Bryant, Randal E., and David O'Hallaron. Computer Systems: A Programmer's Perspective. Third edition, Global edition. Always Learning. Pearson, 2016.

END%%

Local Variables

x86-64 employs 6 registers for passing integral (i.e. integer and pointer) arguments between caller and callee.

Bits Arg 1 Arg2 Arg3 Arg4 Arg5 Arg6
64 %rdi %rsi %rdx %rcx %r8 %r9
32 %edi %esi %edx %ecx %r8d %r9d
16 %di %si %dx %cx %r8w %r9w
8 %dil %sil %dl %cl %r8b %r9b

If more than 6 integral arguments are specified to a procedure, the surplus are placed onto the stack in the caller's frame. The 7th argument is placed closer to the top of the stack (i.e. with lower address) than subsequent arguments.

%%ANKI Basic How many registers are available for passing integral arguments between procedures? Back: 6 Reference: Bryant, Randal E., and David O'Hallaron. Computer Systems: A Programmer's Perspective. Third edition, Global edition. Always Learning. Pearson, 2016.

END%%

%%ANKI Cloze By convention, register {%rdi} is used for {the first integral argument}. Reference: Bryant, Randal E., and David O'Hallaron. Computer Systems: A Programmer's Perspective. Third edition, Global edition. Always Learning. Pearson, 2016.

END%%

%%ANKI Basic Which register should the first integral argument of a procedure be placed in? Back: %rdi Reference: Bryant, Randal E., and David O'Hallaron. Computer Systems: A Programmer's Perspective. Third edition, Global edition. Always Learning. Pearson, 2016.

END%%

%%ANKI Cloze By convention, register {%rsi} is used for {the second integral argument}. Reference: Bryant, Randal E., and David O'Hallaron. Computer Systems: A Programmer's Perspective. Third edition, Global edition. Always Learning. Pearson, 2016.

END%%

%%ANKI Basic Which register should the second integral argument of a procedure be placed in? Back: %rsi Reference: Bryant, Randal E., and David O'Hallaron. Computer Systems: A Programmer's Perspective. Third edition, Global edition. Always Learning. Pearson, 2016.

END%%

%%ANKI Basic From smallest to largest, list the four "second integral argument" registers. Back: %sil, %si, %esi, and %rsi. Reference: Bryant, Randal E., and David O'Hallaron. Computer Systems: A Programmer's Perspective. Third edition, Global edition. Always Learning. Pearson, 2016.

END%%

%%ANKI Cloze {1:%rdi} is to the {2:first} integral argument whereas {2:%rsi} is to the {1:second} integral argument. Reference: Bryant, Randal E., and David O'Hallaron. Computer Systems: A Programmer's Perspective. Third edition, Global edition. Always Learning. Pearson, 2016.

END%%

%%ANKI Cloze By convention, register {%rdx} is used for {the third integral argument}. Reference: Bryant, Randal E., and David O'Hallaron. Computer Systems: A Programmer's Perspective. Third edition, Global edition. Always Learning. Pearson, 2016.

END%%

%%ANKI Basic Which register should the third integral argument of a procedure be placed in? Back: %rdx Reference: Bryant, Randal E., and David O'Hallaron. Computer Systems: A Programmer's Perspective. Third edition, Global edition. Always Learning. Pearson, 2016.

END%%

%%ANKI Cloze By convention, register {%rcx} is used for {the fourth integral argument}. Reference: Bryant, Randal E., and David O'Hallaron. Computer Systems: A Programmer's Perspective. Third edition, Global edition. Always Learning. Pearson, 2016.

END%%

%%ANKI Basic Which register should the fourth integral argument of a procedure be placed in? Back: %rcx Reference: Bryant, Randal E., and David O'Hallaron. Computer Systems: A Programmer's Perspective. Third edition, Global edition. Always Learning. Pearson, 2016.

END%%

%%ANKI Basic Which register should Q use to access value 1?

void P() {
  Q(1, 2, 3, 4, 5, 6);
}

Back: %rdi Reference: Bryant, Randal E., and David O'Hallaron. Computer Systems: A Programmer's Perspective. Third edition, Global edition. Always Learning. Pearson, 2016.

END%%

%%ANKI Basic Which register should Q use to access value 2?

void P() {
  Q(1, 2, 3, 4, 5, 6);
}

Back: %rsi Reference: Bryant, Randal E., and David O'Hallaron. Computer Systems: A Programmer's Perspective. Third edition, Global edition. Always Learning. Pearson, 2016.

END%%

%%ANKI Basic Which register should Q use to access value 3?

void P() {
  Q(1, 2, 3, 4, 5, 6);
}

Back: %rdx Reference: Bryant, Randal E., and David O'Hallaron. Computer Systems: A Programmer's Perspective. Third edition, Global edition. Always Learning. Pearson, 2016.

END%%

%%ANKI Basic Which register should Q use to access value 4?

void P() {
  Q(1, 2, 3, 4, 5, 6);
}

Back: %rcx Reference: Bryant, Randal E., and David O'Hallaron. Computer Systems: A Programmer's Perspective. Third edition, Global edition. Always Learning. Pearson, 2016.

END%%

%%ANKI Basic Let S denote %rsp before pushing parameter int a onto the stack. What is %rsp now? Back: S - 8 Reference: Bryant, Randal E., and David O'Hallaron. Computer Systems: A Programmer's Perspective. Third edition, Global edition. Always Learning. Pearson, 2016.

END%%

%%ANKI Basic Let S denote %rsp before pushing parameter short a onto the stack. What is %rsp now? Back: S - 8 Reference: Bryant, Randal E., and David O'Hallaron. Computer Systems: A Programmer's Perspective. Third edition, Global edition. Always Learning. Pearson, 2016.

END%%

%%ANKI Basic Let S denote %rsp before pushing parameter bool a onto the stack. What is %rsp now? Back: S - 8 Reference: Bryant, Randal E., and David O'Hallaron. Computer Systems: A Programmer's Perspective. Third edition, Global edition. Always Learning. Pearson, 2016.

END%%

%%ANKI Basic After calling Q, how much space do local parameters occupy in P's stack frame?

void P() {
  Q(1, 2, 3, 4, 5, 6);
}

Back: 0 bytes. Reference: Bryant, Randal E., and David O'Hallaron. Computer Systems: A Programmer's Perspective. Third edition, Global edition. Always Learning. Pearson, 2016.

END%%

%%ANKI Basic After calling Q, how much space do local parameters occupy in P's stack frame?

void P() {
  Q(1, 2, 3, 4, 5, 6, 7, 8);
}

Back: 16 bytes. Reference: Bryant, Randal E., and David O'Hallaron. Computer Systems: A Programmer's Perspective. Third edition, Global edition. Always Learning. Pearson, 2016.

END%%

%%ANKI Basic After calling Q, how much space do local parameters occupy in P's stack frame?

void P() {
  Q(1, 2, 3, 4, 5, 6, true, 8);
}

Back: 16 bytes. Reference: Bryant, Randal E., and David O'Hallaron. Computer Systems: A Programmer's Perspective. Third edition, Global edition. Always Learning. Pearson, 2016.

END%%

%%ANKI Basic Which frame contains the 7th argument?

void P() {
  ...
  Q(1, 2, 3, 4, 5, 6, 7);
  ...
}

Back: P's frame. Reference: Bryant, Randal E., and David O'Hallaron. Computer Systems: A Programmer's Perspective. Third edition, Global edition. Always Learning. Pearson, 2016. Tags: c17

END%%

%%ANKI Basic Which frame contains the return address?

void P() {
  ...
  Q(1, 2, 3);
  ...
}

Back: P's frame. Reference: Bryant, Randal E., and David O'Hallaron. Computer Systems: A Programmer's Perspective. Third edition, Global edition. Always Learning. Pearson, 2016. Tags: c17

END%%

%%ANKI Basic Which of the 7th or 8th argument has lower address?

void P() {
  ...
  Q(1, 2, 3, 4, 5, 6, 7, 8);
  ...
}

Back: The 7th argument. Reference: Bryant, Randal E., and David O'Hallaron. Computer Systems: A Programmer's Perspective. Third edition, Global edition. Always Learning. Pearson, 2016. Tags: c17

END%%

%%ANKI Basic Which of the 7th or 8th argument is nearer the stack's top?

void P() {
  ...
  Q(1, 2, 3, 4, 5, 6, 7, 8);
  ...
}

Back: The 7th argument. Reference: Bryant, Randal E., and David O'Hallaron. Computer Systems: A Programmer's Perspective. Third edition, Global edition. Always Learning. Pearson, 2016. Tags: c17

END%%

%%ANKI Basic Which arguments are placed onto the stack?

void P() {
  ...
  Q(1, 2, 3, 4, 5, 6, 7, 8);
  ...
}

Back: Arguments 7 and 8. Reference: Bryant, Randal E., and David O'Hallaron. Computer Systems: A Programmer's Perspective. Third edition, Global edition. Always Learning. Pearson, 2016. Tags: c17

END%%

%%ANKI Basic Which of the 6th or 7th argument is nearer the stack's top?

void P() {
  ...
  Q(1, 2, 3, 4, 5, 6, 7);
  ...
}

Back: N/A. Argument 6 isn't placed onto the stack at all. Reference: Bryant, Randal E., and David O'Hallaron. Computer Systems: A Programmer's Perspective. Third edition, Global edition. Always Learning. Pearson, 2016. Tags: c17

END%%

%%ANKI Basic Which of the 7th argument or the return address is nearer the stack's top?

void P() {
  ...
  Q(1, 2, 3, 4, 5, 6, 7);
  ...
}

Back: The return address. Reference: Bryant, Randal E., and David O'Hallaron. Computer Systems: A Programmer's Perspective. Third edition, Global edition. Always Learning. Pearson, 2016. Tags: c17

END%%

In some cases, integral values still need to be placed onto the stack. For example, operator & is applied to a local variable and hence we must be able to generate an address for it.

%%ANKI Cloze In the following, P is the {caller} and Q is the {callee}.

int P() { Q(); }

Reference: Bryant, Randal E., and David O'Hallaron. Computer Systems: A Programmer's Perspective. Third edition, Global edition. Always Learning. Pearson, 2016. Tags: c17

END%%

%%ANKI Basic Why doesn't P have to allocate any local variables on the stack?

void P() {
  int a = 100;
  Q(a);
}

Back: A register can be set to immediate $100 for Q to access. Reference: Bryant, Randal E., and David O'Hallaron. Computer Systems: A Programmer's Perspective. Third edition, Global edition. Always Learning. Pearson, 2016. Tags: c17

END%%

%%ANKI Basic Why doesn't P have to allocate any local variables on the stack?

void P() {
  int a = 100;
  Q(&a);
}

Back: N/A. It does since we need an address for a to supply to Q. Reference: Bryant, Randal E., and David O'Hallaron. Computer Systems: A Programmer's Perspective. Third edition, Global edition. Always Learning. Pearson, 2016. Tags: c17

END%%

%%ANKI Basic Is P's local stack variables or arguments to Q nearer the stack's top?

void P() {
  ...
  Q(1, 2, 3, 4, 5, 6);
  ...
}

Back: N/A. P does not have any arguments passed to Q on the stack. Reference: Bryant, Randal E., and David O'Hallaron. Computer Systems: A Programmer's Perspective. Third edition, Global edition. Always Learning. Pearson, 2016. Tags: c17

END%%

%%ANKI Basic Is P's local stack variables or arguments to Q nearer the stack's top?

void P() {
  ...
  Q(1, 2, 3, 4, 5, 6, 7);
  ...
}

Back: The arguments to Q. Reference: Bryant, Randal E., and David O'Hallaron. Computer Systems: A Programmer's Perspective. Third edition, Global edition. Always Learning. Pearson, 2016. Tags: c17

END%%

%%ANKI Basic Which registers are designated for argument passing? Back: %rdi, %rsi, %rdx, %rcx, and %r8-%r9. Reference: Bryant, Randal E., and David O'Hallaron. Computer Systems: A Programmer's Perspective. Third edition, Global edition. Always Learning. Pearson, 2016.

END%%

Callee-Saved Registers

x86-64 employs 6 registers as callee-saved registers. If procedure P calls procedure Q, Q must preserve the values of these registers. That is, if Q were to modify these registers, Q is also responsible for restoring these values before returning back to P.

Bits
64 %rbx %rbp %r12 %r13 %r14 %r15
32 %ebx %ebp %r12d %r13d %r14d %r15d
16 %bx %bp %r12w %r13w %r14w %r15w
8 %bl %bpl %r12b %r13b %r14b %15b

%%ANKI Basic Which registers are designated as callee-saved? Back: %rbx, %rbp, and %r12-%r15. Reference: Bryant, Randal E., and David O'Hallaron. Computer Systems: A Programmer's Perspective. Third edition, Global edition. Always Learning. Pearson, 2016.

END%%

%%ANKI Basic How many registers are designated as callee-saved? Back: 6. Reference: Bryant, Randal E., and David O'Hallaron. Computer Systems: A Programmer's Perspective. Third edition, Global edition. Always Learning. Pearson, 2016.

END%%

%%ANKI Basic Which registers are designated as caller-saved? Back: All but callee-saved registers and %rsp. Reference: Bryant, Randal E., and David O'Hallaron. Computer Systems: A Programmer's Perspective. Third edition, Global edition. Always Learning. Pearson, 2016.

END%%

%%ANKI Basic What is a callee-saved register? Back: A register whose value must be preserved by a callee on return. Reference: Bryant, Randal E., and David O'Hallaron. Computer Systems: A Programmer's Perspective. Third edition, Global edition. Always Learning. Pearson, 2016.

END%%

%%ANKI Cloze By convention, register %rbp is used for {base pointers}. Reference: Bryant, Randal E., and David O'Hallaron. Computer Systems: A Programmer's Perspective. Third edition, Global edition. Always Learning. Pearson, 2016.

END%%

%%ANKI Basic Suppose P calls Q. Callee-saved registers are in which stack frame? Back: Q's. Reference: Bryant, Randal E., and David O'Hallaron. Computer Systems: A Programmer's Perspective. Third edition, Global edition. Always Learning. Pearson, 2016.

END%%

%%ANKI Basic Suppose P calls Q with 8 integral arguments. Which of P's callee-saved values or arguments to Q are nearer the stack's top? Back: P's arguments to Q. Reference: Bryant, Randal E., and David O'Hallaron. Computer Systems: A Programmer's Perspective. Third edition, Global edition. Always Learning. Pearson, 2016.

END%%

%%ANKI Basic Which number-suffixed register(s) are used for passing integral arguments to procedures? Back: %r8 and %r9. Reference: Bryant, Randal E., and David O'Hallaron. Computer Systems: A Programmer's Perspective. Third edition, Global edition. Always Learning. Pearson, 2016.

END%%

%%ANKI Basic Which number-suffixed register(s) are conventionally designated "callee-saved"? Back: %r12, %13, %r14, and %r15. Reference: Bryant, Randal E., and David O'Hallaron. Computer Systems: A Programmer's Perspective. Third edition, Global edition. Always Learning. Pearson, 2016.

END%%

%%ANKI Basic Which number-suffixed register(s) are conventionally designated "caller-saved"? Back: %r10 and %r11. Reference: Bryant, Randal E., and David O'Hallaron. Computer Systems: A Programmer's Perspective. Third edition, Global edition. Always Learning. Pearson, 2016.

END%%

%%ANKI Basic What does it mean for a register to be callee-saved? Back: The callee must ensure the register's value is unchanged by the time it returns. Reference: Bryant, Randal E., and David O'Hallaron. Computer Systems: A Programmer's Perspective. Third edition, Global edition. Always Learning. Pearson, 2016.

END%%

%%ANKI Basic What does it mean for a register to be caller-saved? Back: Any procedure can modify the register's value. Reference: Bryant, Randal E., and David O'Hallaron. Computer Systems: A Programmer's Perspective. Third edition, Global edition. Always Learning. Pearson, 2016.

END%%

%%ANKI Basic Why are caller-saved registers named the way they are? Back: It's up to the caller to preserve their value before a procedure call. Reference: Bryant, Randal E., and David O'Hallaron. Computer Systems: A Programmer's Perspective. Third edition, Global edition. Always Learning. Pearson, 2016.

END%%

%%ANKI Basic What misnomer does designating %r10 and %r11 as caller-saved registers introduce? Back: This seems to imply there are no other caller-saved registers. Reference: Bryant, Randal E., and David O'Hallaron. Computer Systems: A Programmer's Perspective. Third edition, Global edition. Always Learning. Pearson, 2016.

END%%

Frame Pointer

The frame pointer, also known as the base pointer, marks the start of a variable-sized frame. %rbp is pushed onto the stack (since it is caller-saved) and its value updated to the new value of %rsp. Relative offsets are then computed according to it.

%%ANKI Basic Why is register %rbp named the way it is? Back: It stands for base pointer. Reference: Bryant, Randal E., and David O'Hallaron. Computer Systems: A Programmer's Perspective. Third edition, Global edition. Always Learning. Pearson, 2016.

END%%

%%ANKI Cloze {1:%rsp} is to {2:fixed}-sized frames whereas {2:%rbp} is to {1:variable}-sized frames. Reference: Bryant, Randal E., and David O'Hallaron. Computer Systems: A Programmer's Perspective. Third edition, Global edition. Always Learning. Pearson, 2016.

END%%

%%ANKI Basic What kind of frames use the %rbp register? Back: Variable-sized frames. Reference: Bryant, Randal E., and David O'Hallaron. Computer Systems: A Programmer's Perspective. Third edition, Global edition. Always Learning. Pearson, 2016.

END%%

%%ANKI Basic In fixed-sized frames, what is the first callee-saved register on the stack? Back: Indeterminate. Reference: Bryant, Randal E., and David O'Hallaron. Computer Systems: A Programmer's Perspective. Third edition, Global edition. Always Learning. Pearson, 2016.

END%%

%%ANKI Basic In variable-sized frames, what is the first callee-saved register on the stack? Back: %rbp. Reference: Bryant, Randal E., and David O'Hallaron. Computer Systems: A Programmer's Perspective. Third edition, Global edition. Always Learning. Pearson, 2016.

END%%

%%ANKI Basic What is typically the ultimate instruction of a fixed-sized frame? Back: ret Reference: Bryant, Randal E., and David O'Hallaron. Computer Systems: A Programmer's Perspective. Third edition, Global edition. Always Learning. Pearson, 2016.

END%%

%%ANKI Basic What is typically the penultimate instruction of a fixed-sized frame? Back: Indeterminate. Reference: Bryant, Randal E., and David O'Hallaron. Computer Systems: A Programmer's Perspective. Third edition, Global edition. Always Learning. Pearson, 2016.

END%%

%%ANKI Basic What is typically the ultimate instruction of a variable-sized frame? Back: ret Reference: Bryant, Randal E., and David O'Hallaron. Computer Systems: A Programmer's Perspective. Third edition, Global edition. Always Learning. Pearson, 2016.

END%%

%%ANKI Basic What is typically the penultimate instruction of a variable-sized frame? Back: leave Reference: Bryant, Randal E., and David O'Hallaron. Computer Systems: A Programmer's Perspective. Third edition, Global edition. Always Learning. Pearson, 2016.

END%%

%%ANKI Basic Assume frame Q starts at address S. If applicable, what address is its frame pointer set to? Back: S + 8 Reference: Bryant, Randal E., and David O'Hallaron. Computer Systems: A Programmer's Perspective. Third edition, Global edition. Always Learning. Pearson, 2016.

END%%

%%ANKI Basic Assume frame Q starts at address S. When applicable, why is %rbp set to S + 8? Back: It's the value of %rsp after pushing the previous value of %rbp. Reference: Bryant, Randal E., and David O'Hallaron. Computer Systems: A Programmer's Perspective. Third edition, Global edition. Always Learning. Pearson, 2016.

END%%

%%ANKI Basic Allocate an array in a stack frame. Is the start of the array nearer the stack's top or bottom? Back: Bottom. Reference: Bryant, Randal E., and David O'Hallaron. Computer Systems: A Programmer's Perspective. Third edition, Global edition. Always Learning. Pearson, 2016.

END%%

%%ANKI Basic Suppose an array exists in "Local variables". What region is trampled in a buffer overflow? !buffer-overflow.png Back: The return address. Reference: Bryant, Randal E., and David O'Hallaron. Computer Systems: A Programmer's Perspective. Third edition, Global edition. Always Learning. Pearson, 2016.

END%%

Bibliography

  • Bryant, Randal E., and David O'Hallaron. Computer Systems: A Programmer's Perspective. Third edition, Global edition. Always Learning. Pearson, 2016.