2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Представление данных в оперативной памяти
Сообщение23.12.2011, 23:32 


07/03/10
18
В прямом или дополнительном коде хранятся данные в ОП? Вот такой банальный вопрос. Понятно, что все арифметические опреации АЛУ проводит в дополнительном коде. А вот как данные представленыв памяти изначально? В частности интересует архитектура IA-32.

 Профиль  
                  
 
 Re: Представление данных в оперативной памяти
Сообщение23.12.2011, 23:52 
Аватара пользователя


27/01/09
813
Уфа
В памяти хранятся единички и нолики, а вот как вы их проинтерпретируете это ваше дело, хоть как числа без знака (двоичный естесственный позиционный код), хоть со знаком (дополнительный код), хоть буковки (ASCII или Unicode), хоть запись базы данных, хоть пикселы на мониторе, хоть чёрточки на принтере, хоть управляющее слово переферийного устройства, хоть ваша электронная подпись или зашифрованный пароль вашего счёта в банке, как вам нужно так и будет :).

 Профиль  
                  
 
 Re: Представление данных в оперативной памяти
Сообщение23.12.2011, 23:57 


07/03/10
18
Мной имелись ввиду арифметические операции) То есть нужно ли при извлечении числа из памяти делать его перевод в дк или нет) Например в документации Интела я ничего по этому поводу не нашел. Ну в общем суть ясна, как захочется так и будет, спасибо))

 Профиль  
                  
 
 Re: Представление данных в оперативной памяти
Сообщение24.12.2011, 00:11 
Аватара пользователя


27/01/09
813
Уфа
Арифметические операции есть для вашего удобства и удобства процессора как для чисел без знака, так и для чисел со знаком, а так же есть арфметические операции которым безразлична интерпретация чисел (например сумма дополнительных кодов чисел со знаком есть дополнительный код суммы этих чисел и таким образом операция суммы (без учёта переноса) для чисел без знака и со знаком одна и та же), если вы оперируете числами со знаком, то например вашу "-1" надо превратитить в дополнительный код и в байт записать 11111111, соответственно если вы этот байт интерпретируете как число со знаком, то это будет дополнительный код, а в нормальный его надо преобразовывать, тогда будет минус в уме и 00000001 в байте, которые потом можно буковками сделать, а при оперировании в процессоре надо только следить чтобы операции соответствовали типу данных. А регистры процессора это тоже память только внутри процессора.

 Профиль  
                  
 
 Re: Представление данных в оперативной памяти
Сообщение24.12.2011, 07:53 
Заслуженный участник


15/05/05
3444
USA
fit в сообщении #519105 писал(а):
В прямом или дополнительном коде хранятся данные в ОП?
Целочисленные данные для арифметики со знаком должны задаваться в дополнительном коде.
Результат 32-разрядного вычитания со знаком (SUB) 1-2 будет сохранен в памяти как 0xffffffff.

 Профиль  
                  
 
 Re: Представление данных в оперативной памяти
Сообщение24.12.2011, 13:39 
Аватара пользователя


27/01/09
813
Уфа
Yuri Gendelman в сообщении #519177 писал(а):
Результат 32-разрядного вычитания со знаком (SUB) 1-2 будет сохранен в памяти как 0xffffffff.
Что эквивалентно 0x00000001+0xfffffffe (именно так процессор делает вычитание). 0xfffffffe это дополнительный код -2 или 4294967294 (32-х разрядное без знака). В случае 1-2 операнды команды SUB преобразовывать не надо, а вот если захотите сделать -1-2, то "-1" надо записать в дополнительном коде либо самому либо это сделает компилятор.

 Профиль  
                  
 
 Re: Представление данных в оперативной памяти
Сообщение06.01.2012, 21:12 


23/10/09
10
У Вас получается при вычитании 1-2 число 1 в допкоде (оно находится в аккумуляторе), т.е. ffffffff.
Все это хорошо, но не понятно что делать когда надо сделать 64-х разрядное вычитание.
Например, далее будет следовать команда sbc, работающая с верхними 32 разрядами некого 64-х разр. числа.
В этом случае после применения команды sub (она обработала нижние 32 разряда) нужно вроде как получить в аккумуляторе число 9? А там 1 в допкоде.

 Профиль  
                  
 
 Re: Представление данных в оперативной памяти
Сообщение06.01.2012, 23:51 
Заслуженный участник


15/05/05
3444
USA
nakshi в сообщении #523994 писал(а):
В этом случае после применения команды sub (она обработала нижние 32 разряда) нужно вроде как получить в аккумуляторе число 9? А там 1 в допкоде.
Откуда при вычислении "1 - 2" должно взяться 9?
В IA-32 64-х разр. числа представляются двумя 32-х разр., для 1 и 2 - соответственно 0,1 и 0,2. SUB для младших слов дает 1-2=0xffffffff и установленный флаг переноса. SBB для старших слов дает 0-0 - <флаг переноса>= 0xffffffff.
Т.е. результат 64-х разрядного вычитания "1-2" - пара 0xffffffff, 0xffffffff.

 Профиль  
                  
 
 Re: Представление данных в оперативной памяти
Сообщение07.01.2012, 09:20 


23/10/09
10
Вы поскользнулись на обычной ляпе, уважаемый, и, как следствие, увели вопрос не в то русло.
Правильный ответ:
"Да, при вычитании 1-2 будет 9. Но, это в 10-ой системе. В 2-ой же (ака ПКшной) это будет 0F. И если далее ничего делать не надо, то эти 0F трактуются через допкод как -1. Если же надо (например тупо несколько раз вычитать еще раз двойку), то допкод так и остается допкодом (фактически трактуется положительным числом, ибо аккумулятору наплевать на допкод) и из него снова идет вычет этой двойки. И вот именно в этом случае 0F как раз и будет аналогом (если проводить параллель) 9-ки в 10-ой системе."

Good night, language. Let's meet next time.

 Профиль  
                  
 
 Re: Представление данных в оперативной памяти
Сообщение07.01.2012, 12:03 
Аватара пользователя


27/01/09
813
Уфа
nakshi в сообщении #524138 писал(а):
Вы поскользнулись на обычной ляпе, уважаемый, и, как следствие, увели вопрос не в то русло.
Ляпы у вас, т.к. 1-2 в 2-й ПК-шной системе будет столько F, какой длинны были операнды, если 8 бит, то FF, если 64 бита, то FFFFFFFFFFFFFFFF. Надо следить за типом (длинной) данных и если один операнд у вас 32-х разрядный, а другой 64-разрядный, то чтобы получить 64-х разрядный результат, 32-х разрядный операнд надо расширить до 64-х разрядного, например специальной командой расширения знака, CDQ в данном случае. Это относится и к применению команды SBB.

 Профиль  
                  
 
 Re: Представление данных в оперативной памяти
Сообщение08.01.2012, 01:28 
Аватара пользователя


27/01/09
813
Уфа
Программа (без использования FPU) вычитания N-разрядных чисел (один разряд 32-бит) A, B и сохранение результата в С (и заёма в флаге FC), которые хранятся в памяти естесственным образом, т.е. друг за другом и старшее слово по младшему адресу:
Код:
CLC
STD
MOV ES, DS
LEA ESI, A+2*(N-1)
LEA EDI, C+2*(N-1)
MOV CX, N
@N:
    LODSD
    SBB EAX, ESI[2*(N+1)]
    STOSD
LOOP @N

 Профиль  
                  
 
 Re: Представление данных в оперативной памяти
Сообщение10.01.2012, 22:41 
Аватара пользователя


27/01/09
813
Уфа
Неужели никто не видит ошибки в программе для 32-разрядных регистров?

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 12 ] 

Модераторы: maxal, Toucan, PAV, Karan, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group