Основные сведения о языке Ассемблер

Введение

Сегодня персональные ЭВМ находят все более широкое распространение и применение. Эффективность их использования в значительной степени определяется наличием развитого программного обеспечения, посредством которого осуществляется проблемная ориентация единых аппаратных средств машины. Для создания программного продукта разработаны различные системы и языки программирования.

В тех, случаях, когда необходимо построить наиболее компактный машинный код и создать самые быстродействующие программы, используют машинно-ориентированные языки [1].

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

Виды ассемблера:

Ассемблерыдля DOS

НаиболееизвестнымиассемблерамидляоперационнойсистемыDOSявлялисьBorlandTurboAssembler (TASM), MicrosoftMacroAssembler (MASM) иWatcomAssembler (WASM). Такжевсвоёвремябылпопуляренпростойассемблер A86.

Windows.

ПрипоявленииоперационнойсистемыWindowsпоявилосьрасширение TASM, именуемое TASM 5+ (неофициальныйпакет, созданныйчеловекомсником !tE), позволившеесоздаватьпрограммыдлявыполнениявсредеWindows. Последняяизвестнаяверсия TASM — 5.3, поддерживающаяинструкции MMX, наданныймоментвключенав Turbo C++ Explorer. Ноофициальноразвитиепрограммыполностьюостановлено. ПоследнееразвитиекомпиляторполучилблагодарясовременнойсредеразработкиTASM Visual. Среданеофициальная, носеёпомощьюработаскомпилятороммногократноупрощается [2].

Microsoftподдерживаетсвойпродуктподназванием MicrosoftMacroAssembler. Онапродолжаетразвиватьсяипосейдень, последниеверсиивключенывнаборы DDK. Новерсияпрограммы, направленнаянасозданиепрограммдля DOS, неразвивается. Крометого, СтивенХатчессонсоздалпакетдляпрограммированияна MASM подназванием «MASM32».

GNU иLinux.

Проблема: Наименьшая единица информации, которая обычно используется в различных языках программирования, - байт. Но при теоретических изысканиях и в практической деятельности (например, в сетевых технологиях, цифровой технике) возникают ситуации, требующие работы с информацией на более низком уровне – на уровне битов. Для этого существуют специальные битовые операции, которые доступны в языках низкого уровня (ассемблерах) [1].

Цель работы: изучить основные понятия языка Ассемблер, теорию и применение битовых операций на этом языке.

Задачи работы:

1. Изучить основные сведения о языке Ассемблер (структура и компоненты программы на Ассемблере, формат команд, представление данных в памяти, режимы адресации и др.);

2. Изучить виды битовых операций, формат и логику работы логических команд Ассемблера;

3. Рассмотреть примеры использования логических команд в Ассемблере;

4. Решить индивидуальную задачу на применение логических битовых операций в Ассемблере;

5. Сформулировать вывод о проделанной работе.

Теоретический раздел

Предложения.

Программа на ассемблере состоит из предложений, каждое из которых записывается на отдельной строке, <предложение>… Переносить предложение на следующую строку или записывать два предложения на одной строке нельзя.

Директивы определения данных.

Для того чтобы в программе на ASM зарезервировать ячейки памяти под переменные и константы, необходимо воспользоваться директивами определения данных- с названиями db- (описывает данные размером в байт),

dw-(размером в слово), dd- (размером в двойное слово).

В простейшем случае в директивеdb,dwилиdd описывается одна константа, которой дается имя для последующих ссылок на неё. По этой директиве ассемблер формирует машинное представление константы и записывает в очередную ячейку памяти. Адрес этой ячейки становиться значением имени: все вхождения имени в программу ассемблер будет заменять на этот адрес.

Имена, указанные в директивах db, dwиdd, называются именами переменных (в отличии от меток- имени команд).

В ASM числа записываются в нормальном виде в системах счисления с основанием 10, 16, 8 или 2.

Десятичные числа записываются как обычно, за шестнадцатиричным числом ставится буква (если число начинается с “цифры” А, В, …, F, то вначале обязателен 0), за восьмиричным числом- буква qили о, за двоичным числом- буква b.

Константы-символы описываются в директиве двояка: указывается либо код символа (целое от 0 до 255), либо сам символ в кавычках (одинарных или двойных); в последнем случае ассемблер сам заменит символ на его код.

Примеры использования битовых операций.

Примеры с использованием командыOR:

Установить 3 и 0 биты в регистре al, остальные биты не изменять.

oral, 00001001b

Допустим:

al, 11000011, тогда 3 и 0 биты будут равняться 1,т.к.:

Основные сведения о языке Ассемблер - student2.ru

Таким образом, операция OR служит для установки бита в 1.

Пример с использованием командыAND:

Сбросить 4 и 6 биты в регистре al, остальные биты не изменять.

andal, 10101111

Допустим:

al, 1101000, тогда 4 и 6 биты сбросятся до 1, т.к.:

Основные сведения о языке Ассемблер - student2.ru

Таким образом, операция ANDслужит для сбрасывания каких-то определённых битов.

Пример с использованием команды NOT:

Посчитать число единицы в регистре al, рассматривая байт, как набор бит.

movcx, b :число сдвига

xorbl, bl :обнуление Bl

LL: shlal, 1 :сдвиг влево на один разряд

jncNO :переход, если нет переноса

incbl :иначе увеличитьBl

NO: loopLL :возврат, если сх Основные сведения о языке Ассемблер - student2.ru 0

Получается, что команда NOTсчитает число единиц в регистре, при этом рассматривая байт, как набор битов.

Пример с использованием команды XOR:

Инвертировать 2 и 4 биты в регистре al, остальные биты не изменять.

xoral, 00010100b

Допустим al, 00001111

Основные сведения о языке Ассемблер - student2.ru

Из этого следует, что команда XORинвертирует биты в регистре.

Пример с использованием команды TEST:

Дан массив из 10 байт. Все байты имеют нулевые старшие биты. Необходимо каждый байт содержащий единицу в нулевом бите дополнить до чётного числа единиц установкой седьмого бита.

data segment

NB db 04h, 07h, 14h, 23h, 04h, 38h, 3Fh, 2Ah0Dh, 34h

data ends

code segment

assumecs: code, ds:data

start: mov ax, data

movds, ax ;загрузитьсегментныйадресданных

leabx, NB ;bx-текущий адрес массиваNB

movcx, 10 ;cx-счетчик числа интерации

BEG: moval, [bx] ;считать очередной байт массива

testal, 1b ;установлен ли бит 0?

jzBITOCLR ;нет, бит 0 сброшен

;бит 0 установлен

testal, ffh ;четное число единиц?

jpOK ;да, больше ничего делать не надо

oral, 80h ;нечетное дополнить до четного

jmpshortOK ;бит 0 сброшен

BITOCLR: testal, ffh ;четноечислоединиц?

jnpOK ;нет, больше делать не нужно

oral, 80h ;нечетное дополнить до четного

OK: mov [bx], al ;записать измененный байт массива

loopBEG

QUIT: movax, 4c00h ;код завершения 0

int 21h ;выход в DOS

codeends

endstart

Практический раздел

2.1 Индивидуальное задание практической части

Задача:

Дан массив из 8 байт. Рассматривая его как массив логических значений Основные сведения о языке Ассемблер - student2.ru (trueесть не нулевые биты в байте, falseвсе биты нулевые), вычислить логическую формулу:

Основные сведения о языке Ассемблер - student2.ru

Решение:

include io.asm

data segment

masdb 8 dup (?) ;исходный массив

xdb 8 dup (?)

fdw ?

data ends

code segment

assumeCS:code,ds:data

start: movax,data

movds,ax ;загрузить сегментный адрес данных

;ввод элементов массива

movcx,8

movbx, offsetmas ;перенос первых байтов массива в ячейку bx

m4: inintax ;ввод знака целого числа

mov [bx],al ;переходим в [bx],адрес которого лежит в al

incbx ;увеличение значенияbx в регистре

loopm4 ;возвращение на метку m4

mov cx,8

movbx,offsetmas ;вbxзаписывается адрес начала mas

xorsi,si ; обнулениеsi

m3: moval,[bx] ;вal записывается начала массива [bx]

cmpal,0 ;сравнение al с 0

jem1 ;прыжок на метку m1

movx[si],1 ;записывание 1 в x[si]

jmpm2 ;выполнение условного перехода на метку m2

m1: movx[si],0 ;записывание 0 в x[si]

; outintx[si],2 ;вывод целого числа

m2: incbx ;увеличение значенияbxв регистре

incsi ;увеличение значения siв регистре

loopm3 ;возвращение к метке m3

xoral,al ;обнулениеal

moval,x[7] ;занесли в al значение х[7]

andal,x[6] ;х[7]and x[6]

andal,x[1] ;х[6] and [1]

movah,x[6] ;занесли в аh значение х[6]

andah,x[4] ;х[6] and х[4]

andah,x[2] ;х[4] and х[2]

andah,x[1] ;х[2] and х[1]

andah,x[0] ;х[1] and х[0]

movbl,x[7] ;занесли в bl значение х[7]

andbl,x[6] ;х[7] and х[6]

andbl,x[3] ;х[6] and х[3]

andbl,x[1] ;х[3] and х[1]

oral,ah

oral,bl

cbw ;расширение байта до ворда

movf,ax ;переходим с ах на f

outintf ;вывод результата f

finish ;завершение программы

;стандартное завершение программы

;mov ah,4ch

;int 21h

code ends

endstart

Основные сведения о языке Ассемблер - student2.ru

Заключение

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

Повторили виды битовых операций,логику и формат логических команд Ассемблера.

Рассмотрели примеры использования логических команд в Ассемблере.

Сделали решение и описание задачи.Предоставили скрин индивидуального задания с применением логических битовых операций в Ассемблере.

Все поставленные задачи решены.

Списоклитературы

1. http://progopedia.ru/language/assembler/

2. Аблязов Р.- Программирование на Ассемблере на платформе х86,х64, 2011 г.

3. Столяров А.- Программирование на языке Ассемблера Nasm для OCUnix, 2011 г.

4. Владислав Пирогов.- Ассемблер и дизассемблирование. 2006 г.,464 стр.

5. Калашников О.А.- Ассемблер? Это просто!, 2008 г.

6. https://bobych.ru/lection/informatika/glava2.html

7. Вострикова З.П.- Программирование на языке ассемблера ЕС ЭВМ. М.: Наука, 1985г.

8. Юров В., Хорошенко С., Assembler: учебный курс. 2000 г., 672 стр.

Введение

Сегодня персональные ЭВМ находят все более широкое распространение и применение. Эффективность их использования в значительной степени определяется наличием развитого программного обеспечения, посредством которого осуществляется проблемная ориентация единых аппаратных средств машины. Для создания программного продукта разработаны различные системы и языки программирования.

В тех, случаях, когда необходимо построить наиболее компактный машинный код и создать самые быстродействующие программы, используют машинно-ориентированные языки [1].

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

Виды ассемблера:

Ассемблерыдля DOS

НаиболееизвестнымиассемблерамидляоперационнойсистемыDOSявлялисьBorlandTurboAssembler (TASM), MicrosoftMacroAssembler (MASM) иWatcomAssembler (WASM). Такжевсвоёвремябылпопуляренпростойассемблер A86.

Windows.

ПрипоявленииоперационнойсистемыWindowsпоявилосьрасширение TASM, именуемое TASM 5+ (неофициальныйпакет, созданныйчеловекомсником !tE), позволившеесоздаватьпрограммыдлявыполнениявсредеWindows. Последняяизвестнаяверсия TASM — 5.3, поддерживающаяинструкции MMX, наданныймоментвключенав Turbo C++ Explorer. Ноофициальноразвитиепрограммыполностьюостановлено. ПоследнееразвитиекомпиляторполучилблагодарясовременнойсредеразработкиTASM Visual. Среданеофициальная, носеёпомощьюработаскомпилятороммногократноупрощается [2].

Microsoftподдерживаетсвойпродуктподназванием MicrosoftMacroAssembler. Онапродолжаетразвиватьсяипосейдень, последниеверсиивключенывнаборы DDK. Новерсияпрограммы, направленнаянасозданиепрограммдля DOS, неразвивается. Крометого, СтивенХатчессонсоздалпакетдляпрограммированияна MASM подназванием «MASM32».

GNU иLinux.

Проблема: Наименьшая единица информации, которая обычно используется в различных языках программирования, - байт. Но при теоретических изысканиях и в практической деятельности (например, в сетевых технологиях, цифровой технике) возникают ситуации, требующие работы с информацией на более низком уровне – на уровне битов. Для этого существуют специальные битовые операции, которые доступны в языках низкого уровня (ассемблерах) [1].

Цель работы: изучить основные понятия языка Ассемблер, теорию и применение битовых операций на этом языке.

Задачи работы:

1. Изучить основные сведения о языке Ассемблер (структура и компоненты программы на Ассемблере, формат команд, представление данных в памяти, режимы адресации и др.);

2. Изучить виды битовых операций, формат и логику работы логических команд Ассемблера;

3. Рассмотреть примеры использования логических команд в Ассемблере;

4. Решить индивидуальную задачу на применение логических битовых операций в Ассемблере;

5. Сформулировать вывод о проделанной работе.

Теоретический раздел

Основные сведения о языке Ассемблер

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

Кроме того, языка ассемблера позволяет использовать символические метки вместо адресов ячеек памяти, которые при ассемблировании заменяются на вычисляемые ассемблером или компоновщиком абсолютные или относительные адреса, а так же так называемые директивы (команды ассемблера, не переводимые в машинные команды процессора, а выполняемые самим ассемблером). Также язык ассемблера обеспечивает базовые программные абстракции: связывание частей программы и данных через метки с символьными именами и директивы.

Директивы ассемблера позволяют включать в программу блоки данных (описанные явно или считанные из файла); повторить определённый фрагмент указанное число раз; компилировать фрагмент по условию; задавать адрес исполнения фрагмента, менять значения меток в процессе компиляции; использовать макроопределения с параметрами и др.

Данный тип языков получил свое название от названия транслятора (компилятора) с этих языков — ассемблера (англ. assembler — сборщик).

Использование термина «язык ассемблера» также может вызвать ошибочное мнение о существовании единого языка низкого уровня, или хотя бы стандарта на такие языки [7].

Типичными командами языка ассемблера являются (большинство примеров даны для Intel-синтаксиса архитектуры x86):

Команды пересылки данных (mov, lea и т. д.)

Арифметичекие команды (add, sub, imul и т. д.)

Логические и побитовые операции (or, and, xor, shr и т. д.)

Команды управления ходом выполнения программы (jmp, loop, ret и т. д.)

Команды вызова прерываний (иногда относят к командам управления): int, into.

Команды ввода/вывода в порты (in, out).

Для микроконтроллеров и микрокомпьютеров характерны также команды, выполняющие проверку и переход по условию, например:

cbne — перейти, если не равно;

dbnz — декрементировать, и если результат ненулевой, то перейти;

cfsneq — сравнить, и если не равно, пропустить следующую команду.

Достоинства:

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

-объём кода. Сокращение объёма кода также не редко повышает скорость выполнения программы.

-язык ассемблера используется для создания “прошивок”BIOS.

-обеспечение максимального использования специфических возможностей конкретной платформы, что также позволяет создавать более эффективные программы, в том числе менее ресурсоёмкие.

Недостатки:

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

-отсутствует переносимость программ на компьютеры с другой архитектурой и системой команд [8].

С использованием программирования на языке ассемблера производятся:

· Оптимизация критичных к скорости участков программ в программах на языках высокого уровня, таких как C++ или Pascal. Это особенно актуально для игровых приставок, имеющих фиксированную производительность, и для мультимедийных кодеков, которые стремятся делать менее ресурсоёмкими и более быстрыми.

· Создание операционных систем (ОС) или их компонентов. В настоящее время подавляющее большинство ОС пишут на более высокоуровневых языках (в основном на Си — языке высокого уровня, который специально был создан для написания одной из первых версий UNIX). Аппаратно зависимые участки кода, такие как загрузчик ОС, уровень абстрагирования от аппаратного обеспечения (hardwareabstractionlayer) и ядро, часто пишутся на языке ассемблера. Фактически, ассемблерного кода в ядрах Windows или Linux совсем немного, поскольку авторы стремятся обеспечить переносимость и надёжность, но, тем не менее, он там присутствует. Некоторые любительские ОС, такие как MenuetOS и KolibriOS, целиком написаны на языке ассемблера. При этом MenuetOS и KolibriOS помещаются на дискету и содержат графический многооконный интерфейс.

· Программирование микроконтроллеров (МК) и других встраиваемых процессоров. По мнению профессора Таненбаума, развитие МК повторяет историческое развитие компьютеров новейшего времени[9]. Сейчас (2013 г.) для программирования МК весьма часто применяют язык ассемблера (хотя и в этой области широкое распространение получают языки вроде Си). В МК приходится перемещать отдельные байты и биты между различными ячейками памяти. Программирование МК весьма важно, так как, по мнению Таненбаума, в автомобиле и квартире современного цивилизованного человека в среднем содержится 50 микроконтроллеров[10].

· Создание драйверов. Драйверы (или их некоторые программные модули) программируют на языке ассемблера. Хотя в настоящее время драйверы также стремятся писать на языках высокого уровня (на высокоуровневом языке много проще написать надёжный драйвер) в связи с повышенными требованиями к надёжности и достаточной производительностью современных процессоров (быстродействие обеспечивает временно́е согласование процессов в устройстве и процессоре) и достаточным совершенством компиляторов с языков высокого уровня (отсутствие ненужных пересылок данных в сгенерированном коде), подавляющая часть современных драйверов пишется на языке ассемблера. Надёжность для драйверов играет особую роль, поскольку в Windows NT и UNIX (в том числе в Linux) драйверы работают в режиме ядра системы. Одна тонкая ошибка в драйвере может привести к краху всей системы.

· Создание антивирусов и других защитных программ.

· Написание трансляторов языков программирования.

Наши рекомендации