Delphi的位操作以及嵌入式汇编[2] (delphi是什么意思中文)
本文目录导航:
Delphi的位操作以及嵌入式汇编[2]
* Delphi嵌入式汇编的使用方式
![Delphi的位操作以及嵌入式汇编[2] (delphi是什么意思中文) Delphi的位操作以及嵌入式汇编[2] (delphi是什么意思中文)](http://blog.seo.xz.cn/zb_users/upload/sanimg/af7209b32bcdd9e24cabcd20769f864e.png)
.在一般函数过程中使用汇编
汇编程序段可以嵌套于其它过程中 如
procedure TForm Button Click(Sender: TObject);
var i: *** allint;
showmessage(inttostr(i));
这个程序段是把 位的变量I进行左移 然后把结果用Mov &I ax语句放入I变量所在地址返回值 最后显示I 的值是
.独立的汇编程序段
汇编程序段也可以单独写成函数或过程 这就涉及到参数的传递与结果的返回 首先Delphi对于函数的返回有一个约定
即 整型数据 位的用AL返回 位的用AX返回 位的用EAX返回
实型 用ST( )返回
指针 用EAX返回
长字符串 用EAX返回其所在地址
变量 可用@Result返回
例如 一个用汇编的求和函数
function _Sum(X Y: Integer): Integer;
MOV EAX X //把 位的数放入EAX
ADD EAX Y //进行加法运算
MOV @Result EAX //返回X+Y
lishixinzhi/Article/program/Delphi//delphi中用嵌入式汇编进行 结构体
嵌入式汇编就如楼上所说。
。
。
至于结构体的话,主要问题在于Delphi和C的数组大小的差别上在C中要定义一个512个元素的char型可以这样 char a[512];但是在Delphi中就是 a:Array[0..511] of CHAR; 此处如果定义为512,就会出现问题。
如果你的这个数组在一个结构体里面的话,就会出现我的那个情况。
。
用汇编传参的话,首先要获取结构体实例的指针,然后用push将这个指针入栈。
被调用函数里用[esp+X]来获取这个结构体的指针,X代表这个参数的相对地址。
例如:有一个过程是procedure Func(var A:XXX);其中XXX为某个结构体现在有一个该结构体的指针P,指向该结构体的一个实例,那么要调用Func则应该这样push Pcall Func在Func过程中,要获得传进来的这个结构体,则应该这样var ptrStruct:Pointer;mov [esp], ptrStruct之后ptrStruct就是传进来的这个结构体的地址了
Delphi的位操作以及嵌入式汇编[1]
每个学习C的朋友都会被告之C是 中级语言 其位操作非常方便 而Pascal之流只适用于教学 但是Delphi中提供了一组位操作 可别以过去对Pascal的态度看Delphi
* 按位的逻辑操作
Delphi中的AND OR NOT可不仅仅只对逻辑表达式有作用 它们还可以操作数
AND 按位与 如 AND 其结果为
OR 按位或 如 OR 其结果为
Not 按位取反 如Not 其结果对于有符号数是- 对于无符号数是
另外 还有按位异或XOR 如 XOR 结果为
* 移位操作
Delphi提供了SHL和SHR进行移位左移和右移
例如 SHR 表示 按位右移一位结果为
* Delphi中的数
既然有位的操作就一定涉及到数的类型 是有符号数(头一位用 和 表示正负)还是无符号数
Delphi中 Shortint( 位) Smallint( 位) Longint( 位) Integer( 位) Int ( 位)是有符号数 而Byte( 位) Word( 位) Longword( 位)是无符号数 它们之间可以像C一样强制转换 例如 Smallint类型的- 转换成Word类型就是 转换方法是Word(- )
怎样 够全吧^_^!什么还不够……!?Delphi还有一招 接招吧……
Delphi的嵌入式汇编
Delphi中提供了几乎全部常用汇编指令的支持 MOV JE JMP CMP SHL SHR SAL SAR POP PUSH HLT……自己去查吧 至于INT也能识别 不过非法操作或死机可别找我(在最早的Windows 中用Delphi 似乎可以正确运行中断 但Windows OEM Windows 就不对了 大概是 位模块的问题 还搞不清楚)
* 嵌入式汇编的格式
Delphi是使用ASM……END来标志汇编语句
如 ASM
* 可操作的寄存器
Delphi可用汇编管理以下寄存器
位寄存器EAX EBX ECX EDX ESP EBP ESI EDI
位寄存器AX BX CX DX SP BP SI DI
位寄存器AL BL CL DL AH BH CH DH
位段寄存器CS DS SS ES
以及协处理器寄存器堆栈 ST
* 使用汇编前的工作
教汇编的老师一再强调使用汇编要保存寄存器现场(保存使用前的寄存器状态 使用Push压栈和Pop从栈中弹出) 不过这一切对于Delphi的嵌入式汇编是没有必要的(除非你自己要使用Push和Pop) 因为Delphi已经帮你做了 不必担心会使数据丢掉
lishixinzhi/Article/program/Delphi//