На что он ругается?
norm_b_square
, а в цикле работаешь с *norm_b_square
. А если ты имел в виду одноимённый norm_b_square
из функции main
, то нет, нельзя так сослаться на автоматическую переменную из другой функции.В чем тут фокус?
std::tm
-- это завёрнутая в namespace std struct tm
, древняя структура из чистого C. #include <time.h>
enum time_floor_level {
YEAR, MONTH, DAY, HOUR, MINUTE,
};
time_t time_floor(time_t t, enum time_floor_level level)
{
struct tm tm;
gmtime_r(&t, &tm);
switch (level) {
case YEAR:
tm.tm_mon = 0;
case MONTH:
tm.tm_mday = 1;
case DAY:
tm.tm_hour = 0;
case HOUR:
tm.tm_min = 0;
case MINUTE:
tm.tm_sec = 0;
}
return timegm(&tm);
}
; устанавливаем сегмент стека mov ax, s_seg mov ss, ax ; устанавливаем сегмент данных mov ax, d_seg mov ds, ax
пишет segment relocate
ax
то s_seg, то d_seg как константы, откуда он их возьмёт без релокаций? Если хочешь com-файл, то либо пиши вместо этого mov ax, cs ; mov ds, ax
, либо вообще этот код выкинь, потому что com-файл и так стартует со всеми сегментами указывающими в одно и то же место. зачем там реализуют разные модули, типа кеша, вроде в каком-то даже увидел конвеер исполнения команд, предсказатели переходов. И прочие. К примеру кеш, тлб, зачем он там нужен. если все как бы просиходит внутри машины?
Зачем адрес куда-то в кеш записывать, если этот кеш 3 уровня, или регистр лежит с точки зрения внешней среды, там же где и ram и доступ должен быть одинаковым.
Ассоциативная память. Если там внутри делается таблица адресов, виртуальных адресов. То к примеру для адресного пространства 4гб, будет 2^32 это будет в 32 раза дольше.
Короче, в итоге для поиска адреса в супер жесткой виртуальной машине, будет до 32 операции сравнений по словарю, потом суммарно где же в кешах каждого уровня, куча прочих проверок .... .
В risc вроде там куча csr регистров
на разных компиляторах одна си операция ассемблируется то в комбинацию lui + addi, то в комбинацию auipc +addi
lui
и auipc
. Такие инструкции есть у RISC-V.lui
загружает константу собранную из 20 битов непосредственного значения из инструкции и 12 нулевых младших битов в целевой регистр, а auipc
прибавляет такую же точно константу к PC и загружает в целевой регистр результат сложения, и в этом вся разница между ними.где какая используется не совсем понимаю.
lui
используется для генерации констант, которые не зависят от того, где расположен код, а auipc
для генерации констант, которые двигаются вместе с кодом. Т.е. Если ты хочешь вызвать функцию, которая находится дальше чем ±2К от точки вызова, ты можешь сгенерировать её адрес инструкцией auipc
, и полученный код будет работать одинаково, независимо от того, по какому адресу он будет размещён. А если тебе надо поместить в регистр константу, например 0x12345678, то ты можешь это сделать парой инструкций lui rd, 0x12345 ; addi rd, rd, 0x678
и значение константы будет всегда одинаковым, вне зависимости от того, где будет этот код.Каким образом одинаковые адреса различаются. Или они просто не могут быть одинаковыми(типа ос позаботиться)?
Как они в tlb обрабатываются, если вдруг они реально могут быть одинаковыми, и там нету ни каких дополнительных индексов процесса)
TTBR
с примерно той же функцией, что и cr3
в x86.satp
, содержащий ASID и базовый адрес корневого каталога страничных таблиц. Об этом можно прочитать в разделе 4.1.12 Supervisor Address Translation and Protection (satp) Register спецификации The RISC-V Instruction Set Manual Volume II: Privi.... ./configure CC=arm-linux-gnueabi-gcc-7 --host=aarch64-linux-android //тут ОК
make // gcc: command not found
Мне надо ссылку делать в bin на arm-linux-gnueabi-gcc-7, или это костыль в данном случае
Почему нужно 512-356 байт нулями заполнять, почему нельзя продолжить дальше. Ведь следующая после 86*4 байт инструкция(или переменная) будет выровнена
.p2align
, то у тебя таких вопросов не было бы. Потому что никто не заполняет 512-356 байт после. .p21lign
выравнивает текущий адрес по заданной степени двойки. Обычно для этого есть аппаратные причины, например базовый регистр таблицы векторов прерываний может иметь 9 младших бит зафиксированных в 0. Или вот по границе страницы MMU выравнивают данные в ELF-файлах, чтобы можно было установить отдельно разрешения RX для кода и констант и RW для изменяемых данных.для получения элемента допустим table[index_nBit] можно применять операцию ИЛИ вместо сложения. Что быстрее. В этом ли дело
Что означает ошибка «Error: relocation ... cannot be used with -shared»
gcc -fpic
). Из-за того что динамические библиотеки могут быть загружены в процесс по любому адресу существует требование, что код в них должен быть position-independent. Поэтому объектники скомпилированные как position-dependent обычно не могут быть слинкованы в динамическую библиотеку. R_AARCH64_TLSLE_ADD_TPREL_HI12
говорит (частью TLSLE, где LE означает Local Executable) о том, что код объектника в котором она находится был намеренно собран с рассчётом на то, что объектник будет частью исполняемого файла, а не динамической библиотеки. Здесь можно почитать об отличиях моделей адресации TLS, в частности о модели Local Exec в разделе 4.4. Почему возникает проблемы при закрытие файла
Больших отличий я не заметил
while (num_bor_1 <= num_bor_2)
{
if ((num_bor_1 % 2) != 1)
{
num_bor_1++;
}
}
do
{
num_bor_1++;
} while (num_bor_1 < num_bor_2);
После ввода Ctrl+Z и нажатия Enter, если я правильно понимаю, в потоке появляется только EOF и символ новой строки.
end-of-file, that is, no more input from a stream
. Это значит, что ни EOF
как символ, ни что бы то ни было после конца файла прочитано быть не может. Если чтение работает (т.е. функции чтения не возвращают ошибок, либо ошибки не указывают на конец файла), то конец файла не достигнут.Ctrl+Z
в cmd
не вызывает закрытие потока ввода для процесса. И решение, если я читаю часы-минуты-секунды и получаю в секундах 00 - то мне следует перечитать минуты ещё раз и сделать вывод.
Почему возникает free(): double free detected
String
копия получает то же значение str
что и оригинал с которого она скопирована, в деструкторе копия удаляет str
оригинала, а потом это же делает оригинал в своём деструкторе. См. правило трёх/пяти. почему так происходит?
str
и word
-- это переменные размером в один символ, а в строке char delimeters[6] = " .,!?;"
отсутствует 0-терминатор. Поэтомуscanf("%s", &str);
вылезет за пределы str
если ввести здесь что угодно.strcat(&word, &c);
вылезет за пределы word
если в c
будет не пустая строка. А в c
будет неизвестно что, потому что c = getchar()
не добавляет в эту строку 0-терминатор.strchr(delimeters, c);
может вернуть что угодно, если c
не входит в delimiters
. IStream
который возвращает эта функция. third = string(buffer1);
fourth = string(buffer2);
third = string(buffer1, size3);
fourth = string(buffer2, size4);
char buffer1[size3];
…
char buffer2[size4];
wcout << endl << "Результат: " << encrypt(s);
Mixing operations on corresponding wide- and narrow-character streams follows the same semantics as mixing such operations on FILEs, as specified in the C standard library.
Each stream has an orientation. After a stream is associated with an external file, but
before any operations are performed on it, the stream is without orientation. Once a wide
character input/output function has been applied to a stream without orientation, the
stream becomes a wide-oriented stream. Similarly, once a byte input/output function has
been applied to a stream without orientation, the stream becomes a byte-oriented stream.
Only a call to the freopen function or the fwide function can otherwise alter the
orientation of a stream. (A successful call to freopen removes any orientation.)
Byte input/output functions shall not be applied to a wide-oriented stream and wide
character input/output functions shall not be applied to a byte-oriented stream.
почему просто 20 бит не берется по порядку
By rotating bits in the instruction encoding of B and J immediates instead of using dynamic hard-
ware muxes to multiply the immediate by 2, we reduce instruction signal fanout and immediate
mux costs by around a factor of 2
для кого авторы постарались придумать такую ерунду