当前位置: 首页 > wzjs >正文

什么是企业云网站建设视觉设计师和平面设计师的区别

什么是企业云网站建设,视觉设计师和平面设计师的区别,短网址生成管理平台,设计网站首页多少钱目录 一、C语言示例代码 二、汇编代码分步解析(x86架构) 1. 调用前:参数压栈(从右向左) 2. 进入被调函数:保存栈帧 3. 执行函数逻辑 4. 恢复栈帧并返回 三、内存布局图示(调用过程中栈的变…

目录

一、C语言示例代码

二、汇编代码分步解析(x86架构)

1. 调用前:参数压栈(从右向左)

2. 进入被调函数:保存栈帧

3. 执行函数逻辑

4. 恢复栈帧并返回

三、内存布局图示(调用过程中栈的变化)

调用 add(x, y) 前的栈:

进入 add 函数后的栈:

四、关键寄存器状态变化

五、调用约定与栈平衡

六、调试相关:栈填充 0xCC

七、总结


一、C语言示例代码

int add(int a, int b) {int result = a + b;return result;
}int main() {int x = 3, y = 5;int sum = add(x, y);  // 函数调用return 0;
}

二、汇编代码分步解析(x86架构)

1. 调用前:参数压栈(从右向左)
; main函数中调用 add(x, y) 的汇编代码
push    y       ; 第二个参数压栈(b=5)
push    x       ; 第一个参数压栈(a=3)
call    add     ; 调用函数,返回地址压栈
add     esp, 8  ; 调用者清理栈空间(cdecl约定)
2. 进入被调函数:保存栈帧
add:; 保存调用者的栈帧基址push    ebp         ; 旧ebp压栈mov     ebp, esp    ; 新ebp指向当前栈顶; 分配局部变量空间(假设需要4字节)sub     esp, 4      ; esp下移,预留result的空间
3. 执行函数逻辑
    ; 通过ebp访问参数和局部变量mov     eax, [ebp+8]    ; 取第一个参数a(a=3)add     eax, [ebp+12]   ; 加第二个参数b(b=5)mov     [ebp-4], eax    ; 结果存入局部变量result; 返回值放入eaxmov     eax, [ebp-4]    ; eax = 8
4. 恢复栈帧并返回
    ; 释放局部变量空间mov     esp, ebp    ; esp回到ebp位置(回收栈空间); 恢复调用者的ebppop     ebp         ; 弹出旧ebp到寄存器; 返回调用者(ret弹出返回地址到eip)ret

三、内存布局图示(调用过程中栈的变化)

调用 add(x, y) 前的栈:
高地址
| ...        | 
| y=5        | ← [ebp+12] (第二个参数)
| x=3        | ← [ebp+8]  (第一个参数)
| 返回地址    | ← esp 在此处(call指令压入)
低地址
进入 add 函数后的栈:
高地址
| ...        |
| y=5        | ← [ebp+12]
| x=3        | ← [ebp+8]
| 返回地址    | 
| 旧ebp      | ← ebp 现在指向这里
| result     | ← [ebp-4] (局部变量)
低地址       ← esp 现在指向这里

四、关键寄存器状态变化

步骤ebpespeax
调用前(main)指向main栈帧基址指向参数y上方未使用
进入add函数后指向新栈帧基址指向局部变量result未使用
执行加法后同上同上8
返回main后恢复为main栈帧基址指向参数y上方+88

五、调用约定与栈平衡

  1. cdecl约定(C默认):

    • 参数从右向左压栈。

    • 调用者负责清理栈(如 add esp, 8)。

    • 返回值通过 eax 传递。

  2. stdcall约定(Windows API常用):

    • 参数从右向左压栈。

    • 被调函数负责清理栈(如 ret 8)。

    • 返回值同样通过 eax 传递。


六、调试相关:栈填充 0xCC

在Debug模式下,编译器会用 0xCC 填充未初始化的栈空间(对应机器码 int 3,触发断点)。例如:

sub     esp, 20       ; 分配20字节栈空间
mov     edi, esp      ; 用edi指向栈顶
mov     ecx, 5        ; 填充5次(20字节)
mov     eax, 0xCCCCCCCC
rep stosd             ; 重复填充0xCC

如果程序意外执行到 0xCC,调试器会捕获到异常,帮助发现栈溢出问题。

七、总结

函数的调用过程涉及栈的管理和寄存器的协作,主要步骤如下:

1、参数压栈:
按照调用约定(如cdecl),参数从右向左依次压入栈中,esp(栈顶指针)随之下移。

2、调用函数:
call 指令执行时,将下一条指令的地址(返回地址)压入栈中,并将控制权交给被调函数(修改 eip 为函数入口地址)。

3、保存调用者栈帧:
进入被调函数后,先保存调用者的 ebp(基址指针):push ebp。随后将当前 esp 赋值给 ebp,建立新栈帧:mov ebp, esp。

4、分配栈空间:
调整 esp 为局部变量预留空间(如 sub esp, 20),可能用特定值(如 0xCC)填充以辅助调试。

5、保存寄存器现场:
将可能被修改的寄存器(如 ebx, esi, edi)压栈保护,确保函数返回后调用者的寄存器状态不变。

6、执行函数体:
通过 ebp 偏移访问参数和局部变量(如 [ebp+8] 为第一个参数),执行函数逻辑,结果通常存入 eax。

7、恢复寄存器和栈帧:
恢复保存的寄存器(pop 操作),将 esp 重置到 ebp 释放局部变量:mov esp, ebp。随后恢复调用者的 ebp:pop ebp。

8、返回到调用者:
ret 指令弹出返回地址到 eip,跳转回调用处。调用者负责清理参数栈空间(如 add esp, 8 清理两个参数)。

关键点总结:

栈帧切换:ebp 和 esp 协同管理栈帧,确保函数隔离性。

调用约定:参数传递顺序(如右到左)、栈平衡责任(调用者或被调函数)由约定决定。

返回值:通过 eax 传递,复杂类型可能通过内存。

调试支持:栈填充 0xCC(int 3 指令)便于检测溢出。

http://www.dtcms.com/wzjs/545109.html

相关文章:

  • 最权威的公文写作网站网上买手表哪个网站可以买到正品
  • h5网站开发流程网站添加在线留言
  • 东莞广告公司东莞网站建设网站备案中更名
  • wordpress站内信插件开发一个交易网站多少钱
  • 阿里网站建设费用优化用户体验
  • 自己创建一个网站需要多少钱网站开发 数据库对比
  • 做代刷网站赚钱不我的小程序怎么制作
  • 国外设计网站h开头wordpress 父分类
  • 建设个商城网站需要多少钱英文外贸网站建设
  • 如何设置手机网站主页网页解析技术流程
  • 益阳网站建设企业如何做网站优化的内容
  • 万网网站建设的子分类能显示多少个wordpress 安装 模板
  • 公司的网站建设计入什么科目举例一个成功的网络营销案例
  • 品牌网站建设小i蝌蚪网站上做旅游卖家要学什么
  • 建设银行新版网站上线企业邮箱域名
  • 网站开发常用问题用jsp建设网站
  • 什么是做自己的网站宜昌本地网站建设
  • 免费网站制作静态网页扩展名
  • 建一个网站需要哪些费用wordpress 免费 最好
  • 网站建设域名是什么工会网站开发需求分析
  • 营销网站建站企业做一个公司网站的费用
  • 备案用的网站建设方案书上海城乡建设管理局网站
  • 会议专属网站平台建设报价单找个公司做网站需要注意什么
  • 网站上的文章做参考文献沈阳网站建设咨询
  • 网站做xss过滤3秒钟自动跳转网页
  • wordpress企业网站入门网页搜题
  • 网站搜索优化官网做网站要学多久
  • 用数据库做学校网站wordpress中文分享插件
  • 泰安千橙网站建设网站建设的毕业设计选题管理系统
  • 用宝塔做网站wordpress可以建哪些网站吗