delphi中使用汇编语言有啥限定?(100分)

W

wxl

Unregistered / Unconfirmed
GUEST, unregistred user!
没有,只要写好asm关键字就可以了。
 
pascal内嵌asm有一些扩展,如标号的定义用@@等
另外,参数传递上有些讲究,有些情形下全局变量在汇编程序段内不能正确解释
需要一些技巧
你试着用用再说吧
 
另外还要注意必需使用32位寻址方式, ES基本上是没有意义的, DS:Varible这种形式
的内存变量引用也是很危险的, 可以用
LEA ESI, Varible
MOV DWORD PTR [ESI], EAX
等方式来解决.
另外, 可以直接使用局部变量, 比如:
var i:WORD;
begin
i:=10;
asm {
MOV AX, i //合法
MOV i, AX //合法
MOV i, 100 //合法
MOV i, WORD PTR [10] //不合法
MOV WORD PTR [10], i //不合法
}
end;

还可以使用call来调用函数, 需要注意的是参数的入栈方式, 必需根据各种调用类型
如: cdecl, pascal等来决定的
此外, 在混合编程的时候必需对在asm{}中使用到的寄存器进行保存, 比如:
if i<10 then
begin
asm{
push EAX
push ESI
LEA ESI,j
MOV EAX, i
MOV DWORD ptr [j], EAX
MOV i, ESI
pop ESI
pop EAX
}
end;
showmessage(inttostr(j));
 

一般涉及到计算之类的部分就用Delphi来完成,实在需要嵌入汇编的地方才用吧。
如端口的读写,Delphi没有相应的函数,才应该用嵌入汇编,而端口数据的计算、
准备都可以用Delphi来完成。
如:
begin
thevalue:=a+b;
thevalue:=.....;
.....
asm{
mov dx,378h
mov al,thevalue
out dx,al
}
end;
 
多人接受答案了。
 
delphi里有没有对DS的限制?怎样能访问F000:0888这样的地址?
 
顶部