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

`jz` к расположению памяти относительно RIP приводит к несоответствию операндов (GCC)

.macro alloc_linked_list_item_rdi_rax
        movq $24, %rdi
        call malloc@PLT
        testq %rax, %rax
        leaq 0x1a(%rip), %r10
        jz *%r10  # <=
        movq $0xA, 0x0(%rax)  # void *data
        movq $0x0, 0x8(%rax)  # struct linked_list_item *prev
        movq $0x0, 0x10(%rax) # struct linked_list_item *next
.endm

Когда я пытаюсь собрать следующий макрос (с GCC на GNU/Linux Debian x86-64), ассемблер выдает ll.s:86: Error: operand type mismatch for 'jz', где ll.s:86 указывает на внутри этого макроса, на этот конкретный jz.

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

Данная сборка работала, если бы я заменил jz на безусловную jmp, так как в связи с этим я не понимаю, почему написанный мной код не работает.

Может ли кто-нибудь пролить свет?

20.01.2019

Ответы:


1

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

        jnz .Lalloc_linked_list_item_rdi_rax.\@
        jmp *%r10
.Lalloc_linked_list_item_rdi_rax.\@:

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

Если я правильно помню, некоторые старые ассемблеры делали это автоматически, но это стало менее полезным и на самом деле довольно запутанным, когда статическое прогнозирование ветвлений появилось в ЦП, потому что оно скрывало, как ЦП предсказывал ветвления. (Но большинство современных процессоров x86, похоже, больше не полагаются на предсказание статических ветвлений, поэтому мы вернулись к тому, с чего начали.)

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

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

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

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

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

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

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

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