吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 950|回复: 11
收起左侧

[已解决] 求助:请用delphi写个加法函数

[复制链接]
朱朱你堕落了 发表于 2023-6-27 21:49
100吾爱币
我看一些文章中说:
fastcall  是把函数参数列表的前三个参数放入寄存器eax,edx,ecx,其他参数压栈。 fastcall是BCB为了更好的兼容Delphi写的VCL而用的,delphi中的默认call是fastcall,是把函数参数列表的前三个参数放入寄存器。

请用delphi编写一个加法程序,如下:

int add(int a, int b ,int c ,int d, int e, int f)
{
int sum = 0;
int tempa = a*1;
int tempb = b*2;
int tempc = c*3;
int tempd = d*4;
int tempe = e*5;
int tempf = f*6;
sum = tempa + tempb + tempc + tempd + tempe + tempf;

return sum;
}


int main()
{
  int a = 1,b=2,c=3,d=4,e=5,f=6;
  int sum = add(a, b, c, d, e, f);
  printf("sum = %d\n", sum);
}

用delphi界面来写就行,使用默认fastcall编译,printf这里可以改为弹个对话框就行,把编译好的成品(debug和release两种),源码(最好用delphi7)一起发我。我要放在OD里反编译下里看看是不是真的如文章中所说。

最佳答案

查看完整内容

Delphi11写的,没有D7这么古老的版本了,而且现在一般都在用Free Pascal和Lazarus https://www.lanzoub.com/iIZJE10lwumh https://pan.baidu.com/s/1YXj7-TS1d4VHShSqzx0uQw?pwd=52pj 提取码: 52pj 其实Delphi的这个fastcall应该叫Borland fastcall或者说register call吧 确实是按照网上说的,前三个是eax,edx和ecx,剩下的从左向右压栈,这一点Free Pascal也是一致的 因为一般说的fastcall是C++的那个__fastcall,前两个参 ...

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

DEATHTOUCH 发表于 2023-6-27 21:49
本帖最后由 DEATHTOUCH 于 2023-6-28 00:35 编辑

Delphi11写的,没有D7这么古老的版本了,而且现在一般都在用Free Pascal和Lazarus
https://www.lanzoub.com/iIZJE10lwumh
https://pan.baidu.com/s/1YXj7-TS1d4VHShSqzx0uQw?pwd=52pj 提取码: 52pj
其实Delphi的这个fastcall应该叫Borland fastcall或者说register call吧
确实是按照网上说的,前三个是eax,edx和ecx,剩下的从左向右压栈,这一点Free Pascal也是一致的
因为一般说的fastcall是C++的那个__fastcall,前两个参数是ecx和edx,剩下的从右向左压栈

点评

这里要如何修改,我有delphi7 编译下,出错了。  详情 回复 发表于 2023-6-28 08:39
6767 发表于 2023-6-28 00:15
都有思路不如直接自己搞编译

不过国内的桌面端的Delphi基本没落了,有个开源free pascal IDE

https://www.lazarus-ide.org/index.php?page=downloads
law.liu 发表于 2023-6-28 01:28
你可以在Delphi中使用默认的fastcall编译。
Delphi中没有printf函数,你可以用ShowMessage函数来弹出一个对话框
代码如下:
[Asm] 纯文本查看 复制代码
function add(a, b, c, d, e, f: Integer): Integer;
var
  sum, tempa, tempb, tempc, tempd, tempe, tempf: Integer;
begin
  tempa := a * 1;
  tempb := b * 2;
  tempc := c * 3;
  tempd := d * 4;
  tempe := e * 5;
  tempf := f * 6;
  sum := tempa + tempb + tempc + tempd + tempe + tempf;

  Result := sum;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  a, b, c, d, e, f: Integer;
begin
  a := StrToInt(Edit1.Text);
  b := StrToInt(Edit2.Text);
  c := StrToInt(Edit3.Text);
  d := StrToInt(Edit4.Text);
  e := StrToInt(Edit5.Text);
  f := StrToInt(Edit6.Text);

  ShowMessage('sum = ' + IntToStr(add(a,b,c,d,e,f)));
end;

免费评分

参与人数 1吾爱币 +3 热心值 +1 收起 理由
朱朱你堕落了 + 3 + 1 谢谢@Thanks!

查看全部评分

 楼主| 朱朱你堕落了 发表于 2023-6-28 08:39
本帖最后由 朱朱你堕落了 于 2023-6-28 09:39 编辑
DEATHTOUCH 发表于 2023-6-27 21:49
Delphi11写的,没有D7这么古老的版本了,而且现在一般都在用Free Pascal和Lazarus
https://www.lanzoub.co ...



没事了,是我抄都抄错了,
kingzkl 发表于 2023-6-28 09:26
本帖最后由 kingzkl 于 2023-6-28 09:28 编辑

[Delphi] 纯文本查看 复制代码
unit MainForm;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function Add(a, b, c, d, e, f: Integer): Integer;
var
  sum, tempa, tempb, tempc, tempd, tempe, tempf: Integer;
begin
  sum := 0;
  tempa := a * 1;
  tempb := b * 2;
  tempc := c * 3;
  tempd := d * 4;
  tempe := e * 5;
  tempf := f * 6;
  sum := tempa + tempb + tempc + tempd + tempe + tempf;

  Result := sum;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  a, b, c, d, e, f, sum: Integer;
begin
  a := 1;
  b := 2;
  c := 3;
  d := 4;
  e := 5;
  f := 6;
  sum := Add(a, b, c, d, e, f);
  ShowMessage('Sum = ' + IntToStr(sum));
end;

end.

免费评分

参与人数 1吾爱币 +2 热心值 +1 收起 理由
朱朱你堕落了 + 2 + 1 热心回复!

查看全部评分

 楼主| 朱朱你堕落了 发表于 2023-6-28 10:19
问各位大佬一个问题,我从某论坛下载了一个绿色版的delphi7,但是它的界面各个窗口都是分离的,这用起来太麻烦了,不是太麻烦,是太恶心人了。
当然是连在一起的是最好的,就像VS编译器,窗口分离的太乱了,有没有因为让他们固定连在一起?在哪里能设置不?如果实在设置不了。

是不是安装版的delphi不会分离???就没有解决办法了?

@DEATHTOUCH @law.liu @kingzkl
 楼主| 朱朱你堕落了 发表于 2023-6-28 10:19
如下图:
DEATHTOUCH 发表于 2023-6-28 13:16
朱朱你堕落了 发表于 2023-6-28 10:19
问各位大佬一个问题,我从某论坛下载了一个绿色版的delphi7,但是它的界面各个窗口都是分离的,这用起来太 ...

Delphi7当时就是这样设计的,好像没有办法变成现在这种窗口的,要么就直接用最新的Delphi11,否则只能忍一忍了。

不过不管是D7还是D11,IDE体验都是一坨就是了。
law.liu 发表于 2023-6-28 13:18

编写一个加法函数使用变量来存储函数的结果
[Asm] 纯文本查看 复制代码
function AddNumbers(a, b: Integer): Integer;
begin
  Result := a + b;
end;

AddNumbers 函数接受两个整数作为参数,并返回它们的和。Result 变量用于存储计算结果
根据需要调整参数和返回类型的数据类型
如果你想让这两个数字固定连在一起,可以将参数和结果转换为字符串,并使用字符串连接操作符 + 将它们连接在一起,而不是执行实际的加法运算。这将把它们作为字符串拼接在一起,而不是进行数值相加
[Asm] 纯文本查看 复制代码
function ConcatenateNumbers(a, b: Integer): string;
begin
  Result := IntToStr(a) + IntToStr(b);
end;

ConcatenateNumbers 函数接受两个整数作为参数,并返回将它们拼接在一起的字符串。IntToStr 函数用于将整数转换为字符串
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止回复与主题无关非技术内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-4-29 02:05

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表