Перейти к содержанию
    

Сложение знаковых двухбайтовых чисел

Если не сложно напишите кусок проги для сложения двух двухбайтовых знаковых чисел

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Ёпт, спасибл конечно, но до этого я и сам уже дошёл. У меня проблемма со знкаковыми числами. Мой проц не умеет ычитать, поэтому нужно использовать дополнительный код. В "теорию" дополнительного кода я врубился, а как написать прогу не знаю.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

это и есть сложение в дополнительном коде, а если нужен перевод положительного числа в отрицательное (в доп. коде), так и сказал бы

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:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

это и есть сложение в дополнительном коде, а если нужен перевод положительного числа в отрицательное (в доп. коде), так и сказал бы

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:

 

Ну почти. Опрделение необходимости перевода в дополнительный код надо опрделять по знаку исходных чисел, то есть по старшему биту.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ну, думаю здесь моя помощь уже не нужна.

только знаковый бит этот сбрасывай перед преобразованием.

И проверь все-таки не приходят ли тебе эти числа уже в доп. коде, потому как данные с различных устройств (например АЦП) обычно уже приходят в таком виде. Но за все уст. конечно отвечать не могу.

Да, еще раз глянь предыдущий пост, а то там была одна лишняя строчка, отредактировал.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ну, думаю здесь моя помощь уже не нужна.

только знаковый бит этот сбрасывай перед преобразованием.

И проверь все-таки не приходят ли тебе эти числа уже в доп. коде, потому как данные с различных устройств (например АЦП) обычно уже приходят в таком виде. Но за все уст. конечно отвечать не могу.

Да, еще раз глянь предыдущий пост, а то там была одна лишняя строчка, отредактировал.

Здесь помощь тоже нужна...

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

можно так

 

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:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ёпт, спасибл конечно, но до этого я и сам уже дошёл. У меня проблемма со знкаковыми числами. Мой проц не умеет ычитать, поэтому нужно использовать дополнительный код. В "теорию" дополнительного кода я врубился, а как написать прогу не знаю.

 

Ты что-то или недопонимаешь или не объясняешь что тебе нужно. Знаковые числа в дополнительном коде склабываются точно так же как и беззнаковые. Процессор их не различает. А что значит "мой проц не умеет вычитать"? Во-первых ты спрашиваешь про сложение, так зачем вычитание? Во-вторых все 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 в дополнительном коде)

 

 

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

 

Если числа отрицательные, значит они в дополнительном коде. Операции выполняются над ними так же, как и над положительными и никакой бит при этом проверять не надо.

 

 

Опрделение необходимости перевода в дополнительный код надо опрделять по знаку исходных чисел, то есть по старшему биту.

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...