为什么要将esp+11的地址存到esp+4中去
时间: 2023-08-18 09:06:26 浏览: 41
这是因为在函数调用过程中,函数的参数是通过栈来传递的。在x86架构中,函数参数是从右往左依次压入栈中的,函数调用的过程如下:
1. 首先将函数的返回地址压入栈中。
2. 然后将函数的第一个参数压入栈中。
3. 接着将函数的第二个参数压入栈中。
4. 以此类推,直到将所有参数都压入栈中。
5. 最后调用函数,函数执行完毕后,将返回值存储到EAX寄存器中,并将栈指针(ESP)恢复到函数调用前的值。
在这段代码中,我们需要将输入的字符串作为函数的第一个参数传递给scanf函数,而ESP+4正是函数的第一个参数的内存地址。因此,我们需要将输入的字符串存储到ESP+4的内存地址中。由于在之前的指令中,ESP+11的内存地址已经存储了输入的字符串,因此我们需要将其复制到ESP+4的内存地址中,以便将其作为函数的第一个参数传递给scanf函数。
相关问题
shr dword ptr[esp+4]
这是一条汇编指令,用于将指定内存地址处的双字(32位)数据向右移动1位,然后将结果存储回该内存地址。具体而言,该指令的含义如下:
- `dword ptr` 表示操作的是一个双字(32位)数据。
- `[esp+4]` 表示操作的内存地址为当前栈顶指针(ESP)加上4个字节(即栈顶的下一个双字)。
- `shr` 表示将数据向右移动1位(相当于除以2),并将结果存储回原地址。
需要注意的是,由于该指令没有指定源操作数,因此实际上是将指定地址处的数据作为操作数进行移位运算,并将结果存回该地址。因此,该指令可能会修改该地址处的数据。
mov [esp+8+Format], offset aForFunS 的含义
这段汇编代码是将字符串 "For fun's sake!" 的地址存到栈上的一个特定位置(相对于栈顶偏移8字节的位置)。具体来说,`[esp+8+Format]` 表示栈顶地址再加上 8 字节偏移量,再加上 `Format` 变量的地址。而 `offset aForFunS` 则是将字符串 "For fun's sake!" 的地址(即该字符串在代码段中的地址)作为一个常量放到代码段中,并返回该常量的地址。因此,该指令的含义就是将字符串 "For fun's sake!" 的地址存到栈上的 `[esp+8+Format]` 的位置。
相关推荐
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)