易语言置入代码
- 格式:doc
- 大小:163.50 KB
- 文档页数:11
易语言最新防破解以下内容来源于酷夫软件工作室作者QQ:1696043190需要合作请联系QQ。
ZProtect//Code_Confusion是代码乱序加密标记,允许您选择一部分被乱序的代码置入代码({235,8,83,84,95,83,84,65,82,84})' Code_Confusion标记开始置入代码({235,8,83,84,95,83,84,69,78,68})' Code_Confusion标记结尾//Code_Elimination是代码清除标记,允许您选择一部分代码在运行后从内存中删除;使用此标记的目的是为了防止破解者从内存中转储出完整的程序代码。
置入代码({235,8,79,67,95,83,84,65,82,84})' Code_Elimination标记开始置入代码({235,8,79,67,95,79,67,69,78,68})' Code_Elimination标记结尾//Decode_onExec是动态解码标记,允许您选择一部分只在执行时才解密的代码段;这部分代码仅在需要执行时才解码,执行前和执行后均处于加密状态置入代码({235,8,68,89,95,83,84,65,82,84})//Decode_onExec 标记开始置入代码({235,8,68,89,95,68,89,69,78,68})//Decode_onExec 标记结尾//Decode_onReg是注册解码标记,允许您选择一部分使用有效密钥才解密的代码;如果注册密钥不正确,那么这部分代码将永远处于加密状态。
通俗地讲,这部分代码仅在注册版中执行//源代码中可以使用任意数量的Decode_onReg标记,但是这些代码段在执行时会同时解密。
注册解码标记主要用于激活未注册版中被限制的功能,使之注册成为完整版。
置入代码({235,8,82,68,95,83,84,65,82,84})//Decode_onReg标记开始置入代码({235,8,82,68,95,82,68,69,78,68})//Decode_onReg标记结尾//Zprotect_VM是虚拟机加密标记,允许您选择一部分代码放到虚拟机中运行;虚拟机的指令系统是完全不同于现有的x86指令,可以有效阻止代码还原及分析置入代码({235,8,86,77,95,83,84,65,82,84})//Zprotect_VM标记开始置入代码({235,8,86,77,95,86,77,69,78,68})//Zprotect_VM标记结尾-----------适用于ZProtect V1.4.9.0版本---------VMProtect.易的SDK置入代码({235,16,86,77,80,114,111,116,101,99,116,32,98, 101,103,105,110,0})'VMP保护开始标志'关键代码置入代码({235,14,86,77,80,114,111,116,101,99,116,32,101, 110,100,0})'VMP保护结束标志Enigma加密易语言的SDK置入代码({235,10,69,67,82,79,78,69,88,69,67,66})'标记开始处'关键代码置入代码({235,10,69,67,82,79,78,69,88,69,67,69})'标记结束处NoobyProtect加密易语言的SDK置入代码({235,6,78,80,66,69,71,78})'标记开始处'关键代码置入代码({235,6,78,80,69,78,68,80})'标记结束处穿山甲调用功能型加密易语言SDK的DEMO置入代码({235,3,214,215,1})'标记开始处'关键代码置入代码({235,3,214,215,0})'标记结束处ASP加密易语言SDK置入代码({235,4,235,5,25,1,233,37,0})'标记开始处'关键代码置入代码({235,4,235,5,41,1,233,133,0,})'标记结束处Shielden2.0.1.0置入代码({235,7,83,69,66,69,71,78,0})' SE_PROTECT_START'关键代码置入代码({235,7,83,69,69,78,68,80,0})'SE_PROTECT_END 置入代码({235,7,83,69,66,69,71,78,77})' SE_PROTECT_START_MUTATION关键代码置入代码({235,7,83,69,69,78,68,80,0})'SE_PROTECT_END 置入代码({235,7,83,69,66,69,71,78,85})' SE_PROTECT_START_ULTRA关键代码置入代码({235,7,83,69,69,78,68,80,0})'SE_PROTECT_END置入代码({235,7,83,69,66,69,71,78,86})''关键代码置入代码({235,7,83,69,69,78,68,80,0})'SE_PROTECT_END 易语言SDK转换方法↓随着E5.0静态编译对标准PE格式的支持,在E程序中引入加密壳SDK提升软件保护质量已经成为现实。
嵌入窗口例程[易语言源码]
以下是一个简单的易语言源码示例,用于创建一个窗口并在窗口中嵌入一个控件:
plaintext.
程序运行窗口。
窗口 = 新建窗口("嵌入窗口例程", 100, 100, 400, 300)。
控件 = 新建图片框(20, 20, 200, 200, 窗口.句柄)。
控件.图片 = "C:\example.jpg"
窗口.显示()。
窗口.消息循环()。
结束。
在这个例程中,首先创建了一个窗口对象,然后在窗口中创建了一个图片框控件,并指定了控件的位置和大小。
接着将图片框控件嵌入到窗口中,并设置了图片的路径。
最后显示窗口并启动消息循环以响应用户操作。
这个例程演示了如何在易语言中创建一个窗口并在窗口中嵌入一个控件,你可以根据自己的需求进行进一步的扩展和修改。
4.1•信息框(“”)双引号内填你想出现的文字,点击按钮即可出现信息框,上有你想出现的文字。
2•编辑框1.内容=“”在双引号内输入文字,点击按钮即可在编辑框内出现你所输入的文字。
3•判断开始(组合框1•现行选中项=0) •判断(组合框1•现行选中项 =1)门计:次储坏首ao f M煽皤粧1•加入文本倒文本⑹十楸行約 二-计炭储环屋0厂卜计次循环首3 ) 占动窗口.扳题=Lading":厂卜计灰猶环首6):■ 上动窗口,标超=动窗口.标題+::G00)’※等侍时间:300 丄-计次循环尾0Ii1 --计次储环庫0载入窗口I, , M )*Loading 效果编辑框3.内容=到文本(到数值(编辑框1.内容)+至U 数值(编辑框2•内容))编辑框3•内容=到文本(到数值 •判断(组合框1•现行选中项 =2)编辑框3•内容=到文本(到数值 •判断(组合框1•现行选中项 =3)编辑框3•内容=到文本(到数值(编辑框1•内容)—到数值 (编辑框2•内容)) (编辑框1•内容)X 到数值(编辑框2•内容)) )(7.匾用対话框1 •扌J 卄褊蜒L 内咨=(1用対话程L 文件容抚行C 编辑框1.內咨,,,)丄+信息框(咽呵・If 5 “才,6.〕 5.快速打开程序的易程序代码。
置随机教种子0店媚口标题=到文本⑻随机韧【】•別的阳盯赶交衣F19柜1曲11 =1曄辄时訓周期=到数值■曰抑如旦期=6.快速刷新网站易程序代码电11世障其酿」槪匡L 百-劉只狂煩莎込蕾⑧牡佰雜召离型 磁姗酋汪2 ___ 玖箫度小趨一 I工二丄H B1 = 1 + 14- I - Z -b 1ISD1 = 1+1询鼻〕一个简易的定义运算的代码。
在易语⾔代码中嵌⼊汇编机器码在易语⾔代码中嵌⼊汇编/机器码——“置⼊代码”的使⽤⽅法简介我们都知道,C++或Delphi的程序源代码中可以嵌⼊汇编代码,以达到某些特定⽬的。
易语⾔作为实⽤⽽⼜功能强⼤的编程语⾔,也允许在代码中嵌⼊汇编,——当然严格来说,是嵌⼊机器指令代码。
借助“特殊功能⽀持库”中的“置⼊代码”命令,可以完成这项功能。
(liigo 2009.03.20补记:⾃易语⾔4.12版本起,“置⼊代码”已被移⼊核⼼⽀持库。
)为什么要在易语⾔中“置⼊代码”呢?⼀是完成易语⾔不好直接完成的⼯作(例如,调⽤⼦程序,取变量地址,取对象⽅法地址,等等,当然,“置⼊代码”也不是唯⼀途径,通过外部⽀持库往往也能完成),⼆是提⾼代码执⾏效率(这个容易理解,不多说了)。
使⽤“置⼊代码”对程序员有什么要求?要熟悉汇编,会写汇编代码;会使⽤⾄少⼀种基于汇编的调试器(如Ollydbg);要了解或会分析易语⾔编译器⽣成的机器代码;要对易语⾔底层技术有所了解,如⽂本、字节集、数组等数据格式,参数传递⽅式,命令调⽤约定等。
“置⼊代码”在易语⾔中属于“⾼级命令”,是专门为具有⼀定编程能⼒的⾼级程序员特别是熟悉汇编编程的专业⼈⼠提供的。
⼀般初学者,如果半懂不懂,最好不要涉及,直接使⽤别⼈写好的模块或⽀持库⽐较好,毕竟易语⾔的功能已经⾜够强⼤,很多问题都已经有了现成的解决⽅案。
“置⼊代码”的原理。
其实质是,在易语⾔编译过程中,编译器将“置⼊代码”的参数所指定的机器指令数据,直接输出到EXE/DLL中。
因为这个动作是在编译时进⾏的,所以参数指定的机器码只能是常量,⽽不能是变量。
同样,因为是编译时处理,运⾏时并不执⾏,因⽽程序执⾏时并不依赖⽀持库(即程序发布时不需携带特殊⽀持库spec.fne⽂件)。
使⽤“置⼊代码”都有什么步骤?⼀、写出汇编代码;⼆、通过汇编器将汇编代码编译为机器码;三、将机器码转换为易语⾔字节集常量数据,并作为参数传⼊“置⼊代码”。
易语⾔编程命令调⽤操作⼤全⽬录⼀、命令概述⼆、命令的格式三、命令的参数四、命令的返回值五、命令嵌套调⽤六、数组参数与数组返回值七、流程控制类命令⼋、算术运算命令九、逻辑⽐较⼗、位运算命令⼗⼀、数组操作命令⼗⼆、环境存取命令⼗三、拼⾳处理命令⼗四、⽂本操作命令⼗五、时间操作命令⼗六、数值转换命令⼗七、字节集操作命令⼗⼋、磁盘操作命令⼗九、⽂件读写命令⼆⼗、系统处理命令⼆⼗⼀、媒体播放命令⼆⼗⼆、⽹络通信命令⼆⼗三、其他命令⼆⼗四、我的播放器第三代(改)⼀、命令概述1. 什么是命令:命令是⼀个功能调⽤的开始。
2. 命令的参数:调⽤⼀个功能⽅法时候输⼊的数据或者条件。
3. 命令的返回值:调⽤完功能⽅法后得到的输出结果。
⼆、命令的格式1. 格式: [返回值][所属对象]命令名称([参数1],[参数2],...)。
2. 注意点:[]指的是可以有但不⼀定必须有的东西。
3. 例⼦:返回(1)。
三、命令的参数1. 参数可以是常量也可以是变量。
2. 调⽤时传递给命令的参数必须满⾜该命令对参数的定义,如 “输⼊(⽂本型)”这个例⼦中参数定义为⽂本格式那么传递的参数就必须是⽂本格式,否则就会出现语法错误。
3. 并⾮所有的命令都需要参数,即存在不需要参数的命令,但是命令名称后⾯的“()”以及多个参数之间的间隔符“,”不能没有。
4. 实际开发中不需要将所有的命令背下来,只需要按F1就能够查看明亮的即时帮助⽂档进⾏命令说明的查看。
四、命令的返回值1. ⼤多数命令执⾏完毕都会有返回值,即并不是所有命令结束都会有返回值的。
2. 有的命令返回运算结果,有的命令返回执⾏后的反馈信息,有的命令返回的是逻辑的判断。
3. 命令的返回值的数据类型由命令的语法规定决定,实际开发中往往需要对返回值的数据类型进⾏转换,如编辑框只显⽰⽂本,那么要显⽰数字的话就需要⽤“到⽂本()”命令进⾏转换。
程序:多项选择以及滚动写⾏.版本 2.程序集窗⼝程序集_启动窗⼝.⼦程序 _按钮1_被单击' 画板1.滚动写⾏ (多项选择 (3, “A”, 666, [2018年9⽉9⽇]))' 画板1.滚动写⾏ (多项选择 (2, “A”, 666, [2018年9⽉9⽇]))画板1.滚动写⾏ (多项选择 (1, “A”, 666, [2018年9⽉9⽇])).⼦程序 _按钮2_被单击画板1.滚动写⾏ (多项选择 (2, “A”, 666, [2018年9⽉9⽇])).⼦程序 _按钮3_被单击画板1.滚动写⾏ (多项选择 (3, “A”, 666, [2018年9⽉9⽇]))' 滚动写⾏就是换⾏输⼊' 多项选择就是在后⾯的⼏项中选择五、命令嵌套调⽤1. 命令是可以嵌套使⽤的,嵌套的意思就是命令的参数可以是另外⼀个命令的返回值2. 例⼦:编辑框1.内容=到⽂本(到数值(编辑框1.内容)+1)六、数组参数与数组返回值1. 数组型参数:有的时候命令的参数必须是⼀个数组型变量,如“重定义数组()”的命令程序:播放器三.版本 2.程序集窗⼝程序集_启动窗⼝.⼦程序 _按钮1_被单击.局部变量播放列表变量, ⽂本型, , "6"' 通过数组变量实现多⾸歌曲连续播放播放列表变量= { “F:\CloudMusic\Ace组合 - 楚地⽆歌.mp3”, “F:\CloudMusic\FLOW,GRANRODEO - Howling.mp3”, “F:\CloudMusic\Gemie,SawanoHiroyuki[nZk] - X.U.mp3” }' 播放的⾳乐需要和程序⽂件在同⼀个⽂件夹下' 播放MP3 (1, “藍井エイル - 流星.mp3”)' 尝试不在同⼀⽂件夹下要如何处理?' 增加完全路径试试' 播放MP3 (1, “F:\CloudMusic\Ace组合 - 楚地⽆歌.mp3”)' 尝试成功!通过增加全路径也能够实现跨⽂件夹的mp3播放' 尝试不通过修改源代码就能够播放其它的⾳乐?' 暂时没尝试出来。
易语⾔之dll⽂件的编写与引⼊
打开易语⾔的开发环境,直接新建⼀个动态链接库即可。
点击新建以后,看起来就和写模块⼀样,实际上⼤体步骤是⼀样的,具体差别这样就不叙述了。
直接新建⼀个⼦程序,这样编写即可。
还是需要点击公开,才能被其他程序所调⽤。
⽣成dll⽂件,需要静态编译。
静态编译以后,根据提⽰保存即可。
下⾯讲⼀下易语⾔引⼊dll⽂件。
还是新建⼀个窗⼝程序,拉⼊⼀个按钮,点击,开启按钮事件。
右键点击程序数据,选择新DLL命令。
这样的界⾯,令⼈有点懵,没关系,我们先保存这个源代码到刚才⽣成的dll⽂件下,⽅便我们引⼊。
然后按照如下填写即可。
DLL命令名,就是我们给刚才dll中add函数取的别名;返回值类型,就是add函数返回的数据类型;库⽂件名就是dll⽂件的名称;在库中对应命令名,就是dll中add函数的名字,下⾯的参数名也对应着dll中add函数的两个参数;
这边填写完毕,我们回到按钮事件,输⼊调试输出 (随便取别名 (5, 6))
点击运⾏,再点击按钮1,即可。
可见,dll中的add函数已经被我们完全导⼊并使⽤了。
易语言支持库命令名称易语言支持库命令名称系统核心支持库流程控制如果如果真判断判断循环首循环判断首计次循环首变量循环首到循环尾跳出循环返回结束算术运算相乘相除整除求余数相加相减取符号取绝对值取整绝对取整四舍五入求次方求平方根求正弦求正切求反正切求自然对数求反对数是否运算正确置随机数种子取随机数逻辑比较等于不等于小于大于小于或等于大于或等于近似等于并且或者取反位运算位取反位与位或位异或左移右移合并整数合并短整数变量操作赋值连续赋值数组操作重定义数组取数组成员数取数组下标复制数组加入成员插入成员清除数组数组排序数组清零环境存取取命令行取运行目录取执行文件名读环境变量写环境变量拼音处理取所有发音取发音数目取拼音取声母取韵母发音比较输入字比较文本操作取文本长度取文本左边取文本右边取文本中间字符取代码寻找文本倒找文本到大写到小写到全角到半角到文本删首空删尾空删首尾空删全部空文本替换子文本替换取空白文本取重复文本文本比较分割文本指针到文本时间操作到时间增减时间取时间间隔取某月天数时间到文本取时间部分取年份取月份取日取星期几取小时取分钟取秒取现行时间置现行时间取日期取时间数值转换到数值数值到大写数值到金额数值到格式文本取十六进制文本取八进制文本到字节到短整数到整数到长整数到小数字节集操作取字节集长度到字节集取字节集数据取字节集左边取字节集右边取字节集中间寻找字节集倒找字节集字节集替换子字节集替换取空白字节集取重复字节集分割字节集指针到字节集磁盘操作取磁盘总空间取磁盘剩余空间取磁盘卷标置磁盘卷标改变驱动器改变目录取当前目录创建目录删除目录复制文件删除文件文件更名文件是否存在寻找文件取文件时间取文件尺寸取文件属性置文件属性取临时文件名读入文件写到文件文件读写打开文件打开内存文件关闭文件关闭所有文件锁住文件解锁文件移动读写位置移到文件首移到文件尾读入字节集写出字节集读入文本写出文本读入一行写文本行读入数据写出数据是否在文件尾取读写位置取文件长度插入字节集插入文本行删除数据打开加密文件系统处理运行取剪辑板文本置剪辑板文本剪辑板中可有文本清除剪辑板取屏幕宽度取屏幕高度取鼠标水平位置取鼠标垂直位置取颜色数输入框鸣叫取启动时间置等待鼠标恢复鼠标延时取文本注册项取数值注册项取字节集注册项写注册项删除注册项注册项是否存在取默认底色快照读配置项写配置项取配置节名取操作系统类别多文件对话框媒体播放播放音乐停止播放播放MID播放MP同步播放MP暂停播放MP继续播放MP取MP播放状态程序调试输出调试文本暂停是否为调试版其他载入选择多项选择是否为空是否已创建取数据类型尺寸取颜色值取事件组件事件转移复制窗口组件处理事件载入图片卸载图片取硬盘特征字取系统语言写到内存命令调用转向置错误提示管理置DLL装载目录取组件名称取对象类型寻找组件取找到组件数目取所找到组件清除组件寻找句柄置入代码数据库是否支持多用户取错误码取错误信息创建打开替换打开置当前库取当前库关闭全部关闭取库文件名是否已打开取记录数取创建时间取字段数取字段名改字段名取字段类型取字段尺寸新建索引置当前索引取当前索引更新索引取索引数取索引名取索引字段置加锁重试时间锁住数据库解锁数据库锁住增删解增删锁锁住记录全部解锁取平均值求和取最大值取最小值取最大时间取最小时间计算数目复制结构复制记录计算排序排序分类计算添加加记录加空记录替换修改删除是否已删除恢复删除彻底删除清空读字段写字段附加字节集附加备注索引查找查找到首记录跳过取记录号跳到取标签记录是否存在标签跳转首记录前尾记录后写出缓存写出所有缓存编辑是否已加密置数据库密码密码输入框复制密码网络通信取主机名通信测试转换为主机名转换为IP地址控制台操作标准输出标准输入数据类型窗口取窗口句柄销毁获取焦点可有焦点取用户区宽度取用户区高度禁止重画允许重画重画部分重画取消重画刷新显示移动调整层次弹出菜单发送信息投递信息取标记组件置外形图片激活置托盘图标弹出托盘菜单置父窗口标题边框底色底图底图方式背景音乐播放次数控制按钮最大化按钮最小化按钮位置可否移动图标回车下移焦点键关闭键打开帮助帮助文件名帮助标志值在任务条中显示随意移动外形总在最前保持标题条激活窗口类名创建完毕可否被关闭将被销毁位置被改变尺寸被改变被激活被取消激活空闲首次激活托盘事件被显示被隐藏菜单选中禁止可视被选择字体角度加粗删除线下划线字体大小字体名称编辑框加入文本内容文本颜色背景颜色隐藏选择最大允许长度是否允许多行滚动条对齐方式输入方式密码遮盖字符转换方式调节器方式调节器底限值调节器上限值起始选择位置被选择字符数被选择文本数据源数据列内容被改变调节钮被按下图片框图片显示方式播放动画外形框线条效果线型线宽线条颜色填充颜色画板取设备句柄清除取点画点画直线画椭圆画弦画饼画矩形画渐变矩形填充矩形画圆角矩形翻转矩形区画多边形置写出位置滚动写行写出定位写出取宽度取高度画图片取图片宽度取图片高度复制取图片单位转换画板背景色自动重画绘画单位画笔类型画出方式画笔粗细画笔颜色刷子类型刷子颜色文本背景颜色画板宽度画板高度绘画分组框标签调用反馈事件效果渐变边框宽度渐变边框颜色渐变背景方式渐变背景颜色横向对齐方式是否自动折行纵向对齐方式反馈事件按钮被单击选择框按钮形式平面标题居左单选框组合框取顶端可见项目置顶端可见项目取项目数取项目数值置项目数值取项目文本置项目文本加入项目插入项目删除项目最大文本长度自动排序行间距现行选中项列表项目项目数值列表项被选择编辑内容被改变将弹出列表列表被关闭双击选择列表框取已选择项目数取所有被选择项目是否被选择选择项目取焦点项目置焦点项目多列允许选择多项选择列表框是否被选中选中项目是否被允许允许单选选中状态被改变横向滚动条最小位置最大位置页改变值行改变值允许拖动跟踪纵向滚动条进度条方向滑块条刻度类型单位刻度值允许选择首选择位置选择长度选择夹取子夹数目取子夹名称。
易语言置入代码速度及完成一些易不好直接完成的操作,是追求置入代码的全部!如果你不同意,那基本上不用往下看。
汇编功底只有靠自己,这里只是讲述在易语言中如何使用“置入代码()”来嵌入汇编及其注意要点。
这是自己的学习体会,如有理解错误或bug请指出,谢!我们先来了解一下置入代码是怎么的一回事汇编中nop(10010000)是空操作指令,我们先使用8个空操作来给程序作个“置入代码”的标记。
于是,在一个新建易程序中输入如下代码:静态编译成可执行文件后,使用OllyDbg反编译一下:PUSH EBP / MOV EBP,ESP 是例行的保存和设置EBP 的代码,因为缺省对堆栈操作的寄存器有ESP 和EBP,而ESP是堆栈指针,无法暂借使用(代码中若有PUSH/POP指令会自动修改ESP值),所以一般使用EBP 来存取堆栈。
聪明的你在这时有没有想发言:“但我们置入代码中没有添加这个指令,它是如何来的?”告诉大家,这是易编译器添加上去的。
易语言为所有子程序初始都添加这么的两句,在“返回()”时再使用MOV ESP,EBP/POP EBP 来平栈,这都是易语言在编译时所做的处理,平常我们都不用关心这些。
但当使用置入代码来嵌入汇编指令,我们就不得不了解。
现暂且放下,后面再来说明我们要了解的的东西。
跳出具体指令,看看反汇编子程序的框架。
置入的代码(8个nop)“完全”的位于一个子程序内。
对此应了解:我们置入代码()严格来说是置入汇编代码“片段”。
不要希求能置入一个完整pe数据,易语言会在编译链接时写入易的文件头。
置入代码()就不能再使用.data或invoke messagebox之类。
因为易语言不会再为我们置入的代码去修改数据段及导入表。
辅助工具的选用作为铺垫,我们先来了解一下易语言置入代码汇编工具。
云外归鸟(大鸟)提供了一个功能完善、界面友好、使用免费的工具“易语言置入代码NASM汇编生成工具v1.0 ”NASM指令简单明了,而且能将汇编代码片段直接编译成二进制文件,它不强求源码是一个完整的汇编程序。
这也可能是大鸟选择使用NASM编译器的原因(个人猜想)。
大鸟在易语言论坛提供了该工具的源码下载。
在此感谢大鸟为广大易友所做的贡献!相信使用汇编的人更多的是喜欢MASM,这从Aogo所写“MASMPLUS”被广泛下载使用可见一斑。
本人在大鸟提供源码的前提下修改了小部分代码,让该工具支持MASM编译。
若大鸟认为被侵权,请指出,本人QQ:109544089。
本人当即删除下载链接及正式致歉!MASM不支持直接编译成二进制文件,这当中要如何处理?答案是:链接成COM文件。
因为DOS 中COM文件是没有文件头,系统载入后直接从第一个语句运行。
这提供了一个迂回办法来生成置入代码所需字节集数据。
这样一来,我们就必须定义一个完整的汇编源码去编译链接,这就是为什么在易语言置入代码MASM汇编工具当中存在.586、.model、option等这样的几行语句,而在NASM汇编工具中没有的原因了。
这教程均使用MASM汇编置入工具,请大家下载配合教程使用。
下载地址:/read.php?tid=271694提供一个完整源码去编译,虽然多出了几行语句,但它却拥有NASM汇编工具所不能比拟的优势:定义函数(子程序)参数及局部变量供汇编代码引用,而免去使用如:[ebp+8]这样的书写,直接明瞭。
当然代码是一致的,只是书写的引用形式不同。
第一个例子——“取颜色()”例子实现与易语言自身所带“取颜色值()”同样功能,参数形式也一样。
在这个例子中,我们一同来看看如何的在“置入代码MASM汇编工具”中定义参数供汇编代码引用。
打开“置入代码MASM汇编工具”,在注释行至"end"行之间,键入上述汇编代码(如上图7-17行代码)。
代码中使用proc定义了一个含有“_red ”、“_green”、“_blue”三个参数的函数(子程序)。
然后选择“编译”菜单→“编译为置入代码”或右侧的蓝色三角按钮,这样就能生成我们置入代码所需的字节集数据。
粘贴生成的的代码入易程序,生成如下:我们再来反汇编一下:汇编代码“movzx eax,_red”编译后成“MOVZX EAX,BYTE PTR SS:[EBP+8]”汇编代码“movzx eax,_green”编译后成“MOVZX EAX,BYTE PTR SS:[EBP+C]”汇编代码“movzx eax,_blue”编译后成“MOVZX EAX,BYTE PTR SS:[EBP+10]”这样一来,我们就可以完全省去对形如[ebp+8]这样的地址引用,而使用直观的“_reg”参数,余下的工作就让MASM编译器来帮忙,替换成“[ebp+8]”,这算得上一个大优势吧!可别高兴得太早,在子程序开始处怎么会看到两行重复语句“PUSH EBP / MOV EBP , ESP”?这是因为我们在汇编源码上定义了一个“MAIN"子程序,MASM编译时就会自动加上这么两句,同时易语言也会在编译“取颜色()”子程序时添加上这两句的缘故。
为了修正堆栈,汇编源码在定义函数后第一个语句即为“LEAVE”。
当然,如果大家不喜欢这样重复的代码(我自己就不喜欢,汇编为的就是精简),大可以手工删除第一个“LEAVE”(C9)(201)及之前的字节集(在本例为:{ 85 , 139 , 236 , 201 })即可,余下的就是我们真正需要执行的代码。
大家要记住,这参数的引用是按顺序而不是名字!你可以将“红、绿、蓝”的名字改成“一、二、三”。
看看反汇编最后两句“LEAVE / RETN 0C”,而汇编源码中只有“ret”,怎么会~~?这是因为在编译时由MASM编译器根据参数个数进行修改,以便丢掉三个参数来平衡堆栈,这也算是另一个小优势——不用自己计算ret 后应当填写什么数值!使用这种方法引用参数及局部变量必须与易子程序的参数、变量个数对齐。
如果易语言子程序的参数有一个且为可空,此时要注意:实际上参数并不是一个,而是两个。
第一个用于表示参数是否为空,第二个才是真正传递的参数。
若不对齐引用,我还不知道会发生什么,多半蓝屏死机吧~~哈哈~~本人可不对会你硬盘及未保存数据负责哦。
最后,大家可以自己来试试使用置入代码编写的子程序“取颜色()”所得结果是否与易语言“取颜色值()”一致!第二个例子——“九九乘法表()”看到这个表格,有没有提起大家儿时背诵的情景~~源码下载:/read.php?tid=271756不多说,直接上源码:.586.model flat,stdcalloption casemap:none.code;若没有特别需求请不要改动已有的几行。
;请在下面至'end'前输入相关代码:mov ebx,[ebp+8]mov ebx,[ebx]mov eax,2573mov [ebx],axadd ebx,2xor ecx,ecxinc ecxxor eax,eax.while ecx <= 9push ecxxor edx,edxinc edx.repeatpush edx;在下面输入双循环执行代码:mov eax,ecxadd eax,30hmov [ebx],almov eax,49569mov [ebx+1],axmov eax,edxadd eax,30hmov [ebx+3],almov eax,'='mov [ebx+4],almov eax,ecxmul dlmov dl,10div dladd eax,12336mov [ebx+5],axmov eax,32mov [ebx+7],aladd ebx,8pop edx.break .if edx >= ecxinc edx.until edx > 9mov eax,2573mov [ebx],axadd ebx,2pop ecxinc ecx.endwmov eax,0mov [ebx],alleaveret 4end使用“置入代码MASM汇编工具”将上述代码转换成置入代码所需字节集:置入代码({ 139, 93, 8, 139, 27, 184, 13, 10, 0, 0, 102, 137, 3, 131, 195, 2, 51, 201, 65, 51, 192, 235, 89, 81, 51, 210, 66, 82, 139, 193, 131, 192, 48, 136, 3, 184, 161, 193, 0, 0, 102, 137, 67, 1, 139, 194, 131, 192, 48, 136, 67, 3, 184, 61, 0, 0, 0, 136, 67, 4, 139, 193, 246, 226, 178, 10, 246, 242, 5, 48, 48, 0, 0, 102, 137, 67, 5, 184, 32, 0, 0, 0, 136, 67, 7, 131, 195, 8, 90, 59, 209, 115, 6, 66, 131, 250, 9, 118, 184, 184, 13, 10, 0, 0, 102, 137, 3, 131, 195, 2, 89, 65, 131, 249, 9, 118, 162, 184, 0, 0, 0, 0, 136, 3, 201, 194, 4, 0 })易语言调用格式:“九九乘法表()”调用如上图。
调用前必须先“取空白文本()”这是易语言给“乘法表”这个文本分配内存空间。
若不然“九九乘法表(乘法表)”给“乘法表”文本写入内容时必定强制退出!我们再回过头来看看汇编源码:“mov ebx,[ebp+8] / mov ebx,[ebx]”两句取得“乘法表”文本变量数据的内存地址。
(要对易语言其他数据类型作操作,必须先了解该数据类型的具体保存形式,在此不讲述,要不跑得太远^_^没有这么多时间,而且我还没有完全了解易语言的所有数据。
)“mov eax,2573 /mov [ebx],ax”两句先给“乘法表”加上一个#换行符。
再通过“.while”及“.repeat”构造一个双循环。
(这两个均是MASM的高级语法,它们不是CPU指令。
MASM编译时会将它们换成相应的CPU指令,应当相信微软已经为这优化得相当好)循环语句内就是一些完成乘法表的具体操作。
当中“ .break .if edx >= ecx"定义了在第二个循环记数器edx大于或等于第一个循环记数器ecx时跳出第二个循环,以生成阶梯式的乘法表。
使用了这MASM高级语法,是不是让源码看起来更简单明了?!这也是本人喜欢MASM的亮点这一。