Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Сложение знаковых двухбайтовых чисел
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры > MCS51
nikspec
Если не сложно напишите кусок проги для сложения двух двухбайтовых знаковых чисел
DimG
clr c
mov a,NUM1_LOW
add a,NUM2_LOW
mov NUM_RES_LOW,a
mov a,NUM1_HIG
addc a,NUM2_HIG
mov NUM_RES_HIG,a

Я так понял, что надо на асме, потому что на Си вообще делать нечего, знак плюс все знают smile.gif
Результат можно складывать и в NUM1 или в NUM2, а не в NUM_RES, как здесь. Обычно так и делают, особенно когда складывают много чисел.
nikspec
Цитата(DimG @ Oct 22 2007, 08:28) *
clr c
mov a,NUM1_LOW
add a,NUM2_LOW
mov NUM_RES_LOW,a
mov a,NUM1_HIG
addc a,NUM2_HIG
mov NUM_RES_HIG,a

Я так понял, что надо на асме, потому что на Си вообще делать нечего, знак плюс все знают smile.gif
Результат можно складывать и в NUM1 или в NUM2, а не в NUM_RES, как здесь. Обычно так и делают, особенно когда складывают много чисел.


Ёпт, спасибл конечно, но до этого я и сам уже дошёл. У меня проблемма со знкаковыми числами. Мой проц не умеет ычитать, поэтому нужно использовать дополнительный код. В "теорию" дополнительного кода я врубился, а как написать прогу не знаю.
DimG
это и есть сложение в дополнительном коде, а если нужен перевод положительного числа в отрицательное (в доп. коде), так и сказал бы
clr c
mov a,BYTE2_LOW
cpl a
add a,#1
mov BYTE2_LOW,a
mov a,BYTE2_HIG
cpl a
addc a,#0
mov BYTE2_HIG,a

вот и все biggrin.gif
nikspec
Цитата(DimG @ Oct 22 2007, 13:22) *
это и есть сложение в дополнительном коде, а если нужен перевод положительного числа в отрицательное (в доп. коде), так и сказал бы
clr c
mov a,BYTE2_LOW
cpl a
add a,#1
mov BYTE2_LOW,a
mov a,BYTE2_HIG
cpl a
addc a,#0
orl a,#0f8h
mov BYTE2_HIG,a

вот и все biggrin.gif


Ну почти. Опрделение необходимости перевода в дополнительный код надо опрделять по знаку исходных чисел, то есть по старшему биту.
DimG
ну, думаю здесь моя помощь уже не нужна.
только знаковый бит этот сбрасывай перед преобразованием.
И проверь все-таки не приходят ли тебе эти числа уже в доп. коде, потому как данные с различных устройств (например АЦП) обычно уже приходят в таком виде. Но за все уст. конечно отвечать не могу.
Да, еще раз глянь предыдущий пост, а то там была одна лишняя строчка, отредактировал.
nikspec
Цитата(DimG @ Oct 22 2007, 13:40) *
ну, думаю здесь моя помощь уже не нужна.
только знаковый бит этот сбрасывай перед преобразованием.
И проверь все-таки не приходят ли тебе эти числа уже в доп. коде, потому как данные с различных устройств (например АЦП) обычно уже приходят в таком виде. Но за все уст. конечно отвечать не могу.
Да, еще раз глянь предыдущий пост, а то там была одна лишняя строчка, отредактировал.

Здесь помощь тоже нужна...
С доп. кодом всё правильно, просто числа приходят и положительные и отрицательные. Соответственно если отрицательные, то нужно юзать дополнительный код. Собственно каким раком проверить состояние старшего бита?
DimG
можно так

mov a,BYTE2_HIG ;проверка на отриц. число
jb acc.7, METKA

clr acc.7 ;обнуление знакового бита
mov BYTE2_HIG,a

clr c ;перевод в доп код
mov a,BYTE2_LOW
cpl a
add a,#1
mov BYTE2_LOW,a
mov a,BYTE2_HIG
cpl a
addc a,#0
mov BYTE2_HIG,a

METKA:
oran-be
А мона и так.
signed short a;
signed short b;
signed short c;

a = b+ c;
777777
Цитата(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) *
Опрделение необходимости перевода в дополнительный код надо опрделять по знаку исходных чисел, то есть по старшему биту.


Какой "перевод в дополнительный код"? Из какого? Отрицательные числа всегда кодируются дополнительным кодом! Других кодов в настоящее время просто не существует.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.