Delphi 汇编函数返回长字符串

2023-12-02

我正在尝试学习 Delphi 中的内联汇编编程,为此我发现本文非常有帮助。

现在我希望编写一个返回长字符串的汇编函数,特别是AnsiString(为了简单起见)。我已经写了

function myfunc: AnsiString;
asm
  // eax = @result
  mov edx, 3
  mov ecx, 1252
  call System.@LStrSetLength
  mov [eax + 0], ord('A')
  mov [eax + 1], ord('B')
  mov [eax + 2], ord('C')
end;

解释:

返回字符串的函数有一个不可见的var result: AnsiString(在本例中)参数,因此,在函数的开头,eax应保存结果字符串的地址。然后我设置edx and ecx分别为 3 和 1252,然后调用System._LStrSetLength。实际上,我确实

  _LStrSetLength(@result, 3, 1252)

其中 3 是字符串的新长度(以字符 = 字节为单位),1252 是标准长度windows-1252代码页。

然后,知道了eax is 字符串第一个字符的地址,我只是将字符串设置为“ABC”。但它不起作用 - 它给了我无意义的数据或 EAccessViolation。问题是什么?

Update

现在我们有两个看似有效的实现myfunc, 一名雇用NewAnsiString和一名雇用LStrSetLength。我不禁想知道它们是否都是正确的,因为它们不会扰乱 Delphi 对字符串的内部处理(引用计数、自动释放等)。


你必须使用某种:

function myfunc: AnsiString;
asm
  push eax // save @result
  call system.@LStrClr
  mov    eax,3                 {Length}
{$ifdef UNICODE}
  mov    edx,1252 // code page for Delphi 2009/2010
{$endif}
  call   system.@NewAnsiString
  pop edx
  mov [edx],eax
  mov [eax],$303132
end;

它将返回一个“210”字符串...

放置一个 {$ifdef UNICODE} 块以使您的代码与 2009 年之前的 Delphi 版本兼容始终是一个好主意。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Delphi 汇编函数返回长字符串 的相关文章

随机推荐

  • 导入模块中全局变量的可见性

    我在 Python 脚本中导入模块时遇到了一些困难 我将尽力描述该错误 为什么会遇到它 以及为什么我要使用这种特定的方法来解决我的问题 我将在稍后描述 假设我有一个模块 在其中定义了一些实用函数 类 它们引用在将导入该辅助模块的命名空间中定
  • @font-face src: local - 如果用户已经拥有本地字体,如何使用它?

    正确的使用方法是什么 font face这样如果用户已经拥有该字体 浏览器就不会下载该字体 我正在使用 font face 来定义 DejaVu 它已经安装在我的系统 linux 上 Firefox 不下载字体 但 Chromium 每次都
  • 使用 NodeJS 中的服务主体连接到 Azure SQL,但令牌被拒绝

    我在使用服务主体让 NodeJS 应用程序连接到 Azure SQL 数据库时遇到问题 但是 当我尝试使用 C 代码片段执行相同的操作时 效果很好 我注意到两种语言的身份验证返回的令牌有点不同 如果我从 C 获取正确的令牌并将其硬编码到 N
  • 如何获取 Alexa 技能的用户日期/时间或时区信息?

    我正在使用 Lambda Python 来开发一项技能 并且我有兴趣为用户提供一些与时间相关的信息 上request对象有一个timestamp但那是没有偏移的 UTC 有没有一种方法可以找到用户的日期 时间或时区 而不必询问位置信息 如果
  • 类型错误:observable.of 不是函数 - [电子邮件受保护] - [电子邮件受保护] - angular5

    升级到后 电子邮件受保护 并将所有 RxJS 导入 方法和运算符转换为新的 gt 5 5 形式 我在运行时收到类型错误 Observable of不是一个函数 定义为扩展的成员的所有方法都会发生相同的错误Observable 例如 Obse
  • Java寻找具有特定注释的方法及其注释元素

    假设我有这个注释类 Retention RetentionPolicy RUNTIME Target ElementType METHOD public interface MethodXY public int x public int
  • 读取单个文件的Java多线程应用程序

    我目前编写的程序使用 32 个线程 每个线程读取 1 个文件 即 32 个 txt 文件 多线程与 CPU 速度无关 但每秒对 BING 的 api 进行 32 次调用比调用 1 次要快得多 每个 txt 文件都包含搜索查询列表 我创建一个
  • JButton 列之间的间距

    我正在开发一个简单的 GUI 其中 JButton 的前两列和后两列之间有一个岛 代码如下 JPanel panel new JPanel new GridLayout 50 4 JScrollPane scrollable new JSc
  • 将自定义文本添加到 Woocommerce 中的变化价格

    我以为这很容易 但我被困住了 我想做的就是在产品页面上的变体价格后面添加 each 一词 我找到的解决方案将其添加到类别页面和产品页面的两个位置 代码是 Adds a text Each after price function chang
  • .split() 在 IE8 中无法按预期工作

    我使用以下方法从变量中包含的 URL 中提取变量 它在现代浏览器中工作正常 但在 IE8 中 它在第一个变量上失败 但在第二个变量上成功 var p http sagensundesign com height 400 width 300
  • R:“乘以”数据框的字符串列

    不知道这个操作叫什么 谷歌也没有帮助 假设我有两个像这样的简单数据框 df1 lt data frame factor1 c a b c df2 lt data frame factor2 c x y z gt df1 factor1 1
  • 使用 javax.faces.STATE_SAVING_METHOD 在客户端保存会话的含义

    我的第一个 JSF 页面抛出异常javax faces application ViewExpiredException 当我搜索时 我得到了解决我的问题的解决方案
  • R 将上个月的值添加为列

    我有一个数据表 其中包含按月列出的日期和价格 set seed 128 dat lt data table DATE c 2014 01 01 2014 02 01 2014 03 01 2014 04 01 2014 05 01 2014
  • 如何在 x86 汇编中移动两个浮点相乘的结果?

    我目前正在尝试将两个浮点数相乘 其中一个来自浮点向量 存储在 ebx 中的地址 并与我存储在 ecx 中的值相乘 我已经确认输入值是正确的 但是 例如 如果我将 32 乘以 1 则 EAX 中的值将更改为 00000000 而 EDX 中的
  • Visual Studio 和 DPI 问题

    我正在 Windows Vista 上使用 VS2008 开发 Windows 窗体应用程序 前几天我尝试在 Windows XP 上运行我的应用程序 GUI 上的所有内容都一团糟 我意识到我在 Windows Vista 上使用 120
  • 如何获取CloudKit的实际配额?

    我使用 Cloudkit 和私有数据库将一些文件存储到 iCloud 并在 iOS 和 OSX 之间同步 现在我想实现一些功能 用户可以在不离开应用程序并查看首选项的情况下查看 iCloud 中剩余的空间 但我找不到任何有关如何获取这些数据
  • Hibernate 多对多,没有第三个表

    我有两个表 Users 和 UserRole create table Users UserId serial not null UserName varchar 100 not null UserType varchar 15 not n
  • Android 和 JFileChooser

    我开发了一个桌面应用程序 允许用户从手机中提取图像 当我第一次开始这个项目时 我的 Android 正在运行 Gingerbread 当我通过 USB 将手机插入笔记本电脑时 它会显示为 具有可移动存储的设备 因此 JFileChooser
  • Excel 宏,在运行时插入国际有效的公式

    我有一个带有宏的 Excel 电子表格 可以插入条件格式 如下所示 Selection FormatConditions Add Type xlExpression Formula1 UND A3 lastName B3 firstName
  • Delphi 汇编函数返回长字符串

    我正在尝试学习 Delphi 中的内联汇编编程 为此我发现本文非常有帮助 现在我希望编写一个返回长字符串的汇编函数 特别是AnsiString 为了简单起见 我已经写了 function myfunc AnsiString asm eax