Цитата(nikspec @ Oct 22 2007, 13:05)

Ёпт, спасибл конечно, но до этого я и сам уже дошёл. У меня проблемма со знкаковыми числами. Мой проц не умеет ычитать, поэтому нужно использовать дополнительный код. В "теорию" дополнительного кода я врубился, а как написать прогу не знаю.
Ты что-то или недопонимаешь или не объясняешь что тебе нужно. Знаковые числа в дополнительном коде склабываются точно так же как и беззнаковые. Процессор их не различает. А что значит "мой проц не умеет вычитать"? Во-первых ты спрашиваешь про сложение, так зачем вычитание? Во-вторых все 51-е контроллеры имеют команду SUBB, по крайней мере я не слышал про такие где бы ее не было.
Программа же выглядит примерно так:
Код
DATASEG SEGMENT DATA
RSEG DATASEG
NUM1: DS 2 ;первое слагаемое
NUM2: DS 2 ;второе слагаемое
RES: DS 2 ;результат
CODESEG SEGMENT CODE
RSEG CODESEG
ADDING: MOV A, NUM1+1 ; младший байт
ADD A, NUM2+1
MOV RES+1, A
MOV A, NUM1 ; старший байт
ADDC A, NUM2
MOV RES, A
RET
Проверяем:
Код
MOV NUM1, #HIGH (-2000)
MOV NUM1+1, #LOW (-2000)
MOV NUM2, #HIGH 1000
MOV NUM2+1, #LOW 1000
CALL ADDING
В результате в переменной RES будет -1000 (FC18 в дополнительном коде)
Цитата(nikspec @ Oct 22 2007, 13:51)

С доп. кодом всё правильно, просто числа приходят и положительные и отрицательные. Соответственно если отрицательные, то нужно юзать дополнительный код. Собственно каким раком проверить состояние старшего бита?
Если числа отрицательные, значит они в дополнительном коде. Операции выполняются над ними так же, как и над положительными и никакой бит при этом проверять не надо.
Цитата(nikspec @ Oct 22 2007, 13:29)

Опрделение необходимости перевода в дополнительный код надо опрделять по знаку исходных чисел, то есть по старшему биту.
Какой "перевод в дополнительный код"? Из какого? Отрицательные числа всегда кодируются дополнительным кодом! Других кодов в настоящее время просто не существует.