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

Преобразование Знакового Числа Из Дополнительного Кода В Прямой


Рекомендуемые сообщения

Итак, есть знаковое двухбайтовое число, которое может содержать в старшем бите старшего байта (если не ошибаюсь) единицу, то есть может быть отрицательным. Так вот, нужно написать программу на ассемблере, которая распознавала бы, есть у меня там единица или нет, и преобразовывала число из дополнительного кода в прямой для последующего преобразования данного числа из двоичного кода в двоично-десятичный.

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

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

  • Ответов 226
  • Создана
  • Последний ответ

Топ авторов темы

Топ авторов темы

Изображения в теме

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Выбираем схему BMS для заряда литий-железофосфатных (LiFePO4) аккумуляторов

Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Литиевые аккумуляторы EVE Energy и решения для управления перезаряжаемыми источниками тока (материалы вебинара)

Опубликованы материалы вебинара Компэл, посвященного литиевым аккумуляторам EVE Energy и решениям для управления перезаряжаемыми источниками тока.

На вебинаре мы представили информацию не только по линейкам аккумуляторной продукции EVE, но и по решениям для управления ею, что поможет рассмотреть эти ХИТ в качестве дополнительной альтернативы для уже выпускающихся изделий. Также рассмотрели нюансы работы с производителем и сервисы, предоставляемые Компэл по данной продукции. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

если число двухбайтовое, то нужно проверять 15-й бит значит? Потом сравнивать флаг переполнения с единицей, и если в нем 1, то прибавлять к 1-му биту единицу и производить инверсию числа?

Вот наваял кое-что :) Правильно сделано или нет?

chisloL equ #115
chisloH equ #60
clr C
mov A,chisloH
rlc A
cjne C,#1, loop
mov A,chisloH
cpl A
orl A,#00000001b
mov chisloH,A
mov A, chisloL
cpl A
mov chisloL,A
loop:
ret

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

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

прибавлять к 1-му биту

Уточните этот момент. По книжке.

Никогда не спорьте с дураком - люди могут не заметить между вами разницы

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

Получим, например, внутреннее представление целого отрица­тельного числа -1607. Воспользуемся результатом предыдущего примера и запишем внутреннее представление положительного числа 1607:

0 0 0 0 1 1 0 0 1 0 0 0 1 1 1

Инвертированием получим обратный код:

1 1 1 1 0 0 1 1 0 1 1 1 0 0 0

Добавим единицу:

1 1 1 1 1 0 0 1 1 0 1 1 1 0 0 1

Это и есть внутреннее двоичное представление числа -1607.

прибавлять к 1-му биту

Уточните этот момент. По книжке.

Значит прибавлять нужно действительно к 1-му биту. Только я в своей программе прибавлял к 1-му биту старшего байта, а надо младшего, правильно? :)

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

Неправильно.

То, что в данном конкретном случае получился правильный ответ - совпадение.

Прибавлять нужно не к биту, а ко всему числу.

Никогда не спорьте с дураком - люди могут не заметить между вами разницы

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

Знаковый разряд для наглядности отделен запятой.

0, 000 0110 0100 0111 - число положительное в прямом коде.

1, 000 0110 0100 0111 - число отрицательное в прямом коде.

1, 111 1001 1011 1000 - число отрицательное в обратном коде.

1, 111 1001 1011 1001 - число отрицательное в дополнительном коде.

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

А что именно неплавильно

"Р" не выговариваете? :)

Вы понимаете разницу, между битом и числом?

Никогда не спорьте с дураком - люди могут не заметить между вами разницы

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

А что именно неплавильно

"Р" не выговариваете? :)

Вы понимаете разницу, между битом и числом?

То есть мне нужно сначала к младшему байту прибавить 11111111, затем прибавить это же к старшему байту и произвести инверсию?

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

Тяжёлый случай...

После инверсии, нужно прибавить 1 к младшему байту, а потом прибавить флаг С к старшему. Т.е. прибавить 1 к вашему двухбайтовому числу.

Никогда не спорьте с дураком - люди могут не заметить между вами разницы

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

Pragmatik91, Вы мне даже спасибку нажали в посте 13. Неужели там непонятно показано?

Еще раз для другого числа.

1, 111 1100 0000 0000 - прямой код отрицательного числа

1, 000 0011 1111 1111 - обратный код отрицательного числа

0, 000 0000 0000 0001 - суммируем с единицей

-----------------------------

1, 000 0100 0000 0000 - сумма обратного кода с единицей есть дополнительный код отрицательного числа

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

Неужели там непонятно показано?

Пример был неудачный. Прибавление единицы изменило только младший байт. Он так и делал в программе. :)

Никогда не спорьте с дураком - люди могут не заметить между вами разницы

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

Такая правильная? ТОлько как сделать сравнение флага переполнения с единицей? А то мой компилятор ругается, говорит, так нельзя делать :)

chisloL equ 11h
chisloH equ 10h
mov R0,#chisloL
mov R1,#chisloH
clr C
mov A,R1
rlc A
cjne C,#1, loop
mov A,R0
orl A,#00000001b
mov R0, A
mov A, R1
cpl A
orl A,C
mov R1, A
loop:
ret
end

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

Вам бы не помешало для начала ознакомиться с системой команд.

Никогда не спорьте с дураком - люди могут не заметить между вами разницы

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

А у меня тут знаковое число вообще по итогу получается? Или знак не учитывается здесь?

;  вычисления по формуле 235 - 400*Т1 / Т2
;   где Т1 - значение таймера0 TH0:TL0
;		  Т2 - значение таймера1 TH1:TL1
;
org 00h
; Умножение на 400
; Х= 400*Х= (16*Х + 8*Х + Х)*16
; Сумма в регистрах r7:r6:r5:r4
; Счетные регистры r3:r2:r1
;
;заносим в сумму Х .
; берем из таймера0
mov r7,#00
mov r6,#00
mov r5,#10h
mov r4,#20h
;заносим в счетные регистры Х.
mov	  r3,#00
mov	  a,r5
mov	  r2,a
mov	  a,r4
mov	  r1,a
; умножаем на 8 тремя сдвигами влево
mov	  r0,#03  ; три сдвига
m1:
clr	  c		 ; сбрасываем С (он попадет в младший бит)
mov	  a,r1   ; младший байт в аккумулятор
rlc	  a		 ; сдвиг влево через перенос
mov	  r1,a   ; обратно в регистр
mov	  a,r2   ; средний регистр в аккумулятор
rlc	  a		 ; сдвиг влево через перенос
mov	  r2,a   ; обратно в регистр
mov	  a,r3   ; старший регистр в аккумулятор
rlc	  a		 ; сдвиг влево через перенос
mov	  r3,a   ; обратно в регистр
djnz    r0,m1   ; вычесть из r1 единицу и перейти, если r0 не равен 0
; складываем с суммой
mov	  a,r1   ; регистр в аккумулятор
add	  a,r4   ; складываем с регистром суммы
mov	  r4,a   ; обратно в регистр суммы
mov	  a,r2   ; регистр в аккумулятор
addc    a,r5    ; складываем с регистром суммы с учетом переноса
mov	  r5,a   ; обратно в регистр суммы
mov	  a,r3   ; регистр в аккумулятор
addc    a,r6    ; складываем с регистром суммы с учетом переноса
mov	  r6,a   ; обратно в регистр суммы
clr	  a		 ; старший байт счетных регистров = 0
addc    a,r7    ; складываем с регистром суммы с учетом переноса
mov	  r7,a   ; обратно в регистр суммы
; умножаем счетные регистры еще раз на 2. В итоге получится X*16
clr	  c
mov	  a,r1
rlc	  a
mov	  r1,a
mov	  a,r2
rlc	  a
mov	  r2,a
mov	  a,r3
rlc	  a
mov	  r3,a
; складываем с суммой
mov	  a,r1
add	  a,r4
mov	  r4,a
mov	  a,r2
addc    a,r5
mov	  r5,a
mov	  a,r3
addc    a,r6
mov	  r6,a
clr	  a
addc    a,r7
mov	  r7,a
; умножаем сумму на 16 четырьмя сдвигами влево
mov	  r0,#04  ; четыре сдвига
m2:
clr	  c
mov	  a,r4
rlc	  a
mov	  r4,a
mov	  a,r5
rlc	  a
mov	  r5,a
mov	  a,r6
rlc	  a
mov	  r6,a
mov	  a,r7
rlc	  a
mov	  r7,a
djnz    r0,m2
;
; Деление	   сумма/Т2
; (r7:r6:r5:r4)/(r3:r2) = r5:r4
;
; делитель берем из таймера1
mov	  r3,#05h  ; старший байт
mov	  r2,#10h  ; младший байт
; проверяем на переполнение частного (если старшие два байта делимого >= делителю)
clr	  c		 ; сбрасываем С, чтобы не повлиял на команду subb
mov	  a,r6   ; регистр в аккумулятор
subb    a,r2    ; вычитаем
mov	  a,r7   ; регистр в аккумулятор
subb    a,r3    ; вычитаем (важен С)
jnc	 div_error			   ; если есть перенос(число больше), то уходим на ошибку
mov	  b,#16   ; 16 циклов
; сдвиг влево r7:r6:r5:r4
div16_0:
clr	  c
mov	  a,r4
rlc	  a
mov	  r4,a
mov	  a,r5
rlc	  a
mov	  r5,a
mov	  a,r6
rlc	  a
mov	  r6,a
mov	  a,r7
rlc	  a
mov	  r7,a
jc	    div16_3 ; если есть перенос, то вычесть делитель и прибавить 1 в частное r5:r4
; вычитаем делитель r3:r2
mov	  a,r6
subb    a,r2
mov	  r6,a
mov	  a,r7
subb    a,r3
mov	  r7,a
jnc	  div16_1 ; переноса нет, +1 к частному
; восстанавливаем остаток
mov	  a,r6
add	  a,r2
mov	  r6,a
mov	  a,r7
addc    a,r3
mov	  r7,a
sjmp    div16_2
; вычитаем остаток
div16_3:
clr	  c
mov	  a,r6
subb    a,r2
mov	  r6,a
mov	  a,r7
subb    a,r3
mov	  r7,a
; +1 к частному
div16_1:
inc	  r4
; следующий цикл
div16_2:
djnz    b,div16_0
;
; 235 - r5:r4
;
; в r7:r6 заносим 235
mov	  r7,#00
mov	  r6,#235
; вычитаем
clr	  c
mov	  a,r6
subb    a,r4
mov	  r4,a
mov	  a,r7
subb    a,r5
mov	  r5,a
; В регистрах r5:r4 находится разница - результат вычислений.

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

Если Т1 больше или равно Т2, то отрицательное, судя по формуле. На самом деле, чуть сложнее, лень считать.

А что, программу не вы писали?

Изменено пользователем Григорий Т.

Никогда не спорьте с дураком - люди могут не заметить между вами разницы

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

Тяжёлый случай...

После инверсии, нужно прибавить 1 к младшему байту, а потом прибавить флаг С к старшему. Т.е. прибавить 1 к вашему двухбайтовому числу.

с помощью какой команды мне прибавить флаг к старшему байту? (сам удивляюсь своей тупости :))

chisloL equ 11h
chisloH equ 10h
mov R0,#chisloL
mov R1,#chisloH
clr C
mov A,R1
rlc A
jc loop
mov A,R0
orl A,#00000001b
mov R0, A
mov A, R1
cpl A
orl A, ????
mov R1, A
loop:
ret
end

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

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

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

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

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

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

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

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

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