vak: (Default)
[personal profile] vak
Встречался ли вам процессор, где sizeof(int) равен трём? Не древность какая, а вполне современный чип. На Маузере $12 баксов стоит. Это тот самый eZ80, что в компьютере Agon Light, что я упоминал. Он хоть и уродился от 16-битного z80, но размер всех регистров увеличили до 24 бит. Получился странный размер целого числа.

Zilog поставляет бесплатный компилятор Си, но только для Windows. К счастью, оно успешно ставится и работает на Линуксе посредством Wine. Скачивается по ссылке: ZDS II eZ80Acclaim. После установки пакет оказывается в каталоге ~/.wine/drive_c/ZiLOG/ZDSII_eZ80Acclaim!_5.3.4.

Чтобы выяснить размер int, скомпилируем тривиальную програмку и глянем ассемблерный результат:
$ cat szint.c
int szint()
{
return sizeof(int);
}

$ export WINEDEBUG=-winediag,-systray
$ wine ~/.wine/drive_c/ZiLOG/ZDSII_eZ80Acclaim\!_5.3.4/bin/ez80cc.exe -cpu:EZ80F92 -noasm szint.c

$ cat szint.src
; Zilog eZ80 ANSI C Compiler Release 3.4
; -nomodsect -peephole -globalopt -localcse -optsize
; -const=ROM
FILE ".\szint.c"
.assume ADL=1
SEGMENT CODE
; 1 int szint()
; 2 {
_szint:
; 3 return sizeof(int);
LD HL,3
; 4 }
RET

;**************************** _szint ***************************
;Name Addr/Register Size Type

; Stack Frame Size: 6 (bytes)
; Spill Code: 0 (instruction)

XDEF _szint
END
Видите команду LD HL,3? Это возвращаемое значение sizeof(int) = 3.

Глянем для интереса значения INT_MAX и INT_MIN:
$ grep -rh define\ INT_M ~/.wine/drive_c/ZiLOG/ZDSII_eZ80Acclaim\!_5.3.4/include
#define INT_MAX 8388607 /* max value for int */
#define INT_MIN (-8388607 - 1) /* min value for int */
Такой вот странный процессор.

Date: 2023-01-28 03:31 (UTC)
sab123: (Default)
From: [personal profile] sab123
Бывают еще и 18-битные. А Z80 был 8-битный, в нем пара регистров объединялась для 16-битного адреса.

Date: 2023-01-28 08:20 (UTC)
sab123: (Default)
From: [personal profile] sab123
Нет, я сам таким не пользовался. Там вроде как 9-битные байты.

Date: 2023-01-28 03:33 (UTC)
perdakot: (Default)
From: [personal profile] perdakot
но размер всех регистров увеличили до 24 бит

А на MSP430X 20-битные регистры, sizeof(int)=2.5.

Date: 2023-01-28 03:53 (UTC)
perdakot: (Default)
From: [personal profile] perdakot
https://en.wikipedia.org/wiki/TI_MSP430

MSP430X 20-bit extension

In order to support this, an extended form of the MSP430 uses 20-bit registers and a 20-bit address space

Date: 2023-01-28 05:12 (UTC)
perdakot: (Default)
From: [personal profile] perdakot
Я не знаю, где вам это взять. Нагуглилось

-mlarge
Use large-model addressing (20-bit pointers, 32-bit size_t).
-msmall
Use small-model addressing (16-bit pointers, 16-bit size_t).


Есть какие-то трудности, чтобы INT_MAX был 0x7FFFF?

Date: 2023-01-28 04:07 (UTC)
archaicos: Шарж (Default)
From: [personal profile] archaicos
Прям вещественное число возвращает sizeof?

Date: 2023-01-28 05:03 (UTC)
perdakot: (Default)
From: [personal profile] perdakot
По-моему, оно там 4 возвращало. Но это ж криво, должно 2.5.

Date: 2023-01-28 05:09 (UTC)
archaicos: Шарж (Default)
From: [personal profile] archaicos
Размер может быть больше эффективного (но не может быть вещественным, т.к. sizeof возвращает целочисленный size_t). Дырки возможны.

Date: 2023-01-28 05:14 (UTC)
perdakot: (Default)
From: [personal profile] perdakot
но не может быть вещественным

Недоработка же. Надо было размер возвращать в битах.

Date: 2023-01-28 04:06 (UTC)
archaicos: Шарж (Default)
From: [personal profile] archaicos
Было бы прикольней, если бы все инструкции были по 3 байта, и pc был кратен 3.

Date: 2023-01-28 04:37 (UTC)
archaicos: Шарж (Default)
From: [personal profile] archaicos
Не, просто прикольно было бы проверять на делимость на три. :)
Не слишком сложно, но зачотно.

Date: 2023-01-28 08:23 (UTC)
sab123: (Default)
From: [personal profile] sab123
Будете смеяться, на Итаниуме (он же в девичестве Мерсед) было подобное. Там, если я правильно помню, в 8-байтовое слово укладывались две 3-байтовых инструкции и одна 2-байтовая. Что было 3 инструкции на слово - это точно, а вот подробности я мог напутать.

Date: 2023-01-28 10:14 (UTC)
From: [personal profile] ivanrubilo
А есть такие, ну не 3 байта, но 12 бит, 14 бит на некоторых микроконтроллерах PIC. На x86 можно однобайтовую префиксами добить и до 3.

Date: 2023-01-28 07:54 (UTC)
From: [personal profile] chabapok
Какой ужас, такое в раст портировать?

Если мы заговорили об экзотике, то https://ru.wikipedia.org/wiki/%D0%A1%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0_%D0%BE%D1%81%D1%82%D0%B0%D1%82%D0%BE%D1%87%D0%BD%D1%8B%D1%85_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%BE%D0%B2

"Практическое применение: чехословацкая ламповая ЭВМ «EPOS», советская военная многопроцессорная суперЭВМ 5Э53, предназначенная для решения задач противоракетной обороны."

Date: 2023-01-28 10:47 (UTC)
vit_r: default (Default)
From: [personal profile] vit_r
А зачем? Не кремний же экономили.

Date: 2023-01-28 12:33 (UTC)
juan_gandhi: (Default)
From: [personal profile] juan_gandhi

Ну хотя бы целое число. А то на иных архитектурках оно было не целое.

Date: 2023-01-28 15:46 (UTC)
From: [personal profile] ivanrubilo
Там небось экстра бит был добавлен (ну или несколько) для того чтобы что-то сигнализировать типа «имеет валидное значение» как в Итанике?

Date: 2023-01-28 17:46 (UTC)
juan_gandhi: (Default)
From: [personal profile] juan_gandhi

Нет, там экстра биты не играли никакой роли.