delphi中嵌套一个ASM的总结

本文通过调试发现了BASM中函数参数的默认存放规律,并据此优化了ADD函数的实现方式,减少了不必要的指令,使得代码更为简洁高效。

今天用BASM实现了一个ADD的方法代码,实现的过程中我最初写下了如下的代码:

function Add(const a,b:integer):integer;
asm
   Mov  EAX,DWORD ptr[a];
  Mov   EBX,DWORD ptr[b];
  ADD  EAX,EBX;
  Mov    Result  ,EAX;
  DB     $F3;
  RET;

end; 

上边的代码实现了一个a+B的功能,这个功能是实现了,于是我思考,但是有没有更加简洁的方法来实现呢,A,B作为函数的参数,还需要移动他吗?于是我对程序进行了调试,调试时我发现函数的参数在进行付值的时候,A的内容存放在[eax],B的内容却放在了[EBX],这个时候我有想如果有第三个参数,这第三个参数中放在什么地方呢?于是我写了一个函数FUNCTION ADD(a,b,c,d,e:integer):integer;这个时候我发现 A-->[EAX],B-->[EDX],C-->[ECX],D-->[EBP+$0C],E-->[EBP+$08],RESULT-->[ESP-$04],这样我们可以写出更加简洁的ADD函数

function  Add(a,b:integer):integer
begin

  mov  eax,[eax];
  Add eax,[edx];
  mov [esp-$04],eax;
 db    $F3;
 RET;
end;

这样我们是写了5个数的相加得到了结果你可以调试一下,包好。我们省去了1个MOV 指令。但是是不是适用与所有编译器需要进一步考察。谢谢!

初学 Delphi 嵌入汇编[1] - 汇编语言与机器语言 初学 Delphi 嵌入汇编[2] - 汇编语言关键字 初学 Delphi 嵌入汇编[3] - 第一个 Delphi 与汇编的例子 初学 Delphi 嵌入汇编[4] - 寄存器在过程与函数中的使用 初学 Delphi 嵌入汇编[5] - 寄存器在过程与函数中的使用 - 续 初学 Delphi 嵌入汇编[6] - & 操作符 初学 Delphi 嵌入汇编[7] - 使用常量 初学 Delphi 嵌入汇编[8] - 8 位寄存器、16 位寄存器与 32 位寄存器 初学 Delphi 嵌入汇编[9] - asm 可以代替 begin 初学 Delphi 嵌入汇编[10] - 函数返回值与寄存器 初学 Delphi 嵌入汇编[11] - 用汇编重写一个 Delphi 函数 初学 Delphi 嵌入汇编[12] - 在汇编代码中可以直接使用 Result 初学 Delphi 嵌入汇编[13] - 地址参数用 [] 取值 初学 Delphi 嵌入汇编[14] - 常量与变量在汇编中的一个区别 初学 Delphi 嵌入汇编[15] - 需要保护的寄存器 初学 Delphi 嵌入汇编[16] - 进制的表示方法 初学 Delphi 嵌入汇编[17] - 逻辑运算 初学 Delphi 嵌入汇编[18] - SHL 与 SHR 初学 Delphi 嵌入汇编[19] - Delphi 的无符号整数类型 初学 Delphi 嵌入汇编[20] - DelphiInteger 类型 初学 Delphi 嵌入汇编[21] - Delphi 的其他整数类型 初学 Delphi 嵌入汇编[22] - 在汇编代码中使用记录 初学 Delphi 嵌入汇编[23] - LOOP 循环 初学 Delphi 嵌入汇编[24] - 汇编语言的简单数据类型 初学 Delphi 嵌入汇编[25] - 在汇编中调用函数 初学 Delphi 嵌入汇编[26] - 大小写字母转换 初学 Delphi 嵌入汇编[27] - XCHG 指令: 交换寄存器的内容 初学 Delphi 嵌入汇编[28] - 把 EAX 的值置为 0 的三种方法与效率 初学 Delphi 嵌入汇编[29] - 寄存器所能接受的数值范围 初学 Delphi 嵌入汇编[30] - 寄存器表
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值