fix 3.md and update Makefile
This commit is contained in:
4
Makefile
4
Makefile
@@ -1,2 +1,4 @@
|
|||||||
all:
|
all:
|
||||||
rm ./notes/*.out
|
rm -f ./notes/*.out
|
||||||
|
rm -f ./notes/*.o
|
||||||
|
rm -f ./notes/*.s
|
||||||
83
notes/3.md
83
notes/3.md
@@ -52,7 +52,7 @@ void sumstore(long x, long y, long *dest) {
|
|||||||
```
|
```
|
||||||
|
|
||||||
```sh {cmd hide}
|
```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
|
### Integer Registers
|
||||||
@@ -267,12 +267,12 @@ long absdiff(long x, long y) {
|
|||||||
```
|
```
|
||||||
|
|
||||||
```sh { cmd hide }
|
```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`**
|
**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 absdiff_j(long x, long y) {
|
||||||
long result;
|
long result;
|
||||||
int ntest = x <= y;
|
int ntest = x <= y;
|
||||||
@@ -300,7 +300,7 @@ long absdiff(long x, long y) {
|
|||||||
```
|
```
|
||||||
|
|
||||||
```sh {cmd hide}
|
```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.
|
However, there are several *bad cases* for conditional move.
|
||||||
@@ -357,7 +357,7 @@ loop:
|
|||||||
</table>
|
</table>
|
||||||
|
|
||||||
```sh {cmd hide}
|
```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**
|
**general do-while translation**
|
||||||
@@ -426,7 +426,7 @@ long pcount_while(unsigned long x) {
|
|||||||
```
|
```
|
||||||
```sh {cmd hide}
|
```sh {cmd hide}
|
||||||
echo "jmp-to-middle translation"
|
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**
|
**general while translation#2**
|
||||||
@@ -478,7 +478,7 @@ long pcount_while(unsigned long x) {
|
|||||||
```
|
```
|
||||||
```sh {cmd hide}
|
```sh {cmd hide}
|
||||||
echo "while to do-while conversion"
|
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
|
#### for loop form
|
||||||
@@ -560,13 +560,13 @@ long pcount_for(unsigned long x) {
|
|||||||
<td>
|
<td>
|
||||||
|
|
||||||
```sh {cmd hide}
|
```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
|
||||||
```
|
```
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
|
|
||||||
```sh {cmd hide}
|
```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
|
||||||
```
|
```
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
@@ -614,7 +614,7 @@ long switch_eg (long x, long y, long z) {
|
|||||||
<td>
|
<td>
|
||||||
|
|
||||||
```sh {cmd hide}
|
```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
|
||||||
```
|
```
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
@@ -667,7 +667,7 @@ void multstore(long x, long y, long *dest) {
|
|||||||
```
|
```
|
||||||
|
|
||||||
```sh {cmd hide}
|
```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`
|
Procedure call `call label`
|
||||||
@@ -676,3 +676,64 @@ Procedure call `call label`
|
|||||||
Return address:
|
Return address:
|
||||||
* Address of the next instruction right after call
|
* Address of the next instruction right after call
|
||||||
Procedure return: `ret`
|
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
|
||||||
|
```
|
||||||
Reference in New Issue
Block a user