update 3.md and 4.md
This commit is contained in:
80
notes/3.md
80
notes/3.md
@@ -52,7 +52,7 @@ void sumstore(long x, long y, long *dest) {
|
||||
```
|
||||
|
||||
```sh {cmd hide}
|
||||
while ![ -r 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,7 +267,7 @@ long absdiff(long x, long y) {
|
||||
```
|
||||
|
||||
```sh { cmd hide }
|
||||
while ![ -r 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`**
|
||||
@@ -300,7 +300,7 @@ long absdiff(long x, long y) {
|
||||
```
|
||||
|
||||
```sh {cmd hide}
|
||||
while ![ -r 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:
|
||||
</table>
|
||||
|
||||
```sh {cmd hide}
|
||||
while ![ -r 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 ![ -r 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 ![ -r 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) {
|
||||
<td>
|
||||
|
||||
```sh {cmd hide}
|
||||
while ![ -r 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>
|
||||
|
||||
```sh {cmd hide}
|
||||
while ![ -r 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>
|
||||
</tr>
|
||||
@@ -614,7 +614,7 @@ long switch_eg (long x, long y, long z) {
|
||||
<td>
|
||||
|
||||
```sh {cmd hide}
|
||||
while ![ -r 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>
|
||||
</tr>
|
||||
@@ -667,7 +667,7 @@ void multstore(long x, long y, long *dest) {
|
||||
```
|
||||
|
||||
```sh {cmd hide}
|
||||
while ![ -r 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`
|
||||
@@ -687,7 +687,7 @@ Procedure return: `ret`
|
||||
for example with above example
|
||||
|
||||
```sh {cmd hide}
|
||||
while ![ -r 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
|
||||
```
|
||||
|
||||
* with above `mult2` variable `t` is already stored in `%rax`
|
||||
@@ -718,6 +718,38 @@ Deallocated when return, "finish" code and includes pop by `ret`.
|
||||
|
||||
#### x86-64/Linux Stack Frame
|
||||
|
||||

|
||||
|
||||
* Arguments
|
||||
* Local variables
|
||||
* Old `rbp`
|
||||
|
||||
### Register Saving Conventions
|
||||
|
||||
When calling function, the temporary value of registers could be removed by called function, it could be trouble. So there are **conventions** to save the registers value.
|
||||
|
||||
When procedure `yoo` calls `who`: `yoo` is `caller`, `who` is `callee`
|
||||
* Caller saves temporary values in its frame before the call.
|
||||
* Callee saves saves temporary values in its frame before using and restores them before returning to caller.
|
||||
|
||||
|
||||
#### x86-64 Linux Register Usage
|
||||
|
||||
`%rbx`, `%r12`, `%r13`, `%r14`, `%r15`
|
||||
* Callee-saved
|
||||
* Callee must save & restore
|
||||
|
||||
`%rbp`
|
||||
* Callee-saved
|
||||
* Callee must save & restore
|
||||
* May be used as frame pointer by callee
|
||||
* Can mix & match
|
||||
|
||||
`%rsp`
|
||||
* Special form of callee-saved
|
||||
* Restored to original value upon exit from procedure
|
||||
|
||||
#### EX
|
||||
|
||||
* 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]}
|
||||
@@ -735,5 +767,27 @@ long call_incr() {
|
||||
```
|
||||
|
||||
```sh {cmd hide}
|
||||
while ![ -r 3_13.o ]; do sleep .1; done; objdump -d 3_13.o -Msuffix
|
||||
```
|
||||
while ! [ -r 3_13.o ]; do sleep .1; done; objdump -d 3_13.o -Msuffix
|
||||
```
|
||||
|
||||
### Recursive Function
|
||||
|
||||
```c {cmd=gcc args=[-O1 -x c -fno-stack-protector -c $input_file -o 3_14.o]}
|
||||
long pcount_r(unsigned long x) {
|
||||
if (x == 0) {
|
||||
return 0;
|
||||
} else {
|
||||
return (x & 1) + pcount_r(x >> 1);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
```sh {cmd hide}
|
||||
while ! [ -r 3_14.o ]; do sleep .1; done; objdump -d 3_14.o -Msuffix
|
||||
```
|
||||
|
||||
Recursion is not a special function.
|
||||
* Stack frames mean that each function call has private storage.
|
||||
* Register saving conventions prevent one function call from corrupting another's data. *unless the explictly corrupting like buffer overflow*
|
||||
* Stack discipline follows call/return pattern LIFO
|
||||
|
||||
|
||||
Reference in New Issue
Block a user