-2

, так что я пытаюсь реализовать этот алгоритм для вычисления разности двух 8 бит целые числавычитая два 8 бит целое по кусочкам в сборке x86

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, а второе число должно быть 1

Когда я пройду через цикл, первая итерация, значение x будет равно 0, а значение y будет 1, бит i разницы будет равен 1, а значение b будет 1 , но это только работа для первой итерации на следующей итерации я имел x = 0, y = 0 и b = 1 (из последнего вычисления), поэтому я хотел, чтобы мой diff был равным 1, а мое значение b для этой итерации равным 1, вместо этого Я получил 0 для них обоих.

Почему код не работает, так как я следовал алгоритму и реализовал его соответствующим образом.

спасибо заранее

и

+0

возможный дубликат [вычитая два целых числа бит за битом в сборке] (http://stackoverflow.com/questions/17287263/subtracting-two-integers-bit-by- бит-в-сборке) –

+0

не так, так как это 2 разные проблемы, и почему мои вопросы получили -2 между прочим? – bluebk

ответ

2

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

#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;