求助:请用delphi写个加法函数
我看一些文章中说: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里反编译下里看看是不是真的如文章中所说。
本帖最后由 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,剩下的从右向左压栈
都有思路不如直接自己搞编译
不过国内的桌面端的Delphi基本没落了,有个开源free pascal IDE
https://www.lazarus-ide.org/index.php?page=downloads
你可以在Delphi中使用默认的fastcall编译。
Delphi中没有printf函数,你可以用ShowMessage函数来弹出一个对话框
代码如下:
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; 本帖最后由 朱朱你堕落了 于 2023-6-28 09:39 编辑
DEATHTOUCH 发表于 2023-6-27 21:49
Delphi11写的,没有D7这么古老的版本了,而且现在一般都在用Free Pascal和Lazarus
https://www.lanzoub.co ...
没事了,是我抄都抄错了,:wwqwq 本帖最后由 kingzkl 于 2023-6-28 09:28 编辑
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.
问各位大佬一个问题,我从某论坛下载了一个绿色版的delphi7,但是它的界面各个窗口都是分离的,这用起来太麻烦了,不是太麻烦,是太恶心人了。
当然是连在一起的是最好的,就像VS编译器,窗口分离的太乱了,有没有因为让他们固定连在一起?在哪里能设置不?如果实在设置不了。
是不是安装版的delphi不会分离???就没有解决办法了?
@DEATHTOUCH @law.liu @kingzkl 如下图:
https://s1.ax1x.com/2023/06/28/pCdnX9K.png 朱朱你堕落了 发表于 2023-6-28 10:19
问各位大佬一个问题,我从某论坛下载了一个绿色版的delphi7,但是它的界面各个窗口都是分离的,这用起来太 ...
Delphi7当时就是这样设计的,好像没有办法变成现在这种窗口的,要么就直接用最新的Delphi11,否则只能忍一忍了。
不过不管是D7还是D11,IDE体验都是一坨就是了。 朱朱你堕落了 发表于 2023-6-28 10:19
如下图:
编写一个加法函数使用变量来存储函数的结果
function AddNumbers(a, b: Integer): Integer;
begin
Result := a + b;
end;
AddNumbers 函数接受两个整数作为参数,并返回它们的和。Result 变量用于存储计算结果
根据需要调整参数和返回类型的数据类型
如果你想让这两个数字固定连在一起,可以将参数和结果转换为字符串,并使用字符串连接操作符 + 将它们连接在一起,而不是执行实际的加法运算。这将把它们作为字符串拼接在一起,而不是进行数值相加
function ConcatenateNumbers(a, b: Integer): string;
begin
Result := IntToStr(a) + IntToStr(b);
end;
ConcatenateNumbers 函数接受两个整数作为参数,并返回将它们拼接在一起的字符串。IntToStr 函数用于将整数转换为字符串
页:
[1]
2