реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Сложение знаковых двухбайтовых чисел, прога для 8051
nikspec
сообщение Oct 21 2007, 22:26
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 16
Регистрация: 30-07-07
Пользователь №: 29 448



Если не сложно напишите кусок проги для сложения двух двухбайтовых знаковых чисел
Go to the top of the page
 
+Quote Post
DimG
сообщение Oct 22 2007, 04:28
Сообщение #2


Участник
*

Группа: Свой
Сообщений: 70
Регистрация: 4-04-06
Из: г. Омск
Пользователь №: 15 777



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, как здесь. Обычно так и делают, особенно когда складывают много чисел.
Go to the top of the page
 
+Quote Post
nikspec
сообщение Oct 22 2007, 09:05
Сообщение #3


Участник
*

Группа: Новичок
Сообщений: 16
Регистрация: 30-07-07
Пользователь №: 29 448



Цитата(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, как здесь. Обычно так и делают, особенно когда складывают много чисел.


Ёпт, спасибл конечно, но до этого я и сам уже дошёл. У меня проблемма со знкаковыми числами. Мой проц не умеет ычитать, поэтому нужно использовать дополнительный код. В "теорию" дополнительного кода я врубился, а как написать прогу не знаю.
Go to the top of the page
 
+Quote Post
DimG
сообщение Oct 22 2007, 09:22
Сообщение #4


Участник
*

Группа: Свой
Сообщений: 70
Регистрация: 4-04-06
Из: г. Омск
Пользователь №: 15 777



это и есть сложение в дополнительном коде, а если нужен перевод положительного числа в отрицательное (в доп. коде), так и сказал бы
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
Go to the top of the page
 
+Quote Post
nikspec
сообщение Oct 22 2007, 09:29
Сообщение #5


Участник
*

Группа: Новичок
Сообщений: 16
Регистрация: 30-07-07
Пользователь №: 29 448



Цитата(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


Ну почти. Опрделение необходимости перевода в дополнительный код надо опрделять по знаку исходных чисел, то есть по старшему биту.
Go to the top of the page
 
+Quote Post
DimG
сообщение Oct 22 2007, 09:40
Сообщение #6


Участник
*

Группа: Свой
Сообщений: 70
Регистрация: 4-04-06
Из: г. Омск
Пользователь №: 15 777



ну, думаю здесь моя помощь уже не нужна.
только знаковый бит этот сбрасывай перед преобразованием.
И проверь все-таки не приходят ли тебе эти числа уже в доп. коде, потому как данные с различных устройств (например АЦП) обычно уже приходят в таком виде. Но за все уст. конечно отвечать не могу.
Да, еще раз глянь предыдущий пост, а то там была одна лишняя строчка, отредактировал.
Go to the top of the page
 
+Quote Post
nikspec
сообщение Oct 22 2007, 09:51
Сообщение #7


Участник
*

Группа: Новичок
Сообщений: 16
Регистрация: 30-07-07
Пользователь №: 29 448



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

Здесь помощь тоже нужна...
С доп. кодом всё правильно, просто числа приходят и положительные и отрицательные. Соответственно если отрицательные, то нужно юзать дополнительный код. Собственно каким раком проверить состояние старшего бита?
Go to the top of the page
 
+Quote Post
DimG
сообщение Oct 22 2007, 10:32
Сообщение #8


Участник
*

Группа: Свой
Сообщений: 70
Регистрация: 4-04-06
Из: г. Омск
Пользователь №: 15 777



можно так

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:
Go to the top of the page
 
+Quote Post
oran-be
сообщение Oct 23 2007, 17:39
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 234
Регистрация: 30-03-07
Из: Одесса
Пользователь №: 26 621



А мона и так.
signed short a;
signed short b;
signed short c;

a = b+ c;
Go to the top of the page
 
+Quote Post
777777
сообщение Oct 24 2007, 07:13
Сообщение #10


Профессионал
*****

Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357



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


Какой "перевод в дополнительный код"? Из какого? Отрицательные числа всегда кодируются дополнительным кодом! Других кодов в настоящее время просто не существует.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 27th July 2025 - 17:58
Рейтинг@Mail.ru


Страница сгенерированна за 0.01448 секунд с 7
ELECTRONIX ©2004-2016