diff --git a/Makefile b/Makefile index 4e361d5..76e0dcd 100644 --- a/Makefile +++ b/Makefile @@ -1,2 +1,4 @@ all: - rm ./notes/*.out \ No newline at end of file + rm -f ./notes/*.out + rm -f ./notes/*.o + rm -f ./notes/*.s \ No newline at end of file diff --git a/notes/3.md b/notes/3.md index a9e983b..ebe8130 100644 --- a/notes/3.md +++ b/notes/3.md @@ -52,7 +52,7 @@ void sumstore(long x, long y, long *dest) { ``` ```sh {cmd hide} -while ! [ -f 3_1.o ]; do sleep .1; done; objdump -d 3_1.o +while ! [ -r 3_1.o ]; do sleep .1; done; objdump -d 3_1.o ``` ### Integer Registers @@ -267,12 +267,12 @@ long absdiff(long x, long y) { ``` ```sh { cmd hide } -while ! [ -f 3_3.o ]; do sleep .1; done; objdump -d 3_3.o -Msuffix +while ! [ -r 3_3.o ]; do sleep .1; done; objdump -d 3_3.o -Msuffix ``` **expressing with `goto`** -```c {cmd=gcc args=[-Og -x c -fno-if-conversion -c $input_file -o 3_4.o]} +```c {cmd=gcc args=[-Og -x c -rno-if-conversion -c $input_file -o 3_4.o]} long absdiff_j(long x, long y) { long result; int ntest = x <= y; @@ -300,7 +300,7 @@ long absdiff(long x, long y) { ``` ```sh {cmd hide} -while ! [ -f 3_5.o ]; do sleep .1; done; objdump -d 3_5.o -Msuffix +while ! [ -r 3_5.o ]; do sleep .1; done; objdump -d 3_5.o -Msuffix ``` However, there are several *bad cases* for conditional move. @@ -357,7 +357,7 @@ loop: ```sh {cmd hide} -while ! [ -f 3_6.o ]; do sleep .1; done; objdump -d 3_6.o -Msuffix +while ! [ -r 3_6.o ]; do sleep .1; done; objdump -d 3_6.o -Msuffix ``` **general do-while translation** @@ -426,7 +426,7 @@ long pcount_while(unsigned long x) { ``` ```sh {cmd hide} echo "jmp-to-middle translation" -while ! [ -f 3_7.o ]; do sleep .1; done; objdump -d 3_7.o -Msuffix +while ! [ -r 3_7.o ]; do sleep .1; done; objdump -d 3_7.o -Msuffix ``` **general while translation#2** @@ -478,7 +478,7 @@ long pcount_while(unsigned long x) { ``` ```sh {cmd hide} echo "while to do-while conversion" -while ! [ -f 3_8.o ]; do sleep .1; done; objdump -d 3_8.o -Msuffix +while ! [ -r 3_8.o ]; do sleep .1; done; objdump -d 3_8.o -Msuffix ``` #### for loop form @@ -560,13 +560,13 @@ long pcount_for(unsigned long x) { ```sh {cmd hide} -while ! [ -f 3_9.o ]; do sleep .1; done; objdump -d 3_9.o -Msuffix +while ! [ -r 3_9.o ]; do sleep .1; done; objdump -d 3_9.o -Msuffix ``` ```sh {cmd hide} -while ! [ -f 3_10.o ]; do sleep .1; done; objdump -d 3_10.o -Msuffix +while ! [ -r 3_10.o ]; do sleep .1; done; objdump -d 3_10.o -Msuffix ``` @@ -614,7 +614,7 @@ long switch_eg (long x, long y, long z) { ```sh {cmd hide} -while ! [ -f 3_11.s ]; do sleep .1; done; cat 3_11.s +while ! [ -r 3_11.s ]; do sleep .1; done; cat 3_11.s ``` @@ -667,7 +667,7 @@ void multstore(long x, long y, long *dest) { ``` ```sh {cmd hide} -while ! [ -f 3_12.o ]; do sleep .1; done; objdump -d 3_12.o -Msuffix +while ! [ -r 3_12.o ]; do sleep .1; done; objdump -d 3_12.o -Msuffix ``` Procedure call `call label` @@ -675,4 +675,65 @@ Procedure call `call label` * jmp to label Return address: * Address of the next instruction right after call -Procedure return: `ret` \ No newline at end of file +Procedure return: `ret` + +### Procedure Data Flow + +* registers + * first 6 args: `%rdi`, `%rsi`, `%rdx`, `%rcx`, `%r8`, `%r9` + * return value: `rax` +* stack + +for example with above example + +```sh {cmd hide} +while ! [ -r 3_12.o ]; do sleep .1; done; objdump -d 3_12.o -Msuffix +``` + +* with above `mult2` variable `t` is already stored in `%rax` +* so `movq %rax,(%rbx)` where `%rbx` is `long*dest` + +### Managing local data + +**Stack-Based Languages** + +In languages that support recursion +* Code must be "reentrant", which means multiple simultaneous instantiations of single procedure. +* Need some place to store ***state*** of each instantiation: (**args**, **local variables**, **return pointer**) + +In order to get this, **stack discipline** is used. state for given procedure needed for limited time(from called to return): Calle returns before caller does. + +Stack allocated in **frames**, state for single procdure instantiation. +When function is called, a new stack frame is created above stack top. And then when the function is returned, a corresponding frame is popped. and return to previous call state. + +#### Stack Frame + +is consist of **return information**, **local storage(if needed)** and **temporary space(if needed)**. + +* `%rbp` frame pointer +* `%rsp` stack pointer + +Space allocated when enter procedure, "set-up" code and includes push by `call`. +Deallocated when return, "finish" code and includes pop by `ret`. + +#### x86-64/Linux Stack Frame + + +* for compile w/o *stack canary*, add option `-fno-stack-protector` +```c {cmd=gcc args=[-Og -x c -fno-stack-protector -c $input_file -o 3_13.o]} +long incr(long *p, long val) { + long x = *p; + long y = x + val; + *p = y; + return x; +} +long call_incr() { + long v1 = 15213; + long v2 = incr(&v1, 3000); + return v1 + v2; +} +``` + +```sh {cmd hide} +while ! [ -r 3_13.o ]; do sleep .1; done; objdump -d 3_13.o -Msuffix +``` \ No newline at end of file