From c2fe010bc154feaacb982cf7b1eb8ae268a23b1b Mon Sep 17 00:00:00 2001 From: Perry Kivolowitz Date: Thu, 20 Apr 2023 11:10:21 -0500 Subject: [PATCH] added chapter on spin-locks --- README.md | 19 ++++++++++--------- README.pdf | Bin 159341 -> 159429 bytes 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index e04e95b..aed4c29 100644 --- a/README.md +++ b/README.md @@ -316,15 +316,16 @@ contained therein are applicable to all languages. | Chapter | Markdown | PDF | | ------- | -------- | --- | -| 1 | [Apple Silicon](./more/apple_silicon/README.md) | [Link](./more/apple_silicon/README.pdf) | -| 2 | [Apple / Linux Convergence](./macros) | [Link](./macros/README.pdf) | -| 3 | [Variadic Functions](./more/varargs/README.md) | [Link](./more/varargs/README.pdf) | -| 4 | [Under the hood: System Calls](./more/system_calls/README.md) | [Link](./more/system_calls/README.pdf) | -| 5 | [Determining string literal lengths for C functions](./more/strlen_for_c/README.md) | [Link](./more/strlen_for_c/README.pdf) | -| 6 | [Calling Assembly Language From Python](./python/) | [Link](./python/README.pdf) | -| 7 | [Atomic Operations](./more/atomics/README.md) | [Link](./more/atomics/README.pdf) | -| 8 | [Jump Tables](./more/jump_tables/README.md) | [Link](./more/jump_tables/README.pdf) | -| 9 | [argv](./more/argv_example/jess1.S) | ASM CODE | +| 1 | [Apple Silicon](./more/apple_silicon/README.md) | [Link](./more/apple_silicon/README.pdf) | +| 2 | [Apple / Linux Convergence](./macros) | [Link](./macros/README.pdf) | +| 3 | [Variadic Functions](./more/varargs/README.md) | [Link](./more/varargs/README.pdf) | +| 4 | [Under the hood: System Calls](./more/system_calls/README.md) | [Link](./more/system_calls/README.pdf) | +| 5 | [Determining string literal lengths for C functions](./more/strlen_for_c/README.md) | [Link](./more/strlen_for_c/README.pdf) | +| 6 | [Calling Assembly Language From Python](./python/) | [Link](./python/README.pdf) | +| 7 | [Atomic Operations](./more/atomics/README.md) | [Link](./more/atomics/README.pdf) | +| 8 | [Jump Tables](./more/jump_tables/README.md) | [Link](./more/jump_tables/README.pdf) | +| 9 | [argv](./more/argv_example/jess1.S) | ASM CODE | +| 10 | [spin-locks](./more/spin-lock/) | [Link](./more/spin-lock/README.pdf) | | - | [Debugging Lecture](./debugging/Discourses%20and%20Dialogs%20on%20Debugging.pptx) | PPTX | ## Macro Suite diff --git a/README.pdf b/README.pdf index 6bf96b21710961e26f048f43bbc4c9e1b7e92fcd..bd011b366a29777e989c18f08a37f0d7ec569b5c 100644 GIT binary patch delta 13462 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 delta 13356 zcmai)Q*hu>)8;3(?M!UjwkEc1JNd`S#I|N)b7I?=*tYFt=l#B|-L2h=z3QjC&Z#;# zr|Rkc_234~#X3wa4POwF!j(IiJ5DlDM`!%MS_CaTQ_^vy+9P@jbzgx6w*<; zBpH_BLh{25)KrLKSHr|~*huNg2>7J1ggYiX^9fO88WnpQg`yF(NpS)S5yGe& Q+rE8o7 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