Основные сведения о языке Ассемблер
Введение
Сегодня персональные ЭВМ находят все более широкое распространение и применение. Эффективность их использования в значительной степени определяется наличием развитого программного обеспечения, посредством которого осуществляется проблемная ориентация единых аппаратных средств машины. Для создания программного продукта разработаны различные системы и языки программирования.
В тех, случаях, когда необходимо построить наиболее компактный машинный код и создать самые быстродействующие программы, используют машинно-ориентированные языки [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,т.к.:
Таким образом, операция OR служит для установки бита в 1.
Пример с использованием командыAND:
Сбросить 4 и 6 биты в регистре al, остальные биты не изменять.
andal, 10101111
Допустим:
al, 1101000, тогда 4 и 6 биты сбросятся до 1, т.к.:
Таким образом, операция ANDслужит для сбрасывания каких-то определённых битов.
Пример с использованием команды NOT:
Посчитать число единицы в регистре al, рассматривая байт, как набор бит.
movcx, b :число сдвига
xorbl, bl :обнуление Bl
LL: shlal, 1 :сдвиг влево на один разряд
jncNO :переход, если нет переноса
incbl :иначе увеличитьBl
NO: loopLL :возврат, если сх 0
Получается, что команда NOTсчитает число единиц в регистре, при этом рассматривая байт, как набор битов.
Пример с использованием команды XOR:
Инвертировать 2 и 4 биты в регистре al, остальные биты не изменять.
xoral, 00010100b
Допустим al, 00001111
Из этого следует, что команда 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 байт. Рассматривая его как массив логических значений (trueесть не нулевые биты в байте, falseвсе биты нулевые), вычислить логическую формулу:
Решение:
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
Заключение
В ходе выполнения курсовой работы были изучены основные сведения о языке Ассемблер.В основные сведения входилиструктура и компоненты программы на Ассемблере, формат команд, представление данных в памяти,режим адресации,рассмотрение программ-дизассемблер и др.
Повторили виды битовых операций,логику и формат логических команд Ассемблера.
Рассмотрели примеры использования логических команд в Ассемблере.
Сделали решение и описание задачи.Предоставили скрин индивидуального задания с применением логических битовых операций в Ассемблере.
Все поставленные задачи решены.
Списоклитературы
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) драйверы работают в режиме ядра системы. Одна тонкая ошибка в драйвере может привести к краху всей системы.
· Создание антивирусов и других защитных программ.
· Написание трансляторов языков программирования.