Articles of assembly

реализовать 64-битную арифметику на 32-битной машине

Следующий код вычисляет произведение x и y и сохраняет результат в памяти. Тип данных ll_t определяется как эквивалентный длинному долгу. typedef long long ll_t; void store_prod(ll_t *dest, int x, ll_t y) { *dest = x*y; } gcc генерирует следующий код сборки, реализующий вычисление: dest at% ebp + 8, x at% ebp + 12, y at% […]

Как работает передача аргументов?

Я хочу знать, как передаются аргументы функциям в C. Где хранятся значения и как они извлекаются? Как работает переменный аргумент? Кроме того, поскольку это связано: как насчет возвращаемых значений? У меня есть базовое понимание регистров процессора и ассемблера, но недостаточно, чтобы я полностью понял ASM, который GCC вернул мне. Было бы очень полезно оценить некоторые […]

Мой (AT & T) assembly (x86-x64) код должен увеличиваться, но не

Я пытаюсь сделать небольшую программу в сборке (для AT & T). Я пытаюсь получить ввод от пользователя в виде целого числа, увеличивать его после этого и затем выводить добавочное значение. Однако значение не увеличивается. Я потратил последние часы на то, чтобы все, что я мог придумать, но это все еще не работает, поэтому у меня […]

Каков эффект второго аргумента в _builtin_prefetch ()?

В документе GCC указывается использование _buitin_prefetch. Третий аргумент совершенен. Если это 0, компилятор генерирует команду prefetchtnta (% rax). Если это 1, компилятор генерирует команду prefetcht2 (% rax). Если это 2, компилятор генерирует команду prefetcht1 (% rax). Если это 3 (по умолчанию), компилятор генерирует prefetcht0 (% rax). Если мы изменим третий аргумент, код операции уже изменился […]

MARS MIPS и узлы структуры

typedef struct node { int data; struct node *next; } nodeL; Предполагая, что я хочу перевести вышеуказанное объявление на языке ассемблера MIPS, как я должен это делать? Помимо выделения памяти (с использованием syscall 9), которая выполняется в сегменте .text, как насчет сегмента .data ? Также, как насчет выравнивания ?

x86 Вставка кода в x86-процесс из процесса x64

Я понимаю, что название немного запутанно, поэтому позвольте мне объяснить, что я пытаюсь сделать: Я только что закончил писать простой DLL-инжектор для доказательства концепции, которую я пытаюсь написать. Программа принимает моментальный снимок текущих процессов, перечисляет дерево процессов и вставляет DLL в свой прямой родительский процесс. Теперь в идеальных условиях это прекрасно работает: 32-битная версия инжектора […]

Векторизация модульной арифметики

Я пытаюсь написать некоторый разумно быстрый компонентный код добавления векторов. Я работаю с (подписанными, я считаю) 64-битными целыми числами. Функция void addRq (int64_t* a, const int64_t* b, const int32_t dim, const int64_t q) { for(int i = 0; i < dim; i++) { a[i] = (a[i]+b[i])%q; // LINE1 } } Я компилирую с icc -std=gnu99 […]

Атомные операции и генерация кода для gcc

Я смотрю на сборку, сгенерированную для атомных операций gcc. Я попробовал следующую короткую последовательность: int x1; int x2; int foo; void test() { __atomic_store_n( &x1, 1, __ATOMIC_SEQ_CST ); if( __atomic_load_n( &x2 ,__ATOMIC_SEQ_CST )) return; foo = 4; } Глядя на атомное оружие Херба Саттера по генерации кода, он упоминает, что руководство X86 xchg использовать xchg […]

Как получить размер функции C изнутри программы C или встроенной сборки?

Предположим, что у меня есть функция, как показано ниже: # cat 003.c int foo(int a, int b) { return a+b; } И скомпилируйте его так: gcc -S 003.c Получает следующий результат сборки: .file “003.c” .text .globl foo .type foo, @function foo: .LFB2: pushq %rbp .LCFI0: movq %rsp, %rbp .LCFI1: movl %edi, -4(%rbp) movl %esi, -8(%rbp) […]

Как загрузочный код linux можно записать в C?

Я новичок в обучении разработке ОС. Из прочитанной книги я сказал, что загрузчик скопирует первый MBR в 0x7c00 и начнет оттуда в реальном режиме. И пример начинается с 16-битного ассемблерного кода. Но когда я посмотрел на сегодняшнее kernel ​​linux, arch / x86 / boot имеет «header.S» и «boot.h», но фактический код реализован в main.c. Это […]