nikspec 0 21 октября, 2007 Опубликовано 21 октября, 2007 · Жалоба Если не сложно напишите кусок проги для сложения двух двухбайтовых знаковых чисел Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimg 0 22 октября, 2007 Опубликовано 22 октября, 2007 · Жалоба 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, как здесь. Обычно так и делают, особенно когда складывают много чисел. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
nikspec 0 22 октября, 2007 Опубликовано 22 октября, 2007 · Жалоба 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, как здесь. Обычно так и делают, особенно когда складывают много чисел. Ёпт, спасибл конечно, но до этого я и сам уже дошёл. У меня проблемма со знкаковыми числами. Мой проц не умеет ычитать, поэтому нужно использовать дополнительный код. В "теорию" дополнительного кода я врубился, а как написать прогу не знаю. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimg 0 22 октября, 2007 Опубликовано 22 октября, 2007 · Жалоба это и есть сложение в дополнительном коде, а если нужен перевод положительного числа в отрицательное (в доп. коде), так и сказал бы 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 вот и все Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
nikspec 0 22 октября, 2007 Опубликовано 22 октября, 2007 · Жалоба это и есть сложение в дополнительном коде, а если нужен перевод положительного числа в отрицательное (в доп. коде), так и сказал бы 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 вот и все Ну почти. Опрделение необходимости перевода в дополнительный код надо опрделять по знаку исходных чисел, то есть по старшему биту. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimg 0 22 октября, 2007 Опубликовано 22 октября, 2007 · Жалоба ну, думаю здесь моя помощь уже не нужна. только знаковый бит этот сбрасывай перед преобразованием. И проверь все-таки не приходят ли тебе эти числа уже в доп. коде, потому как данные с различных устройств (например АЦП) обычно уже приходят в таком виде. Но за все уст. конечно отвечать не могу. Да, еще раз глянь предыдущий пост, а то там была одна лишняя строчка, отредактировал. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
nikspec 0 22 октября, 2007 Опубликовано 22 октября, 2007 · Жалоба ну, думаю здесь моя помощь уже не нужна. только знаковый бит этот сбрасывай перед преобразованием. И проверь все-таки не приходят ли тебе эти числа уже в доп. коде, потому как данные с различных устройств (например АЦП) обычно уже приходят в таком виде. Но за все уст. конечно отвечать не могу. Да, еще раз глянь предыдущий пост, а то там была одна лишняя строчка, отредактировал. Здесь помощь тоже нужна... С доп. кодом всё правильно, просто числа приходят и положительные и отрицательные. Соответственно если отрицательные, то нужно юзать дополнительный код. Собственно каким раком проверить состояние старшего бита? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimg 0 22 октября, 2007 Опубликовано 22 октября, 2007 · Жалоба можно так 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: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
a_electronic 0 23 октября, 2007 Опубликовано 23 октября, 2007 · Жалоба А мона и так. signed short a; signed short b; signed short c; a = b+ c; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
777777 0 24 октября, 2007 Опубликовано 24 октября, 2007 · Жалоба Ёпт, спасибл конечно, но до этого я и сам уже дошёл. У меня проблемма со знкаковыми числами. Мой проц не умеет ычитать, поэтому нужно использовать дополнительный код. В "теорию" дополнительного кода я врубился, а как написать прогу не знаю. Ты что-то или недопонимаешь или не объясняешь что тебе нужно. Знаковые числа в дополнительном коде склабываются точно так же как и беззнаковые. Процессор их не различает. А что значит "мой проц не умеет вычитать"? Во-первых ты спрашиваешь про сложение, так зачем вычитание? Во-вторых все 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 в дополнительном коде) С доп. кодом всё правильно, просто числа приходят и положительные и отрицательные. Соответственно если отрицательные, то нужно юзать дополнительный код. Собственно каким раком проверить состояние старшего бита? Если числа отрицательные, значит они в дополнительном коде. Операции выполняются над ними так же, как и над положительными и никакой бит при этом проверять не надо. Опрделение необходимости перевода в дополнительный код надо опрделять по знаку исходных чисел, то есть по старшему биту. Какой "перевод в дополнительный код"? Из какого? Отрицательные числа всегда кодируются дополнительным кодом! Других кодов в настоящее время просто не существует. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться