mirror of
https://github.com/NohamR/knowledge-kit.git
synced 2026-05-24 20:00:37 +00:00
docs: Charles 高级技巧
This commit is contained in:
@@ -208,7 +208,7 @@ mov word ptr [0], 66h
|
||||
|
||||
栈是一种后进先出特点的数据存储空间(LIFO)
|
||||
|
||||

|
||||

|
||||
|
||||
- 8086 会将 CS 作为代码段的段地址,将 `CS:IP` 指向的指令作为下一条需要取出执行的指令
|
||||
|
||||
@@ -224,7 +224,7 @@ SP:堆栈寄存器存放栈的偏移地址
|
||||
|
||||
#### push
|
||||
|
||||

|
||||

|
||||
|
||||
`push ax` 指令执行,会拆解为:
|
||||
|
||||
@@ -236,7 +236,7 @@ ax = ah + al,所以 ax 中的数据入栈需要占据2个单位(sp = sp - 2
|
||||
|
||||
#### pop
|
||||
|
||||

|
||||

|
||||
|
||||
`pop ax` 指令执行,会拆解为:
|
||||
|
||||
@@ -248,7 +248,7 @@ ax = ah + al,所以 ax 中的数据入栈需要占据2个单位(sp = sp - 2
|
||||
|
||||
当一个栈空间是空的时候,`SS:SP` 指向栈空间最高地址单元的下一个单元。
|
||||
|
||||

|
||||

|
||||
|
||||
当一个栈空或者满的时候,执行 PUSH、POP 指令需要注意,因为 `SP = SP + 2`、`SP = SP - 2` 都会导致将错误的数据入栈或者错误的数据出栈,导致发生不可预期的事情。
|
||||
|
||||
@@ -457,7 +457,7 @@ int main(int argc, const char * argv[]) {
|
||||
}
|
||||
```
|
||||
|
||||

|
||||

|
||||
|
||||
可以看到 return 的值是保存在 eax 寄存器中。为什么是 e,e是32位的意思(环境:老款 MBP 电脑运行)。
|
||||
|
||||
@@ -571,7 +571,7 @@ int main(int argc, const char * argv[]) {
|
||||
|
||||
CPU 会在栈内部,将局部变量的地方,临时分配10字节大小空间用来存储局部变量。这个怎么实现呢?`SP = SP - 10` 这条指令用来将栈顶指针改变,留出10字节大小空间。但是留出的空间是空的,万一 `CS:IP` 指向这块区域会把里面的数据当作指令去执行,则可能发生一些不可预知的错误。Windows 平台,针对预留的局部变量空间,会走动填充 cc,也就是 `int 3 ` 断点中断,只要 `CS:IP` 去执行就会断点中断,更安全。
|
||||
|
||||

|
||||

|
||||
|
||||
关键代码如下:
|
||||
|
||||
@@ -635,6 +635,6 @@ sum:
|
||||
|
||||
Stack Frame Layout,代表一个函数的执行环境。包括:参数、返回地址、局部变量和包括在本函数内部执行的所有内存操作等
|
||||
|
||||

|
||||

|
||||
|
||||

|
||||

|
||||
Reference in New Issue
Block a user