Команды вызова процедуры или возврата из процедуры.
На языке Ассемблер команда вызова процедуры имеет следующий вид:
Callop1.
Еслиop1 = i16, r16, m16, то это близкий вызов процедуры.
Команда вызова процедур по-другому, называется командами перехода с запомненными точками возврата [4].
Битовые операции в языке Ассемблер.
Логические операции с битами-OR, XOR,NOT, AND.Эти команды работают с приемником и источником, исключение команды ‘NOT’. Каждый бит в приемнике сравнивается с тем же самым битом в источнике, и в зависимости от команды 0 и 1 помещается в бит приемник:
Команда | AND | OR | XOR | NOT | ||||||||||
Бит источника | ||||||||||||||
Бит приемника | X | X | ||||||||||||
Бит результата |
Для выполнения операции логического И предназначена команда AND.У этой команды 2 операнда, результат помещается на место первого операнда. Часто эта команда используется для обнуления определённых битов числа. При этом второй операнд называют маской. Обнуляются те биты операнда, которые в маске равны 0, значения остальных битов сохраняются.
ЛогическоеИЛИ вычисляется с помощью команды OR. У этой команды тоже 2 операнда и результат помещается на место первого. Часто эта команда используется для установки в 1 определённых битов числа. Если бит маски равен 1, то бит результата будет равен 1, остальные биты сохранят свои значения.
Обозначение операции в комментарии к первой строке используется во многих языках высокого уровня. Часто XOR используется для обнуления регистров. Если операнды равны, то результат операции равен 0. Такой способ обнуления работает быстрее и, в отличии от команды MOV,не содержит непосредственного операнда, поэтому команда получается короче (и не содержит нулевых байтов).
Каждый бит операнда меняет своё значение на противоположное (0- 1, 1- 0).
Операция выполняется с помощью команды NOT. У этой команды только один операнд. Результат помещается на место операнда. Эта команда не изменяет значение флагов.
Ещё одна команда сравнения- TEST.Команда TEST выполняет операцию AND с двумя операндами и в зависимости от результата устанавливает или сбрасывает соответствующие флаги. Результат не сохраняется. TESTиспользуется для проверки бит, например в регистре:
Testeax, 100b
jnzсмещение
Команда jnzвыполнит переход, если в регистреeaxтретий бит справа- установлен. Очень часто команду testиспользуют для проверки, равен ли регистр нулю:
Testecx, ecx
jzсмещение
Команда jzвыполнит переход, если ecx=0 [8].
Примеры использования битовых операций.
Примеры с использованием команды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 стр.