易语⾔代码中嵌⼊汇编机器码⽅法
很多朋友在编写易语⾔⾥要混合插⼊汇编语⾔等,如何解决呢?我们来看下
我们都知道,C++或Delphi的程序源代码中可以嵌⼊汇编代码,以达到某些特定⽬的。易语⾔作为实⽤⽽⼜功能强⼤的编程语⾔,也允许在代码中嵌⼊汇编,——当然严格来说,是嵌⼊机器指令代码。借助“特殊功能⽀持库”中的“置⼊代码”命令,可以完成这项功能。(liigo 2009.03.20补记:⾃易语⾔4.12版本起,“置⼊代码”已被移⼊核⼼⽀持库。)
为什么要在易语⾔中“置⼊代码”呢?
⼀是完成易语⾔不好直接完成的⼯作(例如,调⽤⼦程序,取变量地址,取对象⽅法地址,等等,当然,“置⼊代码”也不是唯⼀途径,通过外部⽀持库往往也能完成)
⼆是提⾼代码执⾏效率(这个容易理解,不多说了)。
使⽤“置⼊代码”对程序员有什么要求?要熟悉汇编,会写汇编代码;会使⽤⾄少⼀种基于汇编的调试器(如Ollydbg);要了解或会分析易语⾔编译器⽣成的机器代码;要对易语⾔底层技术有所了解,如⽂本、字节集、数组等数据格式,参数传递⽅式,命令调⽤约定等。“置⼊代码”在易语⾔中属于“⾼级命令”,是专门为具有⼀定编程能⼒的⾼级程序员特别是熟悉汇编编程的专业⼈⼠提供的。⼀般初学者,如果半懂不懂,
最好不要涉及,直接使⽤别⼈写好的模块或⽀持库⽐较好,毕竟易语⾔的功能已经⾜够强⼤,很多问题都已经有了现成的解决⽅案。
“置⼊代码”的原理。其实质是,在易语⾔编译过程中,编译器将“置⼊代码”的参数所指定的机器指令数据,直接输出到
弹出窗口代码编写EXE/DLL中。因为这个动作是在编译时进⾏的,所以参数指定的机器码只能是常量,⽽不能是变量。同样,因为是编译时处理,运⾏时并不执⾏,因⽽程序执⾏时并不依赖⽀持库(即程序发布时不需携带特殊⽀持库spec.fne⽂件)。
使⽤“置⼊代码”都有什么步骤?
1. 写出汇编代码;
2. 通过汇编器将汇编代码编译为机器码;
3. 将机器码转换为易语⾔字节集常量数据,并作为参数传⼊“置⼊代码”。
第⼀步没什么好说的,是考验汇编功⼒的地⽅,是硬功夫,没有技巧的。
第⼆步,我们可以借助“Ollydbg”等汇编器完成(当然也可以通过查询Intel x86 指令⼿册,纯⼿⼯将汇编代码编译为机器指令码,除⾮变态或超级⽜叉的⼈不会采⽤)。⾸先启动Ollydbg,打开任意⼀个EXE程序,在汇编代码区双击任意⼀⾏,在弹出的汇编窗⼝中,输⼊第⼀步写好的第⼀⾏汇编代码,回车,就可以在机器指令区域(汇编代码区域左侧)看到相应的机器指令了,如此循环,逐⾏输⼊所有汇编代码,就可以得到相应的机器指令代码了。
第三步也相对容易,主要⼯作可能就是将Ollydbg⽣成的16进制指令代码转换为10进制。如果代码不长,借助“计算器”纯⼿⼯操作也⾏。⼀般来说,通常会⽤易语⾔写⼀个⼩程序,解析从Ollydbg中复制出的⽂本,提取其中的机器指令代码,进⾏数制转换,⽣成易语⾔字节集数据的⽂本格式。这种⼩程序很容易写,我想“置⼊代码”的使⽤者中很多⼈(据我了解不下10个)都写过类似的程序,我(liigo)也写过⼀个。说实话,这种⼩程序⾃⼰⽤,写的简陋些没关系,反正只是辅助程序,还可以随时调整嘛,但想发布的话,就要考虑通⽤性易⽤性,⿇烦很多,况且⽤户也不多,所以发布此类程序的⼈很少,但是论坛上也确实有⼈发过。
感谢⼤家对的⽀持