首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SAL和SAR为0的误差

SAL和SAR为0的误差
EN

Stack Overflow用户
提问于 2010-04-24 01:25:37
回答 4查看 417关注 0票数 0

我在一些我一直在处理的汇编代码中发现了一个bug,但我不知道如何修复它。当向左移动0时,结果为0,而不是突出数字。向右移动时也是如此。任何帮助都是非常感谢的。

代码语言:javascript
复制
function sal(n,k:integer):integer;
begin
 asm
 cld
 mov    cx,     k
@1:
  sal n, 1
  loop @1
 end;
 sal:= n;
end;

function sar(n,k:integer):integer;
begin
 asm
  cld
  mov   cx,     k
@1:
  sar   n,      1
  loop  @1
 end;
 sar:=n;
end;

我试着用下面的方法来改变它们,但它仍然不能正常工作。

代码语言:javascript
复制
function sal(n,k:integer):integer;
begin
 asm
 cld
 mov    cx,     k
 jcxz @done
@1:
  sal n, 1
  loop @1
@done:
 end;
 sal:= n;
end;

function sar(n,k:integer):integer;
begin
 asm
  cld
  mov   cx,     k
 jcxz @done
@1:
  sar   n,      1
  loop  @1
@done:
 end;
 sar:=n;
end;
EN

回答 4

Stack Overflow用户

发布于 2010-04-24 01:29:45

shrshl呢?http://www.delphibasics.co.uk/RTL.asp?Name=Shr http://www.delphibasics.co.uk/RTL.asp?Name=Shl

票数 0
EN

Stack Overflow用户

发布于 2010-04-24 01:31:22

关于你的错误:如果k是零,那么循环将减少它并得到负值。循环仅检查零。你的数字会减少,直到它最终再次变为零。这会使你的数字移位太多,以至于所有的位都被移出。

票数 0
EN

Stack Overflow用户

发布于 2010-04-24 01:33:59

问题是mov指令没有设置任何标志。您可能希望在条件跳转之前添加一条test指令。

另外,我假设您在循环中执行此操作,而不是使用单个指令,这是有原因的?可以将计数保持在CL中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2700605

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档