-2

だから私はこのアルゴリズムを実装して2つの8ビット整数の差を計算しようとしています

b = 0
difference = 0
for i = 0 to (n-1)

    x = bit i of X
    y = bit i of Y
    bit i of difference = x xor y xor b
    b = ((not x) and y) or ((not x) and b) or (y and b)

end for loop

これは私がしたことです

calculation:
mov ebx, 0
mov diff, 0
mov ecx, 7

subtract:
    mov al, X
    and al, 1h ; find bit i of X
    mov dl, Y
    and dl, 1h ; find bit i of Y
    mov ah, al
    mov dh, al
    xor al, dl
    xor al, bl
    mov diff, al ; find bit i of the difference

    ; calculate b value for the next interation
    not ah
    and ah, dl
    not dh
    and dh, dl
    and dl, bl
    or ah, dh
    or ah, dl
    mov bl, ah

    ; rotate X and Y to get ready for the next iteration
    rol X, 1 
    rol Y, 1
    loop subtract

このコードの問題は、ループの最初の反復でのみ機能することです。

たとえば、最初の数字を 2 に、2 番目の数字を 1 に入力すると、

ループを通過すると、最初の反復では、x 値は 0 になり、y 値は 1 になり、差の i ビットは 1 になり、計算された b 値は 1 になりますが、これは最初の反復でのみ機能します、次の反復では、(最後の計算から) x = 0、y = 0、および b = 1 だったので、diff を 1 にし、この反復の b 値を 1 にしたかったのですが、代わりに 0 を得ました両方とも。

私はアルゴリズムに従っていたので、コードが機能しないのはなぜですか。それに応じて実装します。

少し早いですがお礼を

4

1 に答える 1

2

最初に高水準の言語を試してアルゴリズムを理解してから、それを asm に移植します。

#include <stdio.h>


//b = 0
//difference = 0
//for i = 0 to (n-1)
//
//    x = bit i of X
//    y = bit i of Y
//    bit i of difference = x xor y xor b
//    b = ((not x) and y) or ((not x) and b) or (y and b)
//
//end for loop


int main ( void )
{
    unsigned char X,Y,Z;

    unsigned char x,y,z,b,bnext;

    unsigned char i;

    X=0Xf5; Y=0Xf1;

    b=0;
    Z=0;
    for (i=1;i;i<<=1)
    {
        x=0;
        y=0;
        if(i&X) x=1;
        if(i&Y) y=1;
        z=((x^y)^b)&1;
        if(z) Z|=i;
        bnext = ((~x)&y) | ((~x)&b) | (y&b);
        b=bnext&1;
    }
    printf("0x%02X 0x%02X\n",Z,X-Y);




    return(0);


}

実際の指示に近づけるために、何度か書き直すこともできます。

   z=((x^y)^b)&1;

になる

   z = x;
   z = z ^ y;
   z = z ^ b;
   z = z & 1;
于 2013-06-25T20:32:47.853 に答える