Konwersja U2 na znak-moduł

0

Witam,

Mam problem z następującym zadaniem:
Zapisz algorytm konwersji liczby o rozmiarze N słów z formatu uzupełnieniowego na format znak-moduł.

Ogólnie algorytm rozumiem tak:

  • Sprawdź czy najbardziej znaczący bit ma wartość 1, jeśli tak przejdź dalej, jeśli nie koniec (liczba dodania).
  • zaneguj wszystkie bity oprócz bitu znaku i dodaj 1

Cały problem polega na tym, że nie wiem jak w słowie zanegować wszystkie bity oprócz tego znaku (najbardziej znaczący bit).

Zrobiłem szkic:

mov N, %ecx
mov liczba(,%ecx, 4), %eax #sprawdzamy znak (big endian)
or %eax, %eax
jns koniec # jesli bez znaku, koniec
mov $0, %ecx #licznik na 0
mov liczba(,%ecx,4) %eax
not %eax #negujemy bity
add $1, %eax;  #i dodajemy 1
mov %eax, liczba(,%ecx,4)
inc %ecx

petla:
mov liczba(,%ecx,4) %eax;
not %eax #negujemy bity
adc $0, %eax
mov %eax, liczba(,%ecx,4)
inc %ecx
cmp N, %ecx
jne petla

koniec:

Pozdrawiam,
Marek

0

Dlaczego nie zanegować wszystkich bitów, dodać 1, a na koniec zapalić najbardziej znaczący bit? To o wiele wydajniejsze (nie wymaga żadnej pętli) i prostsze rozwiązanie.

0

Można to zrobić za pomocą XOR'a:

liczba, którą chcemy zanegować oprócz pierwszego bitu: 1010101

1010101
0111111
-------- xor
1101010

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0