|
|
  |
Сложение знаковых двухбайтовых чисел, прога для 8051 |
|
|
|
Oct 21 2007, 22:26
|
Участник

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

|
Если не сложно напишите кусок проги для сложения двух двухбайтовых знаковых чисел
|
|
|
|
|
Oct 22 2007, 04:28
|
Участник

Группа: Свой
Сообщений: 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 Я так понял, что надо на асме, потому что на Си вообще делать нечего, знак плюс все знают Результат можно складывать и в NUM1 или в NUM2, а не в NUM_RES, как здесь. Обычно так и делают, особенно когда складывают много чисел.
|
|
|
|
|
Oct 22 2007, 09:05
|
Участник

Группа: Новичок
Сообщений: 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 Я так понял, что надо на асме, потому что на Си вообще делать нечего, знак плюс все знают Результат можно складывать и в NUM1 или в NUM2, а не в NUM_RES, как здесь. Обычно так и делают, особенно когда складывают много чисел. Ёпт, спасибл конечно, но до этого я и сам уже дошёл. У меня проблемма со знкаковыми числами. Мой проц не умеет ычитать, поэтому нужно использовать дополнительный код. В "теорию" дополнительного кода я врубился, а как написать прогу не знаю.
|
|
|
|
|
Oct 22 2007, 09:22
|
Участник

Группа: Свой
Сообщений: 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 вот и все
|
|
|
|
|
Oct 22 2007, 09:29
|
Участник

Группа: Новичок
Сообщений: 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 вот и все  Ну почти. Опрделение необходимости перевода в дополнительный код надо опрделять по знаку исходных чисел, то есть по старшему биту.
|
|
|
|
|
Oct 22 2007, 09:40
|
Участник

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

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

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

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

Группа: Свой
Сообщений: 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:
|
|
|
|
|
Oct 24 2007, 07:13
|

Профессионал
    
Группа: Участник
Сообщений: 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)  Опрделение необходимости перевода в дополнительный код надо опрделять по знаку исходных чисел, то есть по старшему биту. Какой "перевод в дополнительный код"? Из какого? Отрицательные числа всегда кодируются дополнительным кодом! Других кодов в настоящее время просто не существует.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|