PDA

Просмотр полной версии : [Прочее] Новый оператор _asm - замена старого #emit



VVWVV
29.04.2017, 19:35
В компиляторе Pawn существуют баги, связанные с emit. Например, переходы по меткам или проблема с блоками. Поэтому я предлагаю создать новый оператор, поскольку, например, баг с блоками пофиксить никак нельзя.

Я уже написал некоторый функционал данного оператора:


new a = 2;

if (a == 2) {
_asm nop
_asm call name // название функции
_asm jzer abc: // метка
}
_asm nop

printf("abc");


abc:
printf("abc1");





proc ; name
; line 6d
break ; c
; line 6e
break ; 10
;$lcl a fffffffc
stack fffffffc
const.pri 2
stor.s.pri fffffffc
;$exp
; line 70
break ; 2c
load.s.pri fffffffc
const.alt 2
eq
jzer 0
;$exp
; line 71
break ; 4c
nop
; line 72
break ; 54
call .name
; line 73
break ; 60
jzer 1
l.0 ; 6c
; line 75
break ; 6c
nop
nop
; line 7a
break ; 78
l.1 ; 7c
lctrl 5
add.c fffffffc
sctrl 4
nop
stack 4
zero.pri
retn


Генерация кода происходит отлично. Все инструкцию на своих местах.
Возможно, стоит добавить создание блоков, дабы не писать несколько раз _asm (как, например, в С-ях).

Daniel_Cortez
29.04.2017, 20:24
Если перечисленные баги в #emit исправить нельзя, то смысл есть. Иначе же всё преимущество сведётся к тому, что нужно печатать на 1 символ меньше (4 в "_asm" вместо 5 в "#emit"). Блоки _asm {} - тоже стоящая вещь, хотя наверняка будет непросто реализовать их. Скорее всего, будут сложности с обработкой директив условной компиляции внутри блока.

Синтаксис меток немного сомнительный. Никогда не видел, чтобы в каком-то ассемблерном синтаксисе имя метки указывалось с двоиточием в конце. Стоит ли вообще делать такое требование обязательным? Я к тому, что в случае с инструкцией call никаких двоеточий указывать не надо. Правильно понимаю, для каждой инструкции идентификаторы обрабатываются по-своему, не как в #emit, т.е., например, идентификатор после jmp интерпретируется именно как название метки, а не числовой константы?

VVWVV
29.04.2017, 20:59
Правильно понимаю, для каждой инструкции идентификаторы обрабатываются по-своему, не как в #emit?

Используется обычный switch-case, в котором указан tLABEL. Этот вариант я хотел рассмотреть, но я просто не хотел терять своё время на создание таблиц (было лень). Однако для избавления от двоеточия придётся её создать.

Daniel_Cortez
29.04.2017, 21:08
Используется обычный switch-case, в котором указан tLABEL. Этот вариант я хотел рассмотреть, но я просто не хотел терять своё время на создание таблиц (было лень). Однако для избавления от двоеточия придётся её создать.
У меня в реализации альтернативной ВМ (как-то уже упоминал о ней в чате) есть таблица типов аргументов опкодов - она используется для верификации байткода при загрузке. Если нужно, могу одолжить.

VVWVV
29.04.2017, 21:14
У меня в реализации альтернативной ВМ (как-то уже упоминал о ней в чате) есть таблица типов аргументов опкодов - она используется для верификации байткода при загрузке. Если нужно, могу одолжить.

Буду очень благодарен)

VVWVV
24.08.2017, 04:07
Реализация нового оператора отправлена на рассмотрение в виде Pull Request на github. Более того, в нём присутствует документация.

Ссылка (https://github.com/Zeex/pawn/pull/180)

Если вы хотите поддержать данную идею, то можете поставить "палец вверх":
http://ihost.pro-pawn.ru/image.php?di=GUVX
Заранее спасибо)