Разница между 24-битными адресами и 24-битной арифметикой c по сравнению с 24-битным адресом с адресной арифметикой c 16-битного адреса? - PullRequest
1 голос
/ 25 мая 2020

Я нашел в документации c167 примечание об арифметике c указателей. Есть два макроса _huge и _shuge.

Цитата из Доку:

_huge или _shuge. Огромные данные могут быть где угодно в памяти, и вы можете

также ссылаться на них, используя 24-битный адрес. Однако адресная арифметика

выполняется с использованием полного адреса (24 бита). Данные Shuge также могут быть

где угодно в памяти, и вы также можете ссылаться на них, используя 24-битный адрес.

Однако адресная арифметика c выполняется с использованием 16-битного адреса.

Итак, в чем разница в использовании _huge vs _shuge? Насколько я понимаю, арифметика c указателей использует смещение от начального адреса

Пример того, что я понял до сих пор:

& a [0] + 1, где один элемент of a is int32 & a [0] дает мне адрес первого элемента, который, например, будет равен 0x1234211 + 32Bit. **

Есть ли разница, учитывая примечание сверху и то, что разница в _huge и _shuge?

С уважением

Ответы [ 2 ]

1 голос
/ 25 мая 2020

Huge использовалось в (хорошем?) Старом семейном режиме адресации 8086. Это были 16-битные процессоры с 24-битной адресной шиной. Полный адрес был задан сегментом (16 бит) и смещением (снова 16 бит) по следующей формуле:

linear_address = segment * 16 + offset

Разница между 2 _huge адресами была вычислена путем первого преобразования обоих до 24-битных линейных адресов и вычитания этого значения, в то время как для _shuge one сегмент и смещение были отдельно вычтены.

Пример 0010: 1236 - 0011: 1234 даст 0000: 0012 (18), если вычислить как _huge и 0001:0002 как _shuge

1 голос
/ 25 мая 2020

Это косвенно объясняется на 17-й странице (обозначенной как страница 7) этого PDF-файла: https://www.tasking.com/support/c166/c166_user_guide_v4.0.pdf

По умолчанию все арифметические значения указателя __far c равны 14- немного. Это означает, что сравнение указателей __far также выполняется в 14-битном формате. Для __shuge то же самое верно, но с 16-битной арифметикой c. Это значительно экономит код, но имеет следующие последствия:

• Сравнение указателей на разные объекты ненадежно. Это надежно только тогда, когда известно, что эти объекты расположены на одной странице.

• Сравнение с NULL ненадежно. Объекты, расположенные на другой странице по смещению 0x0000, имеют младшие 14 бит (смещение страницы), равное нулю, и также будут оцениваться как NULL. младшие 16 игнорируются, кроме случаев разыменования. Вы также можете отметить, что указатели _shuge имеют 16-битное выравнивание, что означает, что их младшие 4 бита всегда равны нулю и, следовательно, при сравнении или вычитании необходимо учитывать только 12 битов.

...