anonymous@RULINUX.NET~# Last login: 2022-06-30 12:13:14
Регистрация Вход Новости | Разметка | Пользователи | Галерея | Форум | Статьи | Неподтвержденное | Трекер | Правила форума | F.A.Q. | Ссылки | Поиск
[#] [Добавить метку] [Редактировать]
Скрыть

[assembler] [preprocessor] преобразовать имя регистра в его номер

Компилятор не знает некоторых иструкций процессора. Чтобы вставить их в ассемблерный код я написал макрос, который формирует код нужной инструкции из аргументов. Один из аргументов, который должен попасть в код инструкции - номер регистра. Регистр передается макросу в виде "$N", где N - собственно номер регистра (N=0..31). Чтобы засунуть его в opcode нужно преобразовать "$N" в "N" и произвести над N арифметическую операцию. Как бы это сделать средствами препроцессора?

Т.е. хочется как-то так:

asm


#define OP_OFFSET 24
#define REG_OFFSET 16

#define SUPER_OP 0xbe

.macro super_ins reg
.word (SUPER_OP << OP_OFFSET) | (\reg << REG_OFFSET)
.endm

super_ins $4
super_ins $5
super_ins $6

 


Но в этом примере вместо \reg будет подставлено $4 ($5, $6) и компилятор выдаст ошибку. Нужно чтобы вместо $4 подставилось просто 4.

Пока я сделал по тупому: перекладываем значение из регистра-аргумента во временный регистр $1 и формируем opcode с временным регистром. Но хочется избавиться от лишней инструкции.

asm


.macro super_ins reg
.set push
.set noat

move $1, \reg
.word (SUPER_OP << OP_OFFSET) | (1 << REG_OFFSET)

.set pop
.endm

 


ассемблер mips-linux-gnu-gcc

anonymous(*) (2016-09-22 22:54:20)

Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36 OPR/39.0.2256.71

[Ответить на это сообщение]
avatar
Скрыть

Re: [assembler] [preprocessor] преобразовать имя регистра в его номер

> ассемблер

anonymous(*)(2016-09-22 23:10:56)

Mozilla/5.0 (Android 6.0.1; Mobile; rv:48.0) Gecko/48.0 Firefox/48.0
avatar
Скрыть

Re: [assembler] [preprocessor] преобразовать имя регистра в его номер

Я уже давно далек от ассемблерной тематики, просто интересно, это какой то суровый эмбеддед с редким чипом, что приходится на асме напрямую писать ?

Dr.uid(*)(2016-09-23 00:13:26)

Mozilla/5.0 (Windows NT 6.1; rv:38.0) Gecko/20100101 Firefox/38.0
avatar
Скрыть

Re: [assembler] [preprocessor] преобразовать имя регистра в его номер

asm

super_ins 4
super_ins 5
super_ins 6
 


Не?

anonymous(*)(2016-09-23 12:46:17)

Этот тред читают 2 пользователя:
Анонимных: 2
Зарегистрированных: 0




(c) 2010-2020 LOR-NG Developers Group
Powered by TimeMachine

Valid HTML 4.01 Transitional Правильный CSS!