我在一些我一直在处理的汇编代码中发现了一个bug,但我不知道如何修复它。当向左移动0时,结果为0,而不是突出数字。向右移动时也是如此。任何帮助都是非常感谢的。
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;我试着用下面的方法来改变它们,但它仍然不能正常工作。
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;发布于 2010-04-24 01:29:45
shr和shl呢?http://www.delphibasics.co.uk/RTL.asp?Name=Shr http://www.delphibasics.co.uk/RTL.asp?Name=Shl
发布于 2010-04-24 01:31:22
关于你的错误:如果k是零,那么循环将减少它并得到负值。循环仅检查零。你的数字会减少,直到它最终再次变为零。这会使你的数字移位太多,以至于所有的位都被移出。
发布于 2010-04-24 01:33:59
问题是mov指令没有设置任何标志。您可能希望在条件跳转之前添加一条test指令。
另外,我假设您在循环中执行此操作,而不是使用单个指令,这是有原因的?可以将计数保持在CL中。
https://stackoverflow.com/questions/2700605
复制相似问题