так может довести это похожее до ума? имхо цифры менее удобны в качестве мнемонических обозначений...Цитата:
Сообщение от aprisobal
кроме того остальные плюсы цифровые метки не покрывают
Вид для печати
так может довести это похожее до ума? имхо цифры менее удобны в качестве мнемонических обозначений...Цитата:
Сообщение от aprisobal
кроме того остальные плюсы цифровые метки не покрывают
а по-моему достаточно удобно. Когда близко, чего зря имена придумывать. Вот помню в асме PDP, с коим я познакомился еще до спека, были локальные метки вида @nnn (n-цифра), локальность которых ограничивалась метками обычными. Т.е. между двумя обычными метками все метки @nnn были локальными. Хотя слово PROC дает лучше эффект.
devpac на амиге: локальные метки == .metka, ограничены обычными. Ещё удобнее, чем цифры only - так как можно и .1 .2 .3 писать, так и .label .metkaЦитата:
Сообщение от Vladimir Kladov
кстати может там как раз точка и была (или еще какой знак, вроде солнца, столько лет прошло, все детали не упомню).
В SjASM тоже есть локальные метки. Только, что цифры как локальные метки теперь не поддерживаются - определяются как директива повтора строки (как в Шторм)Цитата:
Сообщение от lvd
Реализаций данной функции ассемблеров может быть много, например вот как это сделано в WLA DX:Цитата:
Сообщение от elf/2
Код:3.3. Labels
Labels are ordinary strings (which can also end to a ':'). Labels starting
with "_" are considered to be local labels and do not show outside sections
where they were defined, or outside object files, if they were not defined
inside a section.
Here are few examples of different labels:
VBI_IRQ:
VBI_IRQ2
_VBI_LOOP:
main:
Note that when you place ':' in front of the label string when referring to
it, you'll get the bank number of the label, instead of the label's address.
Here's an example:
LD A, :LOOP
.BANK 2 SLOT 0
LOOP:
Here "LD A, :LOOP" will be replaced with "LD A, 2" as the label LOOP is
inside the bank number two.
When you are referring to a label and you are adding something to its address
(or subtracting, any arithmetics apply) the result will always be bytes.
.org 20
DATA: .dw 100, 200, 300
ld a, DATA+1
^^^^^^ = r
So here the result r will be the address of DATA plus one, here 21. Some x86
assemblers would give here 22 as the result r as DATA points to an array
or machine words, but WLA isn't that smart (and some people including me
think this is the better solution).
You can also use -, --, ---, +, ++, +++, ... as un-named labels.
Labels consisting of '-' are meant for reverse jumps and labels consisting
of '+' are meant for forward jumps. You can reuse un-named labels as much
as you wish inside your source code. Here's an example of this:
dec e
beq ++ ; jump -> ?
dec e
beq + ; jump -> %
ld d, 14
--- ld a, 10 ; !
-- ld b, c ; #
- dec b ; *
jp nz, - ; jump -> *
dec c
jp nz, -- ; jump -> #
dec d
jp nz, --- ; jump -> !
ld a, 20
- dec a ; $
jp nz, - ; jump -> $
+ halt ; %
++ nop ; ?
Note that "__" (that's two underline characters) serves also as a un-named
label. You can refer to this label from both directions. Use "_b" when
you are jumping backwards and "_f" when you are jumping forwards label "__".
Example:
dec e
jp z, _f ; jump -> *
dec e
__ ldi a, (hl) ; *
dec e
jp nz, _b ; jump -> *
"+++, --, _b" - тоже не плохо. хотя это опять только _метки_. использование скобок позволяет подчеркнуть структуру программы и вложенность блоков. кроме того обозначение '}' для конца блока/цикла лучше отражает смысл чем +.Цитата:
Сообщение от aprisobal
опять же, это имхо, настаивать не буду, да и не имею права...
Вышла новая версия SjASMPlus - 1.05 RC3. Исправлен небольшой глюк с ENDM, добавлена поддержка скобок {..} и записи любых команд через запятую(INC A,B,C,A). Качать - [...вырезано...]
Spectre, скобками {..} берётся 1 байт из памяти или 2 байта?
Слово.Цитата:
Сообщение от aprisobal
А вообще вот фирменное описание Аласма (усеченное Alone Coder'ом до нескольких страниц). Это часть касающаяся команд и синтаксиса:
Код:4. ДИРЕКТИВЫ АССЕМБЛЕРА
ORG адрес[,страница]
Установка адреса компиляции. По умолчанию параметр "страница"
старый, в начале компиляции =0.
метка EQU значение
Присваивает метке значение, эквивалентное параметру "значение".
DISP адрес
Установка адреса, в котором должна работать программа.
ENT
Присвоение адресу работы программы текущего адреса компиляции.
Пример:
SCREEN EQU #4000
ORG #8000
LD HL,BEGIN ;Пересылка в область экрана
LD DE,SCREEN ;и запуск программы ожидания
LD BC,END-BEGIN ;[A] прерываний
LDIR
CALL SCREEN
DI
HALT
BEGIN DISP SCREEN
MARKA DEC A
HALT
JP NZ,MARKA ;JP не случайно
RET
ENT
END
Текущее смещение компиляции (shift=org-disp) узнают так:
a ORG 0
ENT
shift ORG a+shift
DISP a
INCLUDE "drv:имя файла"[,страница]
Включение в компилируемый файл дополнительного исходника,
лежащего на диске под именем "имя файла". При этом указанный
файл загружается в страницу, определенную параметром "страница"
(по умолчанию - текущая). По окончании компиляции включенного
блока компиляция продолжается со строки, следующей после данной
директивы. Файл не будет загружаться с диска, если
он уже находится в необходимой странице. "" - любой файл.
Пример:
LDIR
INCLUDE "TOKENIZE",1
OTDR
INCLUDE "ALASM2"
HALT
Сначала будет откомпилирован LDIR, потом текст "TOKENIZE.H",
загруженный в страницу 1, потом OTDR, затем в тек.страницу
будет загружен и откомпилирован текст "ALASM2.H", после чего
с диска будет считан основной файл и компиляция продолжится
с команды HALT.
MAIN "имя файла"[,страница]
Указание основного файла компиляции. Директива MAIN должна быть
первой исполнимой директивой подчиненного файла.
Символы "." и "*" заменяйте на "?".
Пример:
MAIN "MAKE6?7",6
LDIR
После подачи команды ASSEMBLE компиляция передается
программе MAKE6*7, находящейся в странице 6,
затем находящийся в ней INCLUDE вызывает подчиненную
программу, состоящую из директивы MAIN и команды LDIR.
Во включаемых файлах MAIN игнорируется, поэтому после
ассемблирования LDIR происходит возврат назад и
продолжение компиляции.
INCBIN "дисковод:имя файла"[,длина]
Включение в компилируемую программу кодового блока с диска
размером "длина" байт или по умолчанию из данных каталога.
DUP число
Указывает начало блока, который необходимо компилировать
"число" раз подряд
EDUP
Указывает конец повторяемого блока. Возможна вложенная
конструкция.
Пример:
DUP 32
LDI
LD A,B
OR C
JR Z,$+3
LD (HL),D
EDUP
Блок между DUP и EDUP откомпилируется 32 раза
REPEAT
<тело>
UNTIL <выражение>
Компилирует <тело> до тех пор, пока <выражение> не 0
DB байт[,список байт]
Пример:
DB "У",13,10,"попа",13,10,"была",13,10,"собака",13,10
DEFB "она съела",13,10,"попа факу..."
DW слово[,список слов]
Пример:
DW ALASKA,BUFFER,12,#BD15,32767,.NUMB1
DEFW 12345,34567
DS количество повторений[,список байт]
Список байт (по умолчанию нулевой байт) копируется в текущий
адрес компиляции. Число циклов = "количество повторений".
Пример:
DS 10,#E5
DEFS 32,#ED,#B0
DD [#]hexбайт[hexбайты]
Плотное хранение шестнадцатиричных чисел.
DD 1D4FDC42
эквивалентно
DB #1D,#4F,#DC,#42
+<нечто>
ОПАСНО ПРИ ДЛИНЕ СТРОКИ=#2C..#2F!
При загрузке текста с диска он сканируется на наличие в нем "+"
в начале каждой строки. В процессе компиляции все встреченные
"+" будут заменены на "-", что заставит компилятор пропускать
строки при следующем ассемблировании.
Пример:
LD HL,#DB00
+SAVEADR
+ ORG #DB00,7
+ INCBIN "sts70r"
+ ORG SAVEADR
JP (HL)
отладчик загрузится только при первой компиляции
метка=выражение
(Пере)присвоение значения метке.
Пример:
SHLUSS=0
ORG 32768
DUP #4000
DEFW SHLUSS
SHLUSS=SHLUSS+1
EDUP
память выше #8000 заполнится увеличивающимися словами 0..16384
IF <выражение>
<тело1>
ELSE
<тело2>
ENDIF
Если <выражение>=0, то компилируется <тело1>, иначе <тело2>
IFN <выражение>
<тело1>
ELSE
<тело2>
ENDIF
То же, но наоборот.
Допускается вложенность условной компиляции (до 254)
LOCAL
<тело>
ENDL
Объявление локальных меток. Все метки в пределах этой
операторной скобки будут невидимы вне ее (кроме меток,
начинающихся с символа @ - это глобальные метки). Допускаются и
вложенные конструкции.
Если в пределах локальных меток определять метки с именами,
к которым обращались раньше этой конструкции, то такие метки
будут глобальными:
LD HL,LABEL
LOCAL
LABEL
ENDL
MACRO <имя_макросa>
<тело>
ENDM
Определение макроса.
В теле макроса:
\0..\9 - параметр номер 0,1,2,..9
\C - текущий символ
\N - перейти на следующий символ (ничего не выдает)
\R - установить указатель на начало строки параметров
\S<char> - строка от текущего символа до символа <char>
\P - сдвинуть строку параметров на один параметр. Выдает
съеденный параметр. \R возвращает, как было.
<имя_макроса> [параметр1[,параметр2[...]]]
Использовать макрос.
Разделитель параметров - запятая
(заключенная в кавычки не считается).
MACRO DOWN
LOCAL
INC \C
LD A,\C
AND 7
JR NZ,LABEL
LD A,\N\C
SUB #E0
LD \C,A
JR NC,LABEL
LD A,\R\C
SUB 8
LD \C,A
LABEL
ENDL
ENDM
Теперь мы можем процедуры DOWN HL и DOWN DE компилировать по их
именам - DOWN HL, DOWN DE и т.д.
Пользуясь условиями типа
IF " "-" \1"
или
IF ?macroname\1-2
можмо определять макросы с переменным числом параметров.
DISPLAY [/L,]["any text",][[/D|/H|/A,][/T,]выражение]
Отображает текст или числа в процессе ассемблирования. Ключи
/D, /H и /A устанавливают формат вывода для одного следующего
числа. Далее числа выводятся в текущей системе счисления. /D -
десятичное число, /H - шестнадцатиричное, /A - в обеих
системах.
/L указывает, что необходимо печатать не с новой строки.
/T выводит сначала само выражение, потом его значение.
Примеры:
DISPLAY "code size: ",/D,end-start
DISPLAY /A,"abc+xyz=",abc+xyz
DISPLAY "simple"," text"
DISPLAY "Баран жевал "
DISPLAY /L,"травКу"
DISPLAY /A,/T,abc+xyz
эквивалентно
DISPLAY /A,"abc+xyz",abc+xyz
Половинки IX и IY: HX,HY,LX,LY.
Можно: INF;SLI;OUT (C),0;EXA;EXD;JZ;JNZ;JC;JNC
LD L,0,H,'fnt и т.п.
5. Выражения
Считаются слева направо без приоритетов (кроме скобок).
a+b
a-b
a*b
a/b
a&b - AND
a|b - OR
a!b - XOR
a>b - циклич.сдвиг слова a на b бит вправо
a<b - влево
() - скобки (сначала рассчитываются они)
{a} - слово, находящееся в памяти по адресу a
a~ - инвертирование текущего результата
?метка - возвращ. 0, если метка определена, #ffff, если не
определена, и 1, если не определена, но к ней было уже
обращение. Если метка - название макроса, то 2.
'a - ст.байт a
.a - мл.байт a
%const двоичная
$$ - текущая страница кода
Как узнать страничку компилируемого исходника
и адрес компилируемой строки (из макроса нельзя)
ORG #C0E1,2
DISPLAY {$}-#C040,"/pg",.{$+2}
Как определить, не из mkace ли мы запущены
ORG #FF32,2
IF {4>4+{$}}-#BF43
make ;mkace!
ENDIF
Во всех операциях, кроме + и -, не допускается использование
меток, которые будут определены ниже (из-за однопроходности)
:( А почему у меня такая фигня :(
При использовании INCLUDE вылетает сообщение об ошибке
---------- Capture Output ----------
"C:\ASM\sjasm.exe" My.asm
SjASMPlus Z80 Cross-Assembler v1.05 RC3
Terminated with exit code -1073741819
Да что-то конкретно запарил он с ERROR: Forward reference.
Может есть какой ключик чтобы он во время второго прохода делал подобное?
Он что - вообще не умеет ссылаться "вперед"?
Можно с ума сойти.. невозможно ссылаться на метки инклуженных файловКод:len equ start2-end2
org 30000
start2
ret
end2
ругается "Bytes lost" если пытаешься использовать -1 (в качестве 65535 или 255, в засивимости от регистра). Никуда ничего не потеряно же!
Матерится "Label has different value in pass 2"...
Гы.. автор совсем чтоли не знает как асм должен работать? Лэбелы должны все использоваться из 2го прохода, а на 1м проходе лишь вычисляться, и запоминаться места, где они используются, чтобы во втором проходе их вставить уже скорректированными.
Короче то ли я туплю, то ли у меня 90% всех исходников вообще не компилятся в sjasm.
Писаны на TASM. И z80asm их компилит влёт.