Nano Hash - криптовалюты, майнинг, программирование

Как написать макрос, который условно обновляет флаги процессора эмулятора?

Я пишу эмулятор ЦП 6502, используя Rust, и я пытаюсь сделать свой код как можно более СУХИМ.

Код для декодирования опкодов и их выполнения выглядит так:

//self refers to CPU struct

match opcode {
    0x29 => {self.A &= self.imm(); update_flags!(self.cpu, "Z0", "N7");},
    // ... other 55 opcodes
}

Мне нужен простой способ обновить флаги ЦП после выполнения каждой инструкции. Например, после выполнения инструкции AND должен быть установлен флаг Z, если A = 0, и флаг N должен быть установлен, если бит 7 равен 1. Я мог бы описать эти два условия как Z0 и N7.

Мне нужно написать макрос, который принимает структуру ЦП, Z0 и N7 в качестве аргументов и расширяется во что-то вроде:

if self.A == 0 {set flag Z};
if self.A.7thbit == 1 {set flag N};

Это возможно?

15.10.2017

  • Почему это должен быть макрос? Что было бы не так с функциями с именами Z и 'N', например. fn Z(&mut self, значение: u8) { self.z_flag = self.A == 0; }` и fn N(&mut self, bit: u8) { self.n_flag = self.A & (1u8 << bit) != 0; } Тогда вы можете назвать их как self.Z(0); self.N(7);. При вызове с постоянными аргументами они должны быть такими же эффективными, как и макросы. 15.10.2017
  • Да, я, вероятно, буду использовать функции. В конце концов, их легче отлаживать. 16.10.2017
  • Теперь я разместил выше в качестве ответа. 16.10.2017

Ответы:


1

Макрос здесь не нужен, так как с помощью функций можно добиться равной (если не лучшей) эргономики и эффективности.

Например, вы можете определить такие методы, как:

fn Z(&mut self, value: u8) {
    self.z_flag = self.A == value;
}

fn N(&mut self, bit: u8) {
    self.n_flag = self.A & (1u8 << bit) != 0;
}

Вместо update_flags!(self.cpu, "Z0", "N7"); вы должны написать self.Z(0); self.N(7);. При вызове с постоянными аргументами они должны быть такими же эффективными, как и макросы.

16.10.2017
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..