посмотрите на архиватор, который вы можете найти в источниках GDB.
Для добавления двух операндов вы можете узнать из мсбит операндов и результата, если был перенос. Или вы можете написать экспериментальный 8-битный сумматор и построить таблицу истинности.
EDIT:
#include <stdio.h>
#define BITS 2
#define MASK ((1<<BITS)-1)
unsigned int ra,rb,rc;
int main ( void )
{
for(ra=0;ra<=MASK;ra++)
{
for(rb=0;rb<=MASK;rb++)
{
rc=ra+rb;
printf("%u + %u = %u : %u %u %u : %u\n",ra,rb,rc,((ra>>(BITS-1))&1),((rb)>>(BITS-1))&1,((rc>>(BITS-1))&1),rc>>BITS);
}
}
return(0);
}
Который производит:
0 + 0 = 0 : 0 0 0 : 0
0 + 1 = 1 : 0 0 0 : 0
0 + 2 = 2 : 0 1 1 : 0
0 + 3 = 3 : 0 1 1 : 0
1 + 0 = 1 : 0 0 0 : 0
1 + 1 = 2 : 0 0 1 : 0
1 + 2 = 3 : 0 1 1 : 0
1 + 3 = 4 : 0 1 0 : 1
2 + 0 = 2 : 1 0 1 : 0
2 + 1 = 3 : 1 0 1 : 0
2 + 2 = 4 : 1 1 0 : 1
2 + 3 = 5 : 1 1 0 : 1
3 + 0 = 3 : 1 0 1 : 0
3 + 1 = 4 : 1 0 0 : 1
3 + 2 = 5 : 1 1 0 : 1
3 + 3 = 6 : 1 1 1 : 1
Очевидный случай - когда задан msbit первого операнда и msbit второго операнда, вы собираетесь перенести этот бит. Два менее очевидных случая: когда установлен бит MSbit а, а бит MS не установлен, произошел перенос, аналогично, когда бит MS установлен и бит не установлен, был перенос .
So
carry=0
if((MSB(A))&&(MSB(B))) carry=1
if((MSB(A))&&(!MSB(ANS))) carry=1
if((MSB(B))&&(!MSB(ANS))) carry=1