DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: zyt1990
今日帖子: 41
在线用户: 9
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 jingzu (123456) ★☆☆☆☆ -
盒子活跃会员
2020/3/20 9:11:35
标题:
delphi 内嵌汇编问题 浏览:460
加入我的收藏
楼主: 寄存器 EAX        数据地址        字符串
0018FC98          02B3FC0C     UNICODE "Message: rfeeer"

var  str:dword;
asm
   mov str,eax
end;

asm
   mov Pointer(str),eax
end;

  str=0018FC98;
  str如何得到  str=02B3FC0C   ?
----------------------------------------------
-
作者:
男 jingzu (123456) ★☆☆☆☆ -
盒子活跃会员
2020/3/20 9:36:09
1楼: 哈哈,解决

   asm
        push    ebp          
        push ecx
        mov ecx, [eax]
        mov  str,ecx
        pop ecx
   end;
----------------------------------------------
-
作者:
男 kenliaoliao (ben) ★☆☆☆☆ -
普通会员
2020/3/20 11:40:16
2楼: 这年头能写汇编的真的不多了
----------------------------------------------
-
作者:
男 scarlette (Scarlette) ★☆☆☆☆ -
普通会员
2020/3/20 14:35:26
3楼: 晕,1楼的代码多了一堆无用指令,而且push ebp后还没pop…
----------------------------------------------
-
作者:
男 wang_80919 (Flying Wang) ▲▲▲▲▲ -
普通会员
2020/3/20 14:36:10
3楼: 修改一下,
发现 10.3 WIN64 下,可以写 ASM 了。

可能很久以前的 某一个 老版本,支持了 WIN64,但是没支持 ASM。
----------------------------------------------
(C)(P)Flying Wang
作者:
男 scarlette (Scarlette) ★☆☆☆☆ -
普通会员
2020/3/20 14:40:46
4楼: 内嵌asm win64可以,Linux64我没试过不知道。我通常用其他汇编器生成obj然后link进来,自由度大多了。
----------------------------------------------
-
作者:
男 jingzu (123456) ★☆☆☆☆ -
盒子活跃会员
2020/3/20 15:04:51
5楼: 的确是WIN64,支持ASM
to  scarlette (Scarlette)

不知道为什么,DELPHI 10.3 会在后面自动加
pop ebp

所以前面必需加上push ebp,否则就回不去了。
----------------------------------------------
-
作者:
男 dbyoung (dbyoung) ★☆☆☆☆ -
普通会员
2020/3/20 15:34:11
6楼: 如果你用 begin ... end ,Delphi 编译器会自动添加入栈和出栈指令;
如果你用 asm ... end ,就没有了,你得自己维护堆栈平衡;
所以较好的做法是,将汇编的代码,从代码中抽出来,写个函数,这样你也不用关心堆栈平衡了。出错的几率也小。

如果你的代码是纯汇编的,现在堆栈不平衡,你也可以这样修改:
asm...end 修改为:
begin
  asm
  ...
  end;
end;
这样编译器自动将你的堆栈平衡了。
----------------------------------------------
Delphi7爱好者
作者:
男 keymark (keymark) ▲△△△△ -
注册会员
2020/3/20 20:40:37
7楼: x64 新版 可以随意插 ASM了?
----------------------------------------------
https://www.cnblogs.com/marklove/
作者:
男 homejun (homejun) ★☆☆☆☆ -
盒子活跃会员
2020/3/20 22:53:55
8楼: 好像64位中,汇编只能定义成方法函数使用
----------------------------------------------
-delphi新资讯站 http://www.delphigear.cn
作者:
男 bahamut8348 (leonna) ★☆☆☆☆ -
普通会员
2020/3/21 12:24:35
9楼: 我一直觉得技术和工具总是在进步的。总认为vc for x64一直就不支持内嵌asm是一个进步,而这里却还在讨论这种晦涩的语言。也真是呵呵了。
真不懂在编译器优化到现在程度的情况下,一个写应用程序的有多少机会去直接写汇编。
难道是因为人工智能越来越多的抢占人类的工作,所以咱这也要逐步去抢电脑能做的事情吗?
----------------------------------------------
--
作者:
男 dbyoung (dbyoung) ★☆☆☆☆ -
普通会员
2020/3/21 15:30:44
10楼: 图形图像、音视频,都得用到汇编。
MMX、SSE、AVX,优化,都需要汇编。

微软只是将那些汇编的指令封装成静态库了,你不用自己写汇编指令,使用库函数而已。
Intel则把它们封装成动态库了。还分不同的 CPU 型号来封装。

VC 下,还有很多程序,都需要用到 YASM、NASM 的地方,来弥补 VC 不能使用汇编的问题。
所以没有什么进步退步之说。

封装,大家都知道,使用虽然方便,但不够灵活。Delphi 的很多第三方控件,都有这样的问题。

Delphi 只是没有这样的库,但支持代码中嵌入汇编,没有什么不好。
遗憾 Delphi 没有提供这样的库,网上也有很多牛人写过。但都很零星。
没有官方的支持,肯定不方便。
----------------------------------------------
Delphi7爱好者
作者:
男 helyna (Person) ▲▲▲▲▲ -
注册会员
2020/3/23 0:19:11
11楼: Delphi10.3的汇编
如果你在函数体内嵌入汇编,你自己写的那部分汇编段,DELPHI不会给你加push ebp。
如果你写的函数是纯汇编函数,有两种情况
1.如果这个函数没有参数,Delphi不会帮你生成堆栈框架
2.如果这个函数有参数,还要分两种情况
  2.1 如果这个函数通过堆栈传参,比如stdcall,则会生成push ebp  mov ebp, esp
  2.2 如果这个函数不通过堆栈传参,则不会生成push ebp  mov ebp, esp

64位汇编只能写纯汇编函数,不能嵌入汇编到函数体内。
----------------------------------------------
-
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v2.1 版权所有 页面执行39.0625毫秒 RSS