Error[8]: Undefined offset: 3, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

概述我在Delphi 7中编写了一个asm函数,但它将我的代码转换为其他代码: 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, c 我在Delphi 7中编写了一个asm函数,但它将我的代码转换为其他代码:

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  // !!!  ret
e 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怪异?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

)
File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 165, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
Delphi标签和asm怪异?_语言综合_内存溢出

Delphi标签和asm怪异?

Delphi标签和asm怪异?,第1张

概述我在Delphi 7中编写了一个asm函数,但它将我的代码转换为其他代码: 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, c 我在Delphi 7中编写了一个asm函数,但它将我的代码转换为其他代码:

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  // !!!  ret
e 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怪异?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1266067.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存