так может довести это похожее до ума? имхо цифры менее удобны в качестве мнемонических обозначений...Сообщение от 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 -> *
Последний раз редактировалось Aprisobal; 23.12.2005 в 01:40.
ATW4GS / BIN2SNA / SquareMania <ТИ-3> / Ужасм+
ATM-Turbo 512 v4.50, Commodore 64G + TAC-2, Retro-Bit Super Retro TRIO
"+++, --, _b" - тоже не плохо. хотя это опять только _метки_. использование скобок позволяет подчеркнуть структуру программы и вложенность блоков. кроме того обозначение '}' для конца блока/цикла лучше отражает смысл чем +.Сообщение от aprisobal
опять же, это имхо, настаивать не буду, да и не имею права...
Вышла новая версия SjASMPlus - 1.05 RC3. Исправлен небольшой глюк с ENDM, добавлена поддержка скобок {..} и записи любых команд через запятую(INC A,B,C,A). Качать - [...вырезано...]
Spectre, скобками {..} берётся 1 байт из памяти или 2 байта?
Последний раз редактировалось Aprisobal; 07.12.2005 в 23:37.
ATW4GS / BIN2SNA / SquareMania <ТИ-3> / Ужасм+
ATM-Turbo 512 v4.50, Commodore 64G + TAC-2, Retro-Bit Super Retro TRIO
Слово.Сообщение от 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 их компилит влёт.
Последний раз редактировалось Dexus; 06.08.2005 в 13:41.
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)