其他语言

位置:IT落伍者 >> 其他语言 >> 浏览文章

Delphi的位操作以及嵌入式汇编[3]


发布日期:2022年12月01日
 
Delphi的位操作以及嵌入式汇编[3]

一个把字符转化为大写的函数例子

function _UpCase( ch : Char ) : Char;

asm

CMP AL`a

JB @@exit

CMP AL`z

JA @@exit

SUB AL`a -`A

@@exit:

end;

值得注意的是第二个例子中没有象第一个那样把参数用语句放到寄存器中这是由于Delphi中默认的把Byte(Char)类型放在AL中不需要用Mov语句但是这种函数不能是类的成员否则结果会出错

.在汇编中调用其它过程

汇编语句中的Call语句可以用于调用其它过程既可以是其它汇编程序段也可以是Delphi中的标准过程

例如假设新建一个窗体并在上面加了一个按钮在Click事件中写入以下代码

procedure TFormButtonClick(Sender: TObject);

begin

showmessage(`ok);

end;

再写一个过程_X

function TForm_x(var i:smallint):integer;

asm

call buttonclick

end;

执行_x的结果就可以显示消息框

* 汇编的调试

Delphi嵌入式汇编一例

用delphi写的程序把x指针指向的个字节次序颠倒过来

function toulong(x: pchar): longword;

begin

result := (longword(x^) shl ) or

(longword((x + )^) shl ) or

(longword((x + )^) shl ) or

(longword((x + )^));

end;

以下是用delphi的嵌入式汇编写法

function toulong(x: pchar): longword;

asm

mov esieax

mov ax[esi]

xchg ahal

shl eax

mov ax[esi+]

xchg ahal

end;

说明默认情况下delphi使用register方式若参数在个已内将分别使用eaxedx和ecx超过个参数部分将使用堆栈返回参数的

存放视长度而定例如位用al返回位用ax位用eax位用用两个位寄存器edx:eax其中eax是低位

效率本例asm大约比delphi或c快%

[] [] []

               

上一篇:Delphi的位操作以及嵌入式汇编[1]

下一篇:Delphi的位操作以及嵌入式汇编[2]