Как вы определяете макрос в ARMv8?

#gnu-assembler #arm64

#gnu-ассемблер #arm64

Вопрос:

Я новичок в кодировании на языке ассемблера, и я не смог найти никаких ответов на этот вопрос в Интернете. Я даже не уверен, задаю ли я правильный вопрос, но я подумал, что это не повредит. Буду признателен за любую помощь.

Ответ №1:

В приведенных ниже примерах предполагается, что в качестве компилятора используется GNU.

Макросы аккуратны, и я часто их использую; однако их отладка может быть затруднительной, поэтому будьте осторожны. Если вы новичок в сборке, я бы посоветовал сначала изучить ARMv7, Поскольку существует гораздо больше книг, руководств и т. Д., Чем ARMv8.

 // push2
.macro push2, xreg1, xreg2
.push2@:
        stp     xreg1, xreg2, [sp, #-16]!
.endm

// pop2
.macro  pop2, xreg1, xreg2
.pop2@:
        ldp     xreg1, xreg2, [sp], #16
.endm


// exit
    .macro _exit
    .exit@:
            mov x8, #93             // exit see /usr/include/asm-generic/unistd.h
            svc 0
    .endm

.macro gCode num                // Grey code...  https://en.wikipedia.org/wiki/Gray_code
.gCode@:
        mov x0, num
        eor x0, x0, x0, lsr 1   // G Code == B XOR (B >> 1 unsigned)
.endm