Перейти к содержанию
СофтФорум - всё о компьютерах и не только

а как нащет ассемблера


Рекомендуемые сообщения

Asakra так вот блин чето у меня глюки на сайте ну ладно вобщем разберусь а про 16 систему вот читай :Для написания программ на Ассемблере, необходимо разобраться с шестнадцатеричной системой счисления. Ничего сложного в ней нет. Мы используем в жизни десятичную систему. Уверен, что вы все ее знаете, поэтому я постараюсь объяснить шестнадцатеричную систему, проводя аналогию с десятичной.

Итак, в десятичной системе если мы к какому-нибудь числу справа добавим нуль, то это число увеличится в 10 раз. Например:

1 х 10 = 10

10 х 10 = 100

100 х 10 = 1000

и т.д…

В этой системе мы используем цифры от 0 до 9, т.е. десять разных цифр (собственно, поэтому она и называется десятичная).

В шестнадцатеричной системе мы используем, соответственно, шестнадцать "цифр". Я специально написал слово "цифр" в кавычках, т.к. в ней используются не только цифры. Да и в самом деле, как так? Объясняю: от 0 до 9 мы считаем так же, как и в десятичной, а вот дальше будет так: A, B, C, D, E, F. Число F, как не трудно посчитать, будет равно 15 в десятичной системе

Т.о., если мы к какому-нибудь числу в шестнадцатеричной системе добавим справа нуль, то это число увеличится в 16 раз.

Пример 1:

1 х 16 = 10

10 х 16 = 100

100 х 16 = 1000

и т.д…

Вы смогли отличить в Примере 1 шестнадцатеричные числа от десятичных? А из этого ряда: 10, 12, 45, 64, 12, 8, 19? Это могут быть как шестнадцатеричные, так и десятичные. Для того чтобы не было путаницы, и компьютер смог бы однозначно отличить одни числа от других, в Ассемблере принято после шестнадцатеричного числа ставить символ h или H (H - это сокращение от англ. hexadecimal (шестнадцатеричное). Для краткости его иногда называют просто Hex). А после десятичного ничего не ставить. Т.к. числа от 0 до 9 в обеих системах имеют одинаковые значения, то числа, записанные как 5 и 5h одно и тоже.

Т.о. Пример 1 (см. выше) правильнее будет записать так:

1 х 16 = 10h

10h x 16 = 100h

100h x 16 = 1000h

Либо так:

1h x 10h = 10h

10h x 10h = 100h

100h x 10h = 1000h

Для чего нужна шестнадцатеричная система, и в каких случаях она применяется - мы рассмотрим в последующих главах. А в данный момент для нашего примера программы, который будет рассмотрен ниже, нам необходимо знать о существовании шестнадцатеричных чисел.

Итак, подведем итог. Шестнадцатеричная система счисления состоит из 10 цифр (от 0 до 9) и 6 букв латинского алфавита (A, B, C, D, E, F). Если к какому-нибудь числу в шестнадцатеричной системе добавим справа нуль, то это число увеличится в 16 раз. Очень важно уяснить данную тему, так как мы будем постоянно использовать ее при написании программ.

Теперь немного о том, как я буду строить примеры на Ассемблере. Не совсем удобно приводить их сплошным текстом в книге, поэтому сперва будет идти сам код программы с пронумерованными строками, а сразу же после него - объяснения и примечания.

Примерно так:

(01) mov ah,9

(02) mov al,8

(15) mov dl,5Ah

Номера строк ставятся только в наших примерах! При наборе программ в текстовом редакторе номера ставить НЕ нужно!

Объяснения:

В строке (01) мы делаем то-то, а в строке (15) то-то.

Огромная просьба. Не смотря на то, что в приложении к книге имеются набранные и готовые для ассемблирования программы, я рекомендую все-таки первое время набирать их вам самостоятельно. Это ускорит запоминание операторов, а также облегчит привыкание к самому языку.

И еще. Строчные и ПРОПИСНЫЕ символы в Ассемблере не различаются. Записи вида:

mov ah,9

и

MOV AH,9

Ассемблером воспринимаются одинаково. Можно, конечно, заставить Ассемблер различать строчные и ПРОПИСНЫЕ символы, но мы пока этого делать не будем. Для удобства чтения программы лучше всего операторы печатать строчными буквами, а названия подпрограмм и меток начинать с прописной.

Короче если непонятно пиши обясню:angry:))

Ссылка на комментарий
Поделиться на другие сайты

killshareware

хехе ;) кажется мне, что это взято из ассемблер шаг за щагом :). я раньше читал это но не понял, теперь видимо поумнел :)

[Q]Можно, конечно, заставить Ассемблер различать строчные и ПРОПИСНЫЕ символы, но мы пока этого делать не будем[/Q]

а что нам это даст?

Ссылка на комментарий
Поделиться на другие сайты

Asakra тяк ну наконецтоки ты чето написал короче ты прав нащет того что статья содранна просто я подумал что так будет лучше в том смысле что я буду пока на первых порах тебе давать инфу а если что то не понятно то буду обьяснять вот но содранно это с другого места :(

[Q]Можно, конечно, заставить Ассемблер различать строчные и ПРОПИСНЫЕ символы, но мы пока этого делать не будем[/Q]

а что нам это даст?

в досе впринцепи не чего а вот под вынью скорей не даст а если мы неправильно напишем функцию или опперанд или т.п. то масм при компилирование вывалит нам ошибку он не поймет

так ну если сдесь тебе все понятно то я вывалю те еще кусок статьи

вывалить?????

кстате кто то обещался помочь с сайтом так вот у меня продлемка точней вопросик в чем у тя сделанна анимация на твоем сайте

Ссылка на комментарий
Поделиться на другие сайты

вывалить?????

да :(

кстате кто то обещался помочь с сайтом так вот у меня продлемка точней вопросик в чем у тя сделанна анимация на твоем сайте

flash

Ссылка на комментарий
Поделиться на другие сайты

Asakra

[Q]Можно, конечно, заставить Ассемблер различать строчные и ПРОПИСНЫЕ символы, но мы пока этого делать не будем[/Q]

а что нам это даст?

Это две такие секты есть: сишников и паскалистов. Сишники в погоне за краткостью программ постановили, что все буквы разные, то есть а и А - два разных имени. Паскалисты же гнались за понятностью и постановили, что a и A (или, другой пример, АВ, Ав, аВ, ав) - одно и то же, чтобы не затруднять программистов запоминанием величины букв. Программисты на других языках не остались в стороне от спора, все вместе исписали много бумаги, и теперь во всех компиляторах можно поставить галочку для лучшего соответствия вкусам программиста - считать ли а и А за два разных имени или за одно.

На самом деле обе идеи возникли еще до языков C и Pascal, но шум по этому поводу устроили сторонники этих языков, поэтому эти стили называют стилем Си и стилем Паскаля.

Изменено пользователем Тролль
Ссылка на комментарий
Поделиться на другие сайты

Тролль ну нащет галочки не согласен на самом деле в самой проге надо указывать буть чуствительным к регистру или нет :rolleyes:))

Asakra маленький вопросик как в асп линуксе 9 драва на модем поставить кстате линукс просто супер

так вот выкладываю

(01) CSEG segment

(02) org 100h

(03)

(04) Begin:

(05)

(06) mov ah,9

(07) mov dx,offset Message

(08) int 21h

(09)

(10) int 20h

(11)

(12) Message db 'Hello, world!$'

(13) CSEG ends

(14) end Begin

Еще раз подчеркну: номера строк в скобках ставить не нужно! На сайте

http://asm.kalashnikoff.ru/dos находится архив всех файлов-приложений в DOS-формате, которые я рекомендую вам загрузить, если таковых у вас нет. В скобках указывается имя файла из архива файлов-приложений (в данном случае - /001/PROG01.ASM, где 001 - каталог, PROG01.ASM - имя ассемблерного файла в DOS-формате).

Прежде, чем пытаться ассемблировать, прочтите данную главу до конца!

Для того, чтобы объяснить все операторы данного примера, нам потребуется несколько глав. Поэтому описание некоторых команд мы просто опустим на данном этапе. Просто считайте, что так должно быть. В самое ближайшее время мы рассмотрим эти операторы подробно. Итак, строки с номерами (01), (02) и (13) вы просто игнорируете.

Строки (03), (05), (09) и (11) остаются пустыми. Это делается для наглядности. Ассемблер их будет просто опускать.

Теперь перейдем к рассмотрению остальных операторов. Со строки (04) начинается код программы. Это метка, указывающая Ассемблеру на начало кода. В строке (14) стоят операторы end Begin (Begin - от англ. - начало; end -конец). Это конец программы. Вообще вместо слова Begin можно было бы использовать что-нибудь другое. Например, Start:. В таком случае, нам пришлось бы и завершать программу End Start (14).

Строки (06) - (08) выводят на экран сообщение "Hello, world!". Здесь придется вкратце рассказать о регистрах процессора (более подробно эту тему мы рассмотрим в последующих главах).

Регистр процессора - это специально отведенная память для хранения какого-нибудь числа.

Например:

Если мы хотим сложить два числа, то в математике запишем так:

A=5

B=8

C=A+B.

A, B и C - это своего рода регистры (если говорить о компьютере), в которых могут храниться некоторые данные. А=5 следует читать как: "Присваиваем А число 5".

Для присвоения регистру какого-нибудь значения, в Ассемблере существует оператор mov (от англ. move - в данном случае - загрузить). Строку (06) следует читать так: "Загружаем в регистр AH число 9" (проще говоря, присваиваем AH число 9). Ниже рассмотрим, зачем это надо.

В строке (07) загружаем в регистр DX адрес сообщения для вывода (в данном примере это будет строка "Hello, world!$").

Далее, в строке (08), вызываем прерывание MS-DOS, которое и выведет нашу строку на экран. Прерывания будут подробно рассматриваться в последующих главах. Здесь я скажу несколько слов.

Прерывание MS-DOS - это своего рода подпрограмма (часть MS-DOS), которая находится постоянно в памяти и может вызываться в любое время из любой программы.

Рассмотрим вышесказанное на примере (мелким шрифтом выделим примечания):

___________

Программа (алгоритм) сложения двух чисел

НачалоПрограммы

A=5 в переменную A заносим значение 5

B=8 в переменную B значение 8

ВызовПодпрограммы Сложение

теперь С равно 13

A=10 то же самое, только другие числа

B=25

ВызовПодпрограммы Сложение

теперь С равно 35

КонецПрограммы выходим из программы

Подпрограмма Сложение

C=A+B

ВозвратИзПодпрограммы возвращаемся в то место, откуда вызывали

КонецПодпрограммы

___________

В данном примере мы дважды вызвали подпрограмму Сложение, которая сложила два числа, переданные ей в переменных A и B. Результат помещается в переменную С. Когда вызывается подпрограмма, компьютер запоминает с какого места она была вызвана, а затем, когда закончила работу подпрограмма, компьютер возвращается в то место, откуда она вызывалась. Т.о., можно вызывать подпрограммы неопределенное количество раз с любого места.

При выполнении строки (08) программы на Ассемблере мы вызываем подпрограмму (в данном случае - это называется прерывание), которая выводит на экран строку. Для этого мы, собственно, и помещаем необходимые значения в регистры. Всю работу (вывод строки, перемещение курсора) берет на себя подпрограмма. Строку (08) следует читать так: вызываем двадцать первое прерывание (int - от англ. interrupt - прерывание). Обратите внимание, что после числа 21 стоит буква h. Это, как мы уже знаем, шестнадцатеричное число (33 в десятичной системе). Конечно, нам ничего не мешает заменить строку int 21h на int 33. Программа будет работать корректно. Просто в Ассемблере принято указывать номера прерываний в шестнадцатеричной системе.

В строке (10) мы, как вы уже догадались, вызываем прерывание 20h. Для вызова данного прерывания не нужно указывать какие-либо значения в регистрах. Оно выполняет только одну задачу: выход из программы (выход в DOS). В результате выполнения прерывания 20h, программа вернется туда, откуда ее запускали (загружали, вызывали). Например, в Norton Commander или DOS Navigator.

Строка (12) содержит сообщение для вывода. Первое слово (message - сообщение) - название сообщения. Оно может быть любым (например, mess или string и пр.). Обратите внимание на строку (07), в которой мы загружаем в регистр DX адрес нашего сообщения.

Можно создать еще одну строку, которую назовем Mess2. Затем, начиная со строки (09) вставим следующие команды:

(09) mov ah,9

(10) mov dx,offset Mess2

(11) int 21h

(12) int 20h

(13) Message db 'Hello, world!$'

(14) Mess2 db 'Это Я!$'

(15) CSEG ends

(16) end Begin

Надеюсь, вы догадались, что произойдет.

Обратите внимание на последний символ в строках Message и Mess2 - $. Он указывает на конец строки. Если мы его уберем, то 21h прерывание продолжит вывод до тех пор, пока не встретится где-нибудь в памяти символ $. На экране, помимо нашей строки в самом начале, мы увидим "мусор" (разные символы, которых в строке вовсе нет).

Теперь ассемблируйте программу. Как это сделать - написано в Приложении № 01. Заметьте, что мы создаем пока только *.com-файлы, а не *.exe! Для того чтобы получить *.com-файл, нужно указать определенные параметры ассемблеру (MASM / TASM) в командной строке. Пример получения com-файла Macro Assembler’ом версии 6.11 и результат выполнения программы приведен ниже на Рис.01_01.

При возникновении ошибок в процессе ассемблирования - обращайтесь к Приложению № 02, где рассматриваются типичные ошибки при ассемблировании программ.

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...