Просмотр полной версии : Азбука ассемблера
А почему бы и нет? Действительно, информация представленная в учебниках и самоучителях 90-х годов не отвечает требованиям современных программистов (не ищущих трудных путей). Не все привыкли преодолевать трудности ). Посему, предлагаю здесь выкладывать самые распространенные способы решения различных задач (или сами задачки) различного уровня сложности. Просто для тренировки остальных ) Мне кажется, для начинающих будет полезно. По крайней мере будет выше шанс того, что они все-таки останутся на платформе ZX...
А теперь у меня вопрос. Организовать последовательный выбор из DEFB не представляет сложности:
............ LD.... DE,IMG ; грузим в DE адрес начала блока
............ INC.. DE...... ; Следующий элемент блока
............ ....... .......... ; Код программы
............ RET.. ...........; Конец основного блока
IMG....... DEFB #12,#FF; Блок однобайтных данных
А как организовать последовательную выборку значений из DEFW? Увеличение DE в данном случае приводит лишь к увеличению первого загруженного значения (адреса), а не выбору следующего элемента блока. Как решить? Это пока единственный вопрос, который я никак не могу решить. В абсолютном большинстве учебников используется исключительно DEFB, а DEFW если и применяется, то крайне ограничено. К слову, учебник "Как написать игру на ассемблере", на мой взгляд, несколько.... э-э-э... однобокий, что ли. Обо всем по чуть-чуть и ни о чем достаточно.
Самый яркий пример из опыта - определение пользовательских функций. Благо, в каком-то описании, все-таки, вычитал, что для возвращения из функции нужно указывать команду RET... Правда вспомнилось это только после двух дней экспериментов, но за эти два дня я на экране эмудятора такого насмотрелся - не дай бог....
P.S. Прошу прощения за словоблудие, но процесс освоения ассемблера идет со скрипом и сопровождается горами исписанной бумаги ))) На ней просто удобно блок-схему программы рисовать... А потом добавляются забытые, или новые элементы, ну и т.д. )))
SAM style
02.11.2012, 10:52
Элемент DEFW занимает 2 байта - сначала младший, потом старший. Запись DEFW #FF00 эквивалентна записи DEFB #00,#FF. Значения надо вытаскивать уже в регистровые пары, т.к. разрядность 16 бит:
LD HL,TABLE
LD E,(HL)
INC HL
LD D,(HL) ; в DE - значение #FF00
INC HL ; HL передвинулся на второе слово (#AABB)
...
RET
TABLE: DEFW #FF00,#AABB,#C123
predatoralpha
02.11.2012, 12:07
Почитай вот это.
http://zxpress.ru/book.php?id=18
Очень толково написано.
Почитай вот это.
http://zxpress.ru/book.php?id=18
Очень толково написано.
Моя библия:v2_dizzy_heart:
как организовать последовательную выборку значений из DEFW
А вообще тру-способ что-то вроде такого:
Код:
LD (STK+1),SP
LD SP,TABLE
POP DE ; в DE - значение #FF00
...
POP DE ; в DE - значение #AABB
...
POP DE ; в DE - значение #C123
; и так далее
...
STK:
LD SP,0
RET
TABLE: DEFW #FF00,#AABB,#C123
Только нужно либо запрещать при этом прерывания, либо следить чтоб они не пришли.
Самое простое - в начале поставить DI
А вообще тру-способ что-то вроде такого:
Спасибо ) Пока что, самый понятный для меня ответ ) Что касается указанной книги, то там упоминание про DEFW есть... А если конкретно, то только упоминается, что в DEFW определяются двухбайтовые значения.... И на этом практически все. Последующее описание крутится вокруг DEFB и DEFM, оставляя DEFW "за бортом"... Лично для меня книга посредственна. Изучать её саму по себе довольно неудобно. Нужно обложиться как минимум 3 книгами. Собственно приведенная, элементарная графика (с выводом на экран работаем) и справочник команд ассемблера... И если в книжном варианте как-то терпимо такое проворачивать, то в электронном виде постоянно тыкать Alt+Tab.... Увольте...
P.S. Все вышесказанное сугубо имхо.
И если в книжном варианте как-то терпимо такое проворачивать, то в электронном виде постоянно тыкать Alt+Tab.... Увольте...
P.S. Все вышесказанное сугубо имхо.
Можно распечатать, она не такая большая;)
http://vtrdos.ru/book/PROGRASM.ZIP
Это у меня тоже есть. Почти вся была законспектирована... Так лучше усваивается.
Так ведь усваивается вообще, по идее, на конкретных задачах. Т.е. если есть задача, она решается и по ходу набирается опыт, а если задачи нет и изучение чисто академическое, то изучение идет дооолго и мууууторно.
Последующее описание крутится вокруг DEFB и DEFM, оставляя DEFW "за бортом"...
А откуда вообще такой упор на DEFW ?
По сути это просто вид представления данных - в данном случае - машинное слово (DEFine Word).
Те-же данные можно задать и байтами (DEFine Byte)
Да хоть и DEFM.
Компу пофик что ты там на DEFинил - это ведь инструкция для компилятора (в каком виде данные ложить), а процессор всё равно воспринимает всю кухню как толпы нулей и единиц...
А откуда вообще такой упор на DEFW ?
По сути это просто вид представления данных - в данном случае - машинное слово (DEFine Word).
Те-же данные можно задать и байтами (DEFine Byte)
Да хоть и DEFM.
Компу пофик что ты там на DEFинил - это ведь инструкция для компилятора (в каком виде данные ложить), а процессор всё равно воспринимает всю кухню как толпы нулей и единиц...
Вот я про то и говорю: читать до просветления :D
Да просто удобно... Так, скажем в DEFB удобно забивать 8-байтные шаблоны, для последующего вывода на экран. DEFM, это вывод строк. А DEFW - двухбайтное слово. В моем случае адрес. Я, конечно, рад за тех, кто легко может всю программу набить на DEFB или DEFM... А я хочу чтобы мне мой код понятен был. Сказано, DEFW для двухбайтных слов, значит так и есть. Т.е. смотрю на свои записки 3-недельной давности, так я даже без вспоминания того, зачем писалась программа, легко вижу где какой блок данных... А если все будет состоять из DEFB/DEFM... Да там сам черт ногу сломит и никакие комментарии не спасут...
Имхо, что написано, то и должно быть. Ну за исключением случаев, когда критична скорость выполнения программы. Мало ли, может кому-то придется еще мою программу читать (маловероятно конечно, но все-таки)...
Это как в библиотеке, можно книги все вперемешку хранить, но, как-то предпочитают сортировать: журналы отдельно, книги отдельно, многотомные сборники отдельно...
Во всем должен быть порядок.
Zidane, это всё известно и понятно :)
Я имел в виду как так случилось что ты понимаешь как общатся с DEFB, и не догадался как быть с DEFW ?
Потому и спросил - почему так? (может какой-то частный, особый случай, что не подходят очевидные методы - ну например два INC adr)
Вот я например сейчас мучаюсь с 3D (raycasting) - а там нужно задавать три байта на каждый луч. Вот и ломаю голову как будет лучше - один DB + один DW или просто три DB.
А возможно - два DW...
Такой вот частный случай и хз как лучше это всё хранить/выбирать:)
А если все будет состоять из DEFB/DEFM... Да там сам черт ногу сломит и никакие комментарии не спасут...
Речь не об этом.
Речь о том, что в памяти что DEFB, что DEFW, что DEFM хранятся одинаково. И поэтому непонятно, почему вы ждете, что для работы с DEFB предусмотрены одни команды, а с DEFW другие. Все эти типы существуют только на уровне ассемблера, процессор про них и знать не знает. Да, через DEFW можно определять адреса. Но это лишь свойство, а не предназначение.
Адрес - это всего лишь 2 байта, которые хранятся в памяти задом наперед. Читаются из памяти точно так же, как и одиночные байты,
LD HL, IMG
LD E, (HL)
E потому что, напоминаю, адрес лежит задом наперед. Грузим старший
INC HL
LD D, (HL)
Все, адрес в DE. Берем значение, которое лежит по этому адресу, и делаем с ним что хотим:
LD A, (DE)
Если все сделали, переходим к следующему элементу (младшему байту следующего адреса) - INC HL, JP ....
Ну и все, получили тот же код, который SAM style написал еще во втором сообщении.
Читать память сразу словами через переустановку стека и POP - это красиво, но это хак. Хотя асм, конечно, такой язык, что там практически все - хак :)
Однозначно. В общем, пишу разного рода программки на бейсике и перевожу в ассемблер. Со временем сейчас несколько напряг, но полчасика в день выковыриваю... Суть вопроса вот в чем. Написал на бейсике махонькую демку (даже и на махонькую с трудом тянет, меня больше волновала реализация алгоритма) но все же. Файлик прилагается. Основная проблема в том, что нужно генерить рандомные числа в заданном диапазоне (строки 220-290). Вот тут я собственно и встал... Инфу раскопал и вроде даже работает... Но все же хотел бы узнать, кто как генерит эти числа для личных нужд? ) Или все пользуются одним приемом? В общем, собираю полезные идеи, если кому не жаль поделиться.
NovaStorm
10.11.2012, 20:07
Зависит от того, насколько быстро и насколько случайно тебе это надо. На спеке источниками энтропии могут быть либо R, либо число прерываний до запуска программы, где-то бейсик его считает. А потом уже каким-либо ГСЧ.
SAM style
10.11.2012, 20:11
Ну, как-то так:
RANDOM push hl
ADDR ld hl,0
inc l
ld (ADDR+1),hl
ld a,r
xor (hl)
pop hl
ret
START ...
call RANDOM
and 15 ;тут в А будет число от 0 до 15
...
call RANDOM
and 31 ;а тут - от 0 до 31
...Способов несколько. Основной - брать R и XOR-AND-OR-ADD-SUB-ИТД его со всем, что попадется под руку.
Тема о генераторах случайных чисел с примерами: http://zx.pk.ru/showthread.php?t=13188
shuran33
11.06.2013, 18:33
Подскажите пожалуйста, как исправить ошибку?
Делаю, чтобы был вывод по одной букве. Но никак не выходит.
LD D,10
L1 LD HL,(NUM)
LD A,(HL)
RST #10
INC HL
LD (NUM),HL
DEC D
JR NZ,L1
RET
NUM DEFB $+1
TEXT DEFB "prosto text"
Что то с NUM не так...
И еще вопрос как в Alasm сделать, чтобы текст(строка TEXT) располагался с определенного адреса, например с 50000?
DEFB резервирует один байт. когда та берёшь число оттуда захватывается первая буква текста. скорее надо defw (два байта) или defb 1,0
И еще вопрос как в Alasm сделать, чтобы текст(строка TEXT) располагался с определенного адреса, например с 50000?
написать перед ним org 50000
shuran33
11.06.2013, 18:48
Да, спасибо. С defw все получилось.
Hacker VBI
11.06.2013, 18:56
shuran33, у нас же есть только процессор, поле последовательно расположенных байтов памяти и порты.
а остальное - это абстракция, построенная на этих трёх столпах ;)
Powered by vBulletin® Version 4.2.5 Copyright © 2026 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot