function f(x: Cardinal): Cardinal; register;label err;asm not eax mov edx,eax shr edx,1 and eax,edx bsf ecx,eax jz err mov eax,1 shl eax,cl mov edx,eax add edx,edx or eax,edx ret err: xor eax,eaxend;// compiled versionf: push ebx // !!! not eax mov edx,eax jz +function asmtest(x: Cardinal): Cardinal; register;label err;asm not eax and eax,1 jz err ret err: xor eax,eaxend;// compiledasmtest: not eax and eax, jz + ret xor eax,edx // !!! rete mov eax,eax mov eax,ebx // !!! pop ebx // !!! ret// the almost equivalent without asmfunction f(x: Cardinal): Cardinal;var c: Cardinal;begin x := not x; x := x and x shr 1; if x <> 0 then begin c := bsf(x); // bitscanforward x := 1 shl c; Result := x or (x shl 1) end else Result := 0;end;
为什么它会生成push ebx和pop ebx?为什么它会运行eax,ebx?
它似乎因为mov eax,ebx而生成部分堆栈帧.
这个简单的测试生成mov eax,edx但不生成该堆栈帧:
function f(x: Cardinal): Cardinal; register;asm not eax mov edx,eax jz @@err mov eax,edx ret@@err: xor eax,eaxend;
它似乎与标签错误有关.如果我删除了我没有获得mov eax,* part.
为什么会这样?
在Quality Central上做了一个错误报告.
解决方法 实用建议是:不要在asm代码中使用label关键字,使用@@ – 前缀标签:更新:
我没有在Basm area中找到错误报告.它看起来像一个错误,但我已经使用BASM多年了,从来没有想过使用标签关键字这样的方式.实际上我从来没有在Delphi中使用label关键字. 总结
以上是内存溢出为你收集整理的Delphi标签和asm怪异?全部内容,希望文章能够帮你解决Delphi标签和asm怪异?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)