SAL и SAR по 0 ошибок - PullRequest
       12

SAL и SAR по 0 ошибок

0 голосов
/ 23 апреля 2010

Я обнаружил ошибку в некотором ассемблерном коде, с которым работал, но не могу понять, как это исправить. При смещении влево на 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;

Ответы [ 4 ]

0 голосов
/ 23 апреля 2010

У вас есть опечатка ... Используйте clc вместо cld , cld , чтобы очистить флаг направления, а clc очистить флаг переноса.

Правильный асм код ...

asm
      mov    cx, k         //ecx for 32bit cpu mode
@1:
      clc 
      sal    n, 1
      loop   @1
end;

или

asm
      mov    cx, k         //ecx for 32bit cpu mode
@1: 
      shl    n, 1
      loop   @1
end;

или

asm
      mov    cl, k        
      shl    n, cl
end;

Этот код работает в режиме 16-битного процессора!

EDIT: Для предотвращения смещения нуля сначала проверьте, если k = 0

 asm
      mov    cx, k         //ecx for 32bit cpu mode
      and    cl, cl        //zero test  
      jz     @Done
@1:
      clc
      sal    n, 1
      loop   @1
@Done:
 end;
0 голосов
/ 23 апреля 2010

о вашей ошибке: если k равно нулю, цикл уменьшит ее и получит отрицательное значение. цикл проверяет только на ноль. Ваше число уменьшается до тех пор, пока оно снова не станет равным нулю. это смещает ваш номер так сильно, что все биты сдвигаются.

0 голосов
/ 23 апреля 2010

Проблема в том, что инструкция mov не устанавливает ни один из флагов. Вы, вероятно, хотите добавить инструкцию test перед условным переходом.

Кроме того, я предполагаю, что есть причина, по которой вы делаете это в цикле, а не с одной инструкцией? Можно подсчитать количество в CL.

0 голосов
/ 23 апреля 2010
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...