Как 8-битный компьютер или процессор интерпретирует числа больше 255?

3480
CosnotraLF

Итак, я искал это, но я не могу найти что-нибудь, связанное с этим.
Что я знаю, так это то, что если число больше 255, компьютер использует новый блок памяти из 8 бит ( 1 байт ) для хранения большого числа.

Допустим, я хочу, чтобы компьютер добавил 255 + 7 . Это дало бы мне 262 в базе 10, но в двоичном виде это должно быть:

00 00 <- до
01 06 <- после
(это в шестнадцатеричной форме между прочим)

Как бы компьютер декодировал эти 2 байта обратно в основную 10- значную / десятичную форму, если компьютер не может добавить 6 и 256, потому что 255 - это наибольшее число, которое он может добавить. Как компьютер заставил бы этот 2- байтовый ответ / результат отображаться на экране как 262 ?

-2
Он никогда не должен становиться 262, чтобы отображаться как таковой. Для этого необходимо вычислить первую цифру, «2», затем вторую цифру и т. Д. Каждую цифру можно рассчитать, оставаясь ниже 255. Aganju 7 лет назад 0
Спасибо! Это действительно очень помогает! (; но как вычислить первую цифру a 2, вторую a 6 и последнюю a 2, чтобы сформировать 262? Как можно вычислить эти числа с 2 байтами, которые компьютер хранит в памяти. Конечно, в двоичный файл, потому что компьютеры не могут понять базовые 10 / десятичные цифры CosnotraLF 7 лет назад 0
РЕДАКТИРОВАТЬ: потому что два байта: 01 и 06, так скажем, компьютер интерпретирует самый левый как 256 и самый правый как 6, когда он пытается записать его на экране, он будет выглядеть следующим образом: .. 2566, который не равно 262, так что, конечно, это более сложный расчет, но я хочу знать, как выполняется вычисление, чтобы я мог реализовать его на 8-битном компьютере, который я сейчас делаю. CosnotraLF 7 лет назад 0
Это называется [двоичное в десятичное преобразование с ограниченной точностью] (http://homepage.cs.uiowa.edu/~jones/bcd/decimal.html), один из примеров - преобразование 16-разрядного числа (как и ваш 0106). ) до десятичного числа только с 8-битным ALU Martheen Cahya Paulo 7 лет назад 0
Я не прочитал весь вопрос, потому что я делаю что-то одновременно, но имейте в виду, что теоретически вы можете считать до 9 или 10, несмотря на то, что у вас всего 10 пальцев. barlop 7 лет назад 0
@ Matthen, спасибо, что я Финна, прочитайте это, тогда я пойду к следующим ответам. CosnotraLF 7 лет назад 0
@Marthewn Cahyda Paulo ЛУЧШИЙ ОТВЕТ BRO Я, наконец, получить его! Спасибо CosnotraLF 7 лет назад 0

1 ответ на вопрос

3
TOOGAM

Во-первых, посмотрите комментарий Аганджу под вопросом.

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

Когда вы добавляете два 8-битных числа, вы можете получить самое большое число (0xFF + 0xFF = 1FE). На самом деле, если вы умножите два 8-битных числа, самое большое число, которое вы можете получить (0xFF * 0xFF = 0xFE01), будет по-прежнему равным 16 битам, что в два раза больше 8 битов.

Теперь вы можете предположить, что 8-битный процессор может отслеживать только 8-битные. Это не точно. 8-битный процессор получает данные в 8-битных порциях. (Эти «порции» обычно имеют формальный термин: «слово». На 8-битном процессоре используются 8-битные слова. На 64-битном процессоре можно использовать 64-битные слова.)

Итак, когда вы даете компьютеру 3 байта:
Байт # 1: Инструкция MUL
Байт № 2: байты старшего разряда (например, 0xA5)
Байт № 3: байты младшего разряда (например, 0xCB)
Компьютер может сгенерировать результат, который больше 8 бит Процессор может генерировать такие результаты:
0100 0000 0100 0010 xxxx xxxx xxxx xxxx 1101 0111
aka:
0x4082xxxxD7
Теперь позвольте мне интерпретировать это для вас:
0x означает, что следующие цифры являются шестнадцатеричными.
Я кратко расскажу о «40».
82 является частью регистра «А», который представляет собой последовательность из 8 битов.
xx и xx являются частью двух других регистров, называемых регистром «B» и регистром «C».
D7 будет вписываться в больше битов, называемых "
Регистр это просто кусок памяти. Регистры встроены в ЦП, поэтому ЦП может получать доступ к регистрам без необходимости взаимодействия с памятью на карте памяти.

Таким образом, математический результат 0xA5 умножить на 0xCB равен 0x82D7.

Теперь, почему биты были разделены на регистры A и D вместо регистров A и B или регистров C и D? Ну, еще раз, это пример сценария, который я использую, и должен был быть похож на концепцию реального языка ассемблера (Intel x86 16-битный, используемый Intel 8080 и 8088 и многими новыми процессорами). Могут существовать некоторые общие правила, такие как регистр «C», обычно используемый в качестве индекса для операций подсчета (типичный для циклов), и регистр «B», используемый для отслеживания смещений, которые помогают указывать области памяти. Таким образом, «А» и «D» могут быть более распространенными для некоторых общих арифметических функций.

Каждая инструкция CPU должна иметь некоторую документацию, используемую людьми, которые программируют на ассемблере. В этой документации должно быть указано, какие регистры используются каждой инструкцией. (Таким образом, выбор используемых регистров часто определяется разработчиками ЦП, а не программистами на языке ассемблера. Хотя может быть некоторая гибкость.)

Теперь вернемся к «40» в приведенном выше примере: это серия битов, часто называемая «регистром флагов». Каждый бит в регистре флагов имеет имя. Например, есть бит «переполнения», который ЦП может установить, если результат будет больше, чем пространство, в котором может храниться один байт результатов. (Бит «переполнение» часто может называться сокращенным именем «OF». Это заглавная буква o, а не ноль.) Программное обеспечение может проверить значение этого флага и заметить «проблему». Работа с этим битом часто незаметно обрабатывается языками более высокого уровня, поэтому начинающие программисты часто не учатся взаимодействовать с флагами процессора. Однако программисты на ассемблере могут обычно обращаться к некоторым из этих флагов способом, очень похожим на другие переменные.
Например, у вас может быть несколько инструкций ADD. Одна инструкция ADD может хранить 16 битов результатов в регистре A и регистре D, тогда как другая инструкция может просто хранить 8 младших битов в регистре A, игнорировать регистр D и указывать бит переполнения. Затем, позже (после сохранения результатов регистра A в основное ОЗУ), вы можете использовать другую инструкцию ADD, которая хранит только 8 старших бит в регистре (возможно, регистре A). Возможно, вам понадобится использовать флаг переполнения зависит только от того, какую инструкцию умножения вы используете.

(Существует также обычно флаг «недостаточного количества», если вы вычитаете слишком много, чтобы соответствовать желаемому результату.)

Просто чтобы показать вам, как все усложнилось:
Intel 4004 был 4-битным процессором
Intel 8008 был 8-битным процессором. Он имел 8-битные регистры с именами A, B, C и D.
Intel 8086 был 16-битным процессором. Он имел 16-битные регистры с именами AX, BX, CX и DX.
Intel 80386 был 32-разрядным процессором. Он имел 32-битные регистры с именами EAX, EBX, ECX и EDX.
Процессоры Intel x64 имеют 64-разрядные регистры с именами RAX, RBX, RCX и RDX.
Чипы x64 могут выполнять 16-битный код (в некоторых режимах работы) и могут интерпретировать 16-битные инструкции. При этом биты, которые составляют регистр AX, составляют половину битов, которые составляют регистр EAX, которые являются половиной битов, которые составляют регистр RAX. Таким образом, каждый раз, когда вы меняете значение AX, вы также меняете EAX и RAX, потому что эти биты, используемые AX, являются частью битов, используемых RAX.
Есть больше флагов и регистров, чем я упомянул.
Теперь, если вы используете 8-битный процессор, при записи в память вы можете столкнуться с некоторыми ограничениями, связанными с возможностью обращаться к 8-битному адресу, а не к 4-битному или 16-битному адресу. Детали будут различаться в зависимости от процессора, но если у вас есть такие ограничения, то процессор может иметь дело с 8-битными словами, поэтому ЦП чаще всего называют «8-битным процессором».

Очень полезно! +10000 CosnotraLF 7 лет назад 0