Basm也比较方便

最后,这里是64位Delphi,带有64位BASM! 在32位和64位Delphi程序中使用Borland汇编语言。 立即下载

东欧牛人“圣父”的hxdef(黑客守卫者)重新钩起了我对Delphi的兴趣,“圣父”基乎是全用Basm写成了hxdef。

天天都用C/C++,Object Pascal感觉自己怎么也用不熟,昨晚看了一下Object Pascal的Inline ASM,主要是堆栈的安排以及Register和Pascal调用与C的Cdecl及API的Stdcall不太一样,什么引用型变量,指针等在汇编中的内存结构与C中的差不多,对象类型的Self指针(C中叫This指针)都是通过ecx传递,但在Basm中调用类类型的成员函数以及虚拟成员函数都要比C++的Inline调用对象的成员函数和虚拟成员函数要方便很多。

使用Delphi Basm来写Win32程序就不需要考虑引入什么库,uses一下单元文件就可以了,而且Delphi Inline ASM中可以使用db,dd之类的宏,可以方便的将数据与代码混合在一起,虽然在代码段,但只需要将变量占用内存属性改一下,它们就可以被读写,就像它们被定义在数据段一样.

如果只想在Delphi中使用Basm那么就应该将所有的块语句都用asm...end来表示,而不是begin...end.

最主要的还是对Intel x86汇编的掌握,以及编译器从高级语言生成汇编代码的规则的理解,最后用一段巨菜的代码练习一下Basm,基本上是没有Pascal代码的纯Basm汇编。程序使用Delphi5编译运行通过,Delphi7编译不通过很多常量不能用,看来如果是用纯Basm劝你还是用Delphi5,这也是很多牛人还在用Delphi5的原因吧。

//File:Basm.dpr

program Basm;
{$APPTYPE GUI}
uses
  Windows,
  Messages;

var
    strClsName:string='BasmWndCls';
    strCaption:string='BasmDemo';
    strText:string='Basm还真方便,难道不是吗?';

function WndProc(hWnd:HWND;uMsg:UINT;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall ;
var
    ps:PAINTSTRUCT;
    hWndDC:HDC;
asm
    mov eax,uMsg
    cmp eax,WM_PAINT
    je  @LWm_Paint
    cmp eax,WM_DESTROY
    je  @LWm_Destroy
    cmp eax,WM_CLOSE
    je  @LWm_Close

    //其它的信息做缺省处理
    jmp @LDefault
   
@LWm_Paint:
    lea eax,ps
    push eax//for endpaint

    //BeginPaint(hWnd,&ps);
    push eax
    push hWnd
    call BeginPaint
    mov hWndDC,eax

    push DT_CENTER or DT_VCENTER or DT_SINGLELINE
    lea eax,ps.rcPaint
    push eax
    push -1

//Delphi BASM中可以这样做类型转换,真方便,string类型的前两个DWORD,
//全别是长度和引用计数,从第9个byte开始才是零终止的字符串,用PChar[]
//编译器会自动引用从9字节开始的地址
    push PChar[strText]
    push hWndDC
    call DrawText

    //EndPaint(hWnd,&ps);
    push hWnd
    call EndPaint
    jmp @LQuit
@LWm_Close:
    push hWnd
    call DestroyWindow
    jmp @LQuit
@LWm_Destroy:
    push 0
    call PostQuitMessage
    jmp @LQuit
@LDefault:
    push lParam
    push wParam
    push uMsg
    push hWnd
    call DefWindowProc
    jmp @@1
@LQuit:
    xor eax,eax
@@1:
end;


function WinMain(hInstance,PrevInst:HINST;lpszCmdLine:LPTSTR;nShow:DWORD):integer;stdcall ;
var
    WndCls:WNDCLASSEX;
    MsgV:MSG;
asm
    //memset(&MsgV,0,sizeof(MsgV));
    lea edi,MsgV
    mov ecx,type MsgV
    xor eax,eax
    rep stosb

    //memset(&WndCls,0,sizeof(WndCls));
    lea edi,WndCls
    mov ecx,type WNDCLASSEX
    push ecx
    rep stosb
    pop WndCls.cbSize

    mov WndCls.style, CS_VREDRAW or CS_HREDRAW
    mov WndCls.lpfnWndProc,offset WndProc
    mov eax,hInstance
    mov WndCls.hInstance,eax

    //LoadIcon(NULL,IDI_APPLICATION);
    xor eax,eax
    push IDI_APPLICATION
    push eax
    call LoadIcon
    mov WndCls.hIcon,eax
    mov WndCls.hIconSm,eax

    //LoadCursor(NULL,IDC_ARROW);
    xor eax,eax
    push IDC_ARROW
    push eax
    call LoadCursor
    mov WndCls.hCursor,eax

    mov WndCls.hbrBackground,COLOR_WINDOW+1
    push PChar[strClsName]
    pop WndCls.lpszClassName

    //RegisterClass(&WndCls);
    lea eax,WndCls
    push eax
    call RegisterClassEx
    test eax,eax
    je @LQuit


    //CreateWindowEx(NULL,strClsname,strCaption,WS_OVERLAPPEDWINDOW,
    //CW_USEDEFAULT,CW_USEDEFAULT,
    //CW_USEDEFAULT,CW_USEDEFAULT,
    //NULL,NULL,
    //hInstance,
    //NULL);
    xor eax,eax
    push eax
    push hInstance
    push eax
    push eax
    mov eax,CW_USEDEFAULT
    push eax
    push eax
    push eax
    push eax
    push WS_OVERLAPPEDWINDOW
    push PChar[strCaption]
    push PChar[strClsName]
    push 0
    call CreateWindowEx
    test eax,eax
    je @LQuit

    //ShowWindow(hWnd,nShow);
    //UpdateWindow(hWnd);
    push eax
    push nShow
    push eax
    call ShowWindow
    call UpdateWindow
    //while(GetMessage(&MsgV,NULL,0,0)
@LMsgLoop:
    xor eax,eax
    push eax
    push eax
    push eax
    lea eax,MsgV
    push eax
    call GetMessage
    test eax,eax
    je @LQuit

    //TranslageMessage(&MsgV);
    //DispatchMessage(&MsgV);
    lea eax,MsgV
    push eax
    push eax
    call TranslateMessage
    call DispatchMessage
    jmp @LMsgLoop
@LQuit:
end;

asm
    push CmdShow
    push CmdLine
    push 0
    push MainInstance
    call WinMain
end.

Delphi源码演示如何在BASM中调用Delphi Functions 摘要:Delphi源码,系统相关,BASM   Delphi源码示例用于演示如何在BASM中调用Delphi Functions,使用Register调用约定。      输出结果是这样的:   ______________________________________________________   This is 12345678   16   ______________________________________________________      这表明在RegisterCall()中成功地通过BASM调用了DelphiFun()函数并取得了返回值。    立即下载

相关推荐

BASM 初学者入门BASM-88

本文档是SkyJacker翻译修订的BASM 初学者入门PDF版,内容中英文对照,原始英文版作者 Dennis Kjaer Christensen. 转载请注明作者译者和出处。 《BASM for Beginners Lessons》 Dennis Christensen From news://forums.borland.com borland.public.Delphi.languages.basm 《BASM 初学者入门》 翻译 SkyJacker(HeMiaoYu@gmail.com)

Delphi图像处理 -- 色相/饱和度调整(续)

阅读提示:    《Delphi图像处理》系列以效率为侧重点,一般代码为PASCAL,核心代码采用BASM。    《C++图像处理》系列以代码清晰,可读性为主,全部使用C++代码。    尽可能保持二者内容一致,可相互对照。    本文代码必须包括文章《Delphi图像处理 -- 数据类型及公用过程》中的ImageData.pas单元。     最近一段时间,在整理以前的文章,前几天刚刚将《De

闲人阿发伯的业余编程心得 6538

Intel Realsense d435 使用python对深度图进行预处理

Intel Realsense d435 使用python对深度图进行预处理 本文中主要翻译一下一篇关于深度图预处理过滤器的内容,后面还会有关于距离测量的。 原文中的图像显示,是使用matplotlib.pyplot工具,在本文中,使用opencv来显示深度图》 首先常规操作导入包: import cv2 import numpy as np import pyrealsense2 as rs 获取我们所需要的图像,通过摄像头或者本地都可以 pipe = rs.pipeline() cfg = rs.co

qq_25105061的博客 1万+

第3章 BASM(Borland 汇编语言)精要

  简单地了解一些BASM的知识,对于阅读Delphi内核源码是很有必要的。  与Delphil-5版本不同,高版本Delphi正在努力减少内核源码中汇编所占的比例。似乎Borland越来越想证明:即使不用汇编,也可以完成编译语言的全部内核。  BASM支持指令包括: Pentium系列 Pentium Pro MMX SIMD SSE AMD 3DNOW! ...

aishizhuang1602的博客 642

Z-Image Turbo LoRA训练全流程:从数据标注到模型部署的保姆级指南(附ai-toolkit配置)

本文提供了一份详尽的Z-Image Turbo LoRA模型训练全流程指南,涵盖从数据准备、智能标注、参数调优到最终模型部署与Z-Image集成的每个环节。重点解析了使用ai-toolkit训练整合包进行高效训练的核心技巧与避坑方法,旨在帮助用户稳定训练出高质量的专属角色模型。

weixin_29088655的博客 966

【学习笔记】计算机网络 第八章 无线局域网(WLAN)

计算机网络 第八章 无线局域网(WLAN)

Vera_shsf的博客 1244

BASM引领2024国家网络安全宣传周:智能守护,打造全方位业务与应用安全监测平台

在这个信息泛滥的时代,网络安全已不再是可有可无的选项。随着技术的飞速发展,新型网络攻击层出不穷,数据泄露、恶意攻击频发,保护个人与企业的数字安全显得尤为重要。 2024年国家网络安全宣传周期间,通付盾给大家带来了我们的特献——业务与应用安全监测平台(BASM),旨在筑牢数字世界的安全防线。

DCloud666的博客 1550

Vivado IP核:AXI Uartlite的使用经验分享

1. IP基本设置 在Vivado中,打开IP Catalog,搜索“uart”: 双击“AXI Uartlite”,进入IP配置界面: 这里可以配置IP的具体参数,设置时钟频率、波特率等,完成后,生成IP即可。 2. IP的时序特点 点击下面的链接可以下载该IP核的官方指导文档: https://china.xilinx.com/support/documentation/ip_docume...

weixin_43265132的博客 1万+

64位BASM学习随笔(一)

64位BASM学习随笔中的很多原则问题不仅仅适应Delphi,也适用其它64位程序语言,因为64位方式下,程序架构都是统一的。

闲人阿发伯的业余编程心得 9523

24、无人机能耗模型与上下文质量管理的研究

本文系统介绍了无人机能耗模型与上下文质量管理的研究进展。详细阐述了Dorling、Stolaroff、Kirchstein和Tseng等经典能耗模型的原理及特点,并基于LSTM架构构建了数据驱动的能耗预测模型,实验表明其预测精度显著优于传统模型。此外,还探讨了物联网环境中的上下文质量管理问题,引入了conQeng框架,以提升上下文选择、测量和验证的效率与可靠性。研究为无人机能耗优化和物联网上下文管理提供了理论支持和技术方案。

palm99的专栏 345

使用CUDA进行按流排序的内存分配的示例程序

在GPU编程中,按流排序的内存分配是一种常见的优化技术,它可以提高内存访问的效率。通过将内存分配与特定的CUDA流相关联,可以确保在GPU上的并发操作期间,内存分配操作与其他GPU计算操作同时进行,从而减少了潜在的内存访问延迟。请注意,上述示例中的代码仅供参考,并可能需要根据实际需求进行修改和调整。此外,为了完整性,我们省略了一些细节,例如主机指针的分配和释放,以及错误处理和错误检查等。在该示例中,我们创建了4个CUDA流,并使用内存池进行内存分配。然后,我们在每个流上执行了相应的内存访问操作,并使用。

Byte_O_O的博客 282

<<BASM 初学者入门>> 第 4 课

> 第 4 课 http://www.cnpack.org 翻译:SkyJacker 时间:2007 In this lesson we will learn about branching, illustrated by an if-else construct. Conditional floating point move will also be introduced. T

gencheng的专栏 918

看28377代码笔记

使用的是20MHz外部晶振,为取200MHz系统时钟,倍频设为20,分频设为2,这样sysclock = 20MHz * 20 / 2,正好200MHz。注意:SPISTE配置成普通的GPIO端口,是为了更好控制芯片,配置芯片的时序。FMULT_0:小数点位数,小数只能有0,0.25,0.5,0.75四个选择。XTAL_OSC:表示使用外部晶振。GPIO_MUX_CPU1:复用类型。GPIO_MUX_CPU1:复用类型。PLLCLK_BY_2:表示2分频。IMULT_20:表示倍频数。

小柚子的博客 807

BASM(Borland汇编语言)精要

  BASM(Borland汇编语言)精要 3.1 BASM概念简要 汇编语句由指令和零至三个表达式构成。表达式由常数(立即数)、寄存器和标识符构成。例如: movsb       // 单指令语句 jmp @Here   // 一个表达式: 标识符 add eax,1   // 两个表达式: 寄存器和立即数 // 三个表达式: 寄存器, 标识符(内存地址), 立即数 imul edx, [e

木头人专栏 2414

20-CUDA规约算法:并行求和优化策略-✨

本文介绍了GPU上高效并行规约(Reduction)算法的优化技巧。规约是将大量数据合并为单个值的基础计算模式,广泛应用于科学计算等领域。文章从基础并行规约实现出发,逐步讲解了三种关键优化策略:1)交错寻址减少共享内存bank冲突;2)循环展开降低分支预测开销;3)多级规约处理大规模数据。性能对比显示,优化策略可带来最高4.5倍的加速效果。最后总结了最佳实践,包括合理使用共享内存、循环展开和warp级优化等技巧。这些优化方法可显著提升GPU计算密集型应用的性能。

2301_79143213的博客 172

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

BASM 初学者入门

今天去www.cnpack.org,看看有没有新版本的插件,装上来试试,结果我看到了《BASM 初学者入门》 ,也就是Borland IDE下内嵌汇编,很有意思。是我看到的第一份关于BASM的资料,还算是比较全,可惜好像作者没有把它写全,现在有人翻译了。信息出处http://www.cnpack.org/showdetail.php?id=509&lang=zh-cnBASM作者网站:ht

过客2019 2403

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

3.1 BASM概念简要

  编语句由指令和零至三个表达式构成。表达式由常数(立即数)、寄存器和标识符构成。例如: movsb      //单指令语句 jmp @Here    //一个表达式:标识符 add eax,1   //两个表达式:寄存器和立即数 //三个表达式:寄存器,标识符(内存地址),立即数 imul edx,[ebx].RandSeed,08088405H   一段BASM...

aishizhuang1602的博客 1896

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

BASM中使用sizeof

BASM中使用sizeof今天在Delphi中的BASM中使用sizeof,发现有问题。所以上网查了一下,知道了。原来在BASM中所有的sizeof都返回$32(十进制50).asm   MOV EAX, sizeof(byte)end;本来以为EAX会为1,其实是50.你可以使用TYPE操作符来替代sizeof:asm  MOV EAX, TYPE BYTEend;参考资料:1.Delphi源代

misterliwei的专栏 974

Delphi【BASM】使用Delphi的BASM

使用Delphi的BASM (okwary) 小叹的学习园地 由于Delphi是基于真正编译器的编程环境,因此可以把汇编语言代码嵌入Object Pascal的过程和函数中。这种能力主要得益于Delphi内建了汇编程序(BASM)。在学习BASM之前,首先应该清楚在Delphi程序中什么时候需要用汇编语言。虽然,能嵌入汇编语言代码是很让人兴奋的事情;但有时,使用BASM也会变成坏事。...

weixin_30344131的博客 410

BASM中的SizeOf

Basm中SizeOf的功能和pascal中的sizeof功能不太一样Basm中取DWORD的大小应该这样写MOV EAX,TYPE(DWOR)而不是MOV EAX, sizeof(DWORD)

487

BASM 初学者入门中英文对照版chm

BASM 初学者入门中英文对照版chmhttp://www.cnpack.org/showdetail.php?id=509&lang=zh-cn 

禾苗雨的专栏 2133
上一篇: 关于VBS调用MSWinsock控件
下一篇: 完成端口与高性能服务器程序开发
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值