Получить байтовое представление инструкции ASM в коде C

, и я хочу, чтобы основная активность была на java не на kotlin

Вы всегда можете иметь свой MainActivity в java, а не в Kotlin.

1
задан Florian Bach 19 January 2019 в 13:50
поделиться

1 ответ

1110 Это звучит как безумие, но я полагаю, у вас есть на то веские причины. Жизнь без веселья без небольшого количества безумия.

Один из подходов, который вы можете использовать, - это использовать ассемблер во время сборки для генерации констант во время компиляции.

Первый шаг - создать файл, содержащий все инструкции по сборке, которые вы будете использовать, по одной на строку.

Например:

cmpwi   3,0x20
addi    3,3,0
blr

Назовите этот файл input.def. Затем используйте этот скрипт:

#!/usr/bin/env bash

(cat << HEADER
    .global main
    .text
main:
HEADER
cat input.def) > asm.s

powerpc-linux-gnu-as asm.s -o asm.o

powerpc-linux-gnu-objdump -d asm.o | \
    sed '1,/<main>/ d' | \
    paste -d'\t' - input.def | \
    awk -F'\t' '{
        bytes=$2
        asm=$4
        disasm=$3
        gsub(/ /, "", bytes);
        gsub(/[, ]+/, "_", asm);
        printf("#define ASM_%-20s 0x%s    // disassembly: %s\n", asm, bytes, disasm)
    }'

# Clean temporaries
rm asm.s asm.o

(здесь я использую GNU-ассемблер и objdump. Возможно, вам придется изменить эту часть, если вы не используете эти инструменты. Objdump используется в качестве прославленного hexdump утилита здесь.)

Этот скрипт оболочки:

  1. Создает файл сборки
  2. Собирает его
  3. Помещает его рядом с input.def , (Это позволяет увидеть, какую сборку вы набрали.)
  4. Переформатирует гекс так, чтобы он был допустимой константой Си. Переформатирует asm, чтобы он был допустимым символом C. Затем пишет определение для сопоставления имени инструкции с константой.
  5. Поместите все это в asm.h

Это большая работа, но вы можете сделать все это во время компиляции.

Это создает заголовочный файл с именем asm.h:

#define ASM_cmpwi_3_0x20         0x2c030020    // disassembly: cmpwi   r3,32
#define ASM_addi_3_3_0           0x38630000    // disassembly: addi    r3,r3,0
#define ASM_blr                  0x4e800020    // disassembly: blr

Вы используете файл asm.h так:

#include "asm.h"
*((volatile int *)(0x80001234)) = ASM_cmpwi_3_0x20;

Если вам нужна новая константа asm, отредактируйте input.def и перезапустите сценарий оболочки.

0
ответ дан Nick ODell 19 January 2019 в 13:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: