博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
练习3:参数值传递的汇编实质
阅读量:4956 次
发布时间:2019-06-12

本文共 1920 字,大约阅读时间需要 6 分钟。

参数值传递的汇编实质,就是在堆栈上创建存储区,看看以下实现:

先来看看Delphi代码,传一个数组参数进去

1 procedure SortIt(a: array of Integer);2 var3   i, j: Integer;4 begin5   j := Length(a);6   for i:=1 to j do7     a[i-1] := i;8 end;

调用代码为:

procedure TForm1.btn1Click(Sender: TObject);var  a: array[0..1] of Integer;begin  SortIt(a);  ShowMessage('a[0]: ' + IntToStr(a[0]) + #13#10 + 'a[1]: ' + IntToStr(a[1]));end;

看看汇编代码是怎样干的:

Unit1.pas.44: SortIt(a);;调用前准备lea eax,[ebp-$08]  ;定义的局部变量放在堆栈里,2个数组元素,32位系统里占8字节,                      ;根据定义的局部变量顺序压栈,这儿只定义了数组A,所以堆栈里                      ;就只有8字节,此句的意思是,把ebp-8的值放到eax中,这个值是                      ;指向a[1]的内存地址,所以执行后eax中为a[0]元素的内存地址mov edx,$00000001call SortIt

 函数入口:

1 ;函数入口处代码 2 00452688 55               push ebp             ;这两行为堆栈框架,函数开始前必这样做以保存调用前 3 00452689 8BEC             mov ebp,esp          ;的堆栈数据,同时为同时为函数创造干净的堆栈环境 4 0045268B 53               push ebx             ;要用到ebp,先保存原值,不要破坏它 5 0045268C 8BCA             mov ecx,edx          ;edx值为1,看起来用于下面的循环,ecx一般用于计数 6 0045268E 85C9             test ecx,ecx         ;test和and类似,不同的是,只影响标志寄存器,不影响结果 7 00452690 7807             js +$07              ;如果sf为1,这是符号位,如果ecx为ffff ffff,数组就爆了,不能是大于这个值 8 00452692 8B1C88           mov ebx,[eax+ecx*4]  ; 记得eax为a[0]吧,此处ecx为1, eax+4刚好为a[1]地址,把a[1]的值取到ebx 9 00452695 49               dec ecx10 00452696 53               push ebx     ; 把a[1]值入栈11 00452697 79F9             jns -$07     ;返回上面的mov ebx,[eax+ecx*4],再来一次,这样的话又能把a[0]值入栈12 00452699 8BC4             mov eax,esp  ;这个时候堆栈里从低地址到高地址已形成a[0]、a[1]的结构,把堆栈指针指向a[0],13                                        ;一个新的临时参数环境就构造好了,后面对数组的存取就只在这儿进行,不会影响14                                        ;原值,高明呀,原来是这样实现的!

函数退出时:

1 ;函数结束堆栈要恢复到入来前的状态,这叫堆栈平衡2 004526B5 8BE5             mov esp,ebp   ;记得函数进来前ebp指向栈顶吧,这一下直接回到进来前状态3 004526B7 5D               pop ebp       ;是push ebp和mov ebp,esp的倒过来,就恢复了。4 004526B8 C3               ret

 

 

 

转载于:https://www.cnblogs.com/IceAir/archive/2013/05/10/3071716.html

你可能感兴趣的文章
bzoj:1725: [Usaco2006 Nov]Corn Fields牧场的安排
查看>>
GMA Round 1 空降
查看>>
iview carousel 图片不显示;iview 轮播图 图片无法显示(转载)
查看>>
Spring声明式事务为何不回滚
查看>>
利用Idea重构功能及Java8语法特性——优化深层嵌套代码
查看>>
1、Java小白之路前言
查看>>
Python基础第八天:各种推导式玩法
查看>>
微信扫码下载apk快速解决方案,中间页引导法
查看>>
ListView的使用
查看>>
一点感悟
查看>>
Mac安装Qt出现错误Could not resolve SDK Path for 'macosx'
查看>>
oracle 中使用 pl/sql代码块
查看>>
Hive自定义函数
查看>>
【Python基础知识】基本数据类型:数字、字符串、列表、元组、字典、集合
查看>>
C#利用控件mscomm32.ocx读取串口datalogic扫描枪数据
查看>>
org.springframework.boot.builder.SpringApplicationBuilder.<init>
查看>>
关于 percona monitoring plugins插件报slave is stoped on ip地址
查看>>
Spring-介绍(一)
查看>>
iOS中时间与时间戳的相互转化
查看>>
CSS3和jQuery实现的自定义美化Checkbox和Radiobox
查看>>