Архитектура набора команд (англ. Instruction Set Architecture) Xtensa - это новая пост-RISC (Reduced instruction Set Computer) ISA, разработанная преимущественно для встраиваемых систем. Эта короткая справка представляет собой сборник часто встречающихся инструкций, а также описывает некоторые особенности ассемблера, такие как регистры, стек, ветвления, вызовы функций, переходы и т.д. Вся нижеизложенная информация взята из официальной спецификации1 и автор настоятельно рекомендует использовать ее в качестве справочного руководства.
Поводом для написания мануала послужило изучение популярных в среде интернета вещей платформ ESP8266, ESP32. Страница будет пополняться (возможно).
В Xtensa используются инструкции шириной 16 и 24 бита соответственно, когда как для RISC используются инструкции шириной 32 бита, также отсутствует branch delay slot2.
В качестве базовых регистров стоит выделить AR и PC, где AR - адресный регистр (англ. address register) общего назначения, А PC - счетчик команд (англ. program counter). Максимальное количество AR регистров может достигать 256, но зачастую используется 16, где:
L8UI, L16SI, L16UI, L32I, L32R
Пример:
0x4021b95b l32r a2, 0x402103c8
0x4021b95e call0 printf ; sym.printf ; int printf(const char *format)
S8I, S16I, S32I
Пример:
0x4021b923 s32i a0, a1, 28
0x40218501 s8i a0, a2, 160
CALL0, CALLX0, RET, J, JX
Пример:
0x4021b9e9 call0 _svfprintf_r ; sym._svfprintf_r
0x40211329 j 0x40211333
Инструкций для условных переходов в документации перечислено значительно больше, чем встречается на практике, но тем не менее я перечислю их здесь.
BALL, BNALL, BANY, BNONEб BBC, BBCI, BBS, BBSI, BEQ, BEQI, BEQZб BNE, BNEI,BNEZ, BGE, BGEI, BGEU, BGEUI, BGEZ, BLT, BLTI, BLTU, BLTUI, BLTZ
Пример:
0x4021b9ec blt a2, a12, 0x4021b9f8 ; asprintf.c:78
0x4021134e bnez a2, 0x40211342
AND, OR, XOR
Пример:
0x4021e7df xor a2, a0, a0
0x40212891 and a13, a12, a13
0x4023c9cf or a1, a1, a1
ADDI, ADDMI, ADD, ADDX2, ADDX4, ADDX8, SUB, SUBX2, SUBX4, SUBX8, NEG, ABS
Пример:
0x402116a0 addi a1, a1, 16
0x40223808 addmi a0, a2, 0x6100
0x402141a9 add a12, a13, a12
0x4022491d addx2 a2, a2, a2 ; vfs.c:266 const int index = s_fd_table[fd].vfs_index; // single read -> no locking is required
0x402494a0 sub a10, a0, a6
0x4023f29a neg a12, a12
...
EXTUI, SRLI, SRAI, SLLI SRC, SLL, SRL, SRA, SSL, SSR, SSAI, SSA8B, SSA8L
Что касается сдвигов, то cutter4 не нашел в бинарнике ни одной подобной инструкции. Судя по документации, они могут использоваться для повышения производительности, возможно, при различных оптимизациях колмпилятора, но это нужно проверить. Также сдвиги часто можно встретить в малвари, шифровании на основе генераторов случайных чисел и т.д.