一个把字符转化为大写的函数例子
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快%
[] [] []