Команды вызова процедуры или возврата из процедуры.

На языке Ассемблер команда вызова процедуры имеет следующий вид:

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,т.к.:

Команды вызова процедуры или возврата из процедуры. - 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 стр.

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