1. Заголовок или название темы должно быть информативным
2. Все тексты программ должны помещаться в теги [CODE=asm] [/CODE]
3. Прежде чем задавать вопрос, см. "FAQ",если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно, такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Ассемблера. Исключение только с согласия модератора.
5. НЕ используйте форум для личного общения! Все, что не относиться к обсуждению темы - на PM!
6. Проверяйте программы перед тем, как выложить их на форум!!
| BlackShadow |
7.05.2004 16:01
Сообщение
#1
|
|
Гость |
От нечего делать опишу основные моменты при программировании на встроенном ассемблере в Паскале.
Есть 2 способа задействовать эту замечательную возможность:
Ну, на самом деле применений целое море, о чём можно убедиться полистав этот раздел форума. Рассмотрим вопрос адресации в реальном режиме (именно он используется "by def" при компиляции в BP). Адрес состоит из двух частей: сегментной части и смещения. Обе части являются 16-ти разрядными двоичными числами или, что на практике и применяется, 4-х разрядными шестнадцатиричными. Рассмотрим пример и на нём разберёмся, что и какая часть значит: Пусть сегментная часть (далее Seg) = $ABCD, а смещение (далее Ofs) = $1234. Это означает, что эта пара Seg:Ofs хранит следующий адрес Seg * $10 + Ofs = $ABCD * $10 + $1234 = $ABCD0 + $1234 = $ACF04. Как легко заметить, пользуясь таким способом адресации мы можем указать адрес любой ячейки памяти в пределах первого мегабайта ($00000..$FFFFF) и даже чуть-чуть больше, но это не имеет значения, т.к. процессор в реальном режиме даёт доступ только к первому МБ. Возникает естественный вопрос: а зачем нужен этот геморрой, и почему нельзя просто указывать полный адрес? А вот нельзя. А потому, что процессор при работе с памятью опирается на информацию, которая хранится в его регистрах, а т.к. мы используем 16-битный вариант команд, то, соответственно, в 1 регистр более 16 бит (4 16-ричные цифры) не впихнуть. Поэтому и приходится использовать 2 регистра: сегментный и какой-нибудь, который можно использовать для адресации. Рассмотрим предназначение регистров процессора:
Теперь давайте рассмотри примитивный набор команд. mov dst, src копирует значение src в dst. Есть один важный момент: командой mov нельзя скопировать значение одной переменной в другую за один приём. Примеры: (Показать/Скрыть)
inc p увеличивает на 1 значение операнда. После компиляции эта команда занимает меньше места чем команда прибавления единицы. Примеры: (Показать/Скрыть)
dec p соответственно уменьшает операнд на 1. add dst, src прибавляет к src значение dst. Результат сохраняется в dst, так что просто число там написать нельзя. Примеры: (Показать/Скрыть)
sub dst, src вычитает из dst значение src. mul n умножает значение регистра AL (AX) на n. Если n размером в 1 байт, то происходит следующее: AX = AL * n, если же слово, то старшие 16 бит произведения сохраняются в DX, а младшие в AX, т. е., умножив AX=$1010 на $100 получим в DX $0010 и в AX $1000. Примеры: (Показать/Скрыть)
div n делит значение в AX (DX:AX, как в команде mul) на n. При этом остаток сохраняется в AH (DX), а целая часть от деления в AL (AX). Например: (Показать/Скрыть)
cmp a, b - сравнивает значения a и b и устанавливает флаги процессора в соответствии с результатом сравнения. Например: (Показать/Скрыть)
jmp L - команда безусловного перехода на метку L. То что в BP называется GoTo. Например: (Показать/Скрыть)
j<cc> L - серия команд условного перехода. Тут <cc> определяет условия перехода:
Например: (Показать/Скрыть)
Рассмотрим ещё команду loop L она сравнивает CX с 0 и, если он отличен, то уменьшает его на 1 и делает переход на указанную метку. Пример: (Показать/Скрыть)
Теперь для закрепления сказанного рассмотрим реализацию вычисления факториала:
Стоит объяснить ещё и то, как возвращаются значения функций. Это всё зависит от типа результата: Byte, Char - через AL Word, Integer - через AX LongInt - старшая часть в DX, а младшие 16 бит в AX. Pointer - сегментная часть в DX, смещение - AX. Остальные типы возвращаются более извращённым способом... Так же отмечу, что убрав проверку на <0 можно переписать эту функцию так: Function Factorial(n: Integer): Integer; Assembler; Правда проблема переполнения остаётся, но зато покажите мне компилятор, который стандартное Function Factorial(n: Integer): Integer; скомпилирует вот так вот красиво... |
![]() ![]() |
| Dark |
10.05.2004 3:24
Сообщение
#2
|
![]() Знаток ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 408 Пол: Мужской Репутация: 3 |
Флаги В архитектуре компьютера существует флаговый регистр FLAGS, занимающий 16 бит (начиная с процессора 80386 этот регистр расширен до 32-х битного EFLAGS, но его младшее слово по прежнему называется FLAGS для совместимости с 8086/80286), и содержащий значения флагов, которые управляются различными командами для индикации состояния операции. Флаги содержат значение до тех пор, пока другая операция не поменяет их состояния. Всего из 16 бит используются 9. Номер бита: 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00 ОПИСАНИЕ(Справа налево) :
Содержимое расширенного регистра EFLAGS:
Дополнительные флаги:
Сообщение отредактировано: volvo - 19.01.2009 14:44 -------------------- - Где я?
- Во тьме. - В какой тьме? - Во тьме твоего мозга. |
BlackShadow Азы (встроенный ассемблер) 7.05.2004 16:01
Dark
ОШИБКА!!! :rolleyes:
LOOP СНАЧАЛА ... 10.05.2004 2:27
Dark Вот некоторый пример :)
uses crt;
(*
Программа п... 10.05.2004 13:10
BlackShadow Продолжим ликбез :)
[center]Стек
Сейчас я вот во... 10.05.2004 14:05
BlackShadow Голова болит, работа достала... Ну как тут не вспо... 11.05.2004 14:32
BlackShadow [color=red]Битовые операции
Начнём с логико-арифм... 12.05.2004 15:00
FreeMan я читаю. кстати, вот пара процедур включения, выкл... 12.05.2004 20:15
BlackShadow По документации, ты конечно прав...
Но вот только ... 12.05.2004 21:16
BlackShadow Теория это хорошо, но перейдём к
[center]Практика ... 13.05.2004 15:25
Dark Хых, как всегда ты на шаг впереди ;) конеечно, у т... 13.05.2004 18:45
BlackShadow Я бы посоветовал
Procedure Input(Var s:String);Ass... 13.05.2004 20:30
BlackShadow [b]Текстовый ввод/вывод
Всем прекрасно известны т... 17.05.2004 15:56
Dark Продолжим
Секция функций для работы с файлами и ... 8.10.2004 22:57
Dark Оки, тады продолжаем
[b]Работа с диском (DOS функ... 16.10.2004 1:36
Гость 1.1.Написать и отладить программу на языке П... 7.12.2014 13:35![]() ![]() |
|
Текстовая версия | 1.11.2025 22:48 |