Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шпоры по ассемблеру.doc
Скачиваний:
65
Добавлен:
15.09.2014
Размер:
220.67 Кб
Скачать

10 – структура EXE-программы

.model small --- модель памяти, используемая для ЕХЕ;

.stack 100h; сегмент стека размером в 256 байт;

.code;кодовый сегмент;

start: mov ax,data--

mov ds,ax ; помещается в DS адрес сегмента данных;

mov ax,4C00h--

Int 21h ; функция dos "завершить программу";

.data - сегмент данных;

end start - конец модуля

12) Логические и сдвиговые операции.

Логичиские операции: AND - Команда выполняет побитовое «логическое И» над приемником (регистр или переменная) и источником (число, регистр или переменная; источник и приемник не могут быть переменными одновременно) и помещает результат в приемник. OR - Выполняет побитовое «логическое ИЛИ» над приемником (регистр или переменная) и источником (число, регистр или переменная; источник и приемник не могут быть переменными одновременно) и помещает результат в приемник. XOR - Выполняет побитовое «логическое исключающее ИЛИ» над приемником (регистр или переменная) и источником (число, регистр или переменная; источник и приемник не могут быть переменными одновременно) и помещает результат в приемник.NOT - Каждый бит приемника (регистр или переменная), равный нулю, устанавливается в 1, и каждый бит, равный 1, сбрасывается в 0. Сдвиговые операции SAR - Арифметический сдвиг вправо. SAL - Арифметический сдвиг влево. SHR - Логический сдвиг вправо. SHL - Логический сдвиг влево. ROR - Циклический сдвиг вправо. ROL - Циклический сдвиг влево. RCR - Циклический сдвиг вправо через флаг переноса. RCL - Циклический сдвиг влево через флаг переноса.

;15) Переписать массив данных из сегмента данных в кодовый сегмент

.186

.model small

.data

x db "hello world"

y db "y"

endd db ?

.stack 100h

.code

main:

mov ax, @data

mov ds, ax

mov si, 0

mov ax, cs

mov es, ax

mov di, offset copy_here

mov cx, offset endd

repz

movsb

mov cx, offset endd

mov si, 0

print:

mov dl, cs:[copy_here+si]

mov ah, 02h

int 21h

inc si

loop print

mov ah, 4Ch

int 21h

copy_here db ?

end main

;11) Сложение/вычитание длинных чисел (1)

printDQ macro num:REQ

LOCAL process

LOCAL print

LOCAL diving

pusha

mov cx, 0

process:

xor dx,dx

mov si, 8

diving:

sub si, 2

mov ax, word ptr num[si]

mov bx, 10

div bx

mov word ptr num[si], ax

cmp si, 0

jne diving

push dx

inc cx

cmp dword ptr num, 0

jne process

cmp dword ptr num[4], 0

jne process

print:

pop dx

add dx, 30h

mov ah, 02h

int 21h

loop print

mov dl, ' '

mov ah, 02h

int 21h

popa

endm

.model small

.data

13) Организация циклов, условных и безусловных переходов

Безусл. переходы в асм. осущ. с помощью команды jmp mylabel; mylabel - метка куда перейдет. jmp - исп-ет 16 битное смещение элементов если задать. mov bx,wl;---jmp bx- преходпо содержимому регистра bx. jmp [wl] - аналогично. jmp можно использовать для перехода в другой сегмент но нужно делать перегрузку cs:ip. Сущ сл. переходы:1)типа short (короткий переход) — если адрес перехода находится в пределах от -127 до +128 байт от команды JMP; 2) типа near (ближний переход) — если адрес перехода находится в том же сегменте памяти, что и команда JMP; 3)типа far (дальний переход) — если адрес перехода находится в другом сегменте. Дальний переход может выполняться и в тот же самый сегмент, если в сегментной части операнда указано число, совпадающее с текущим значением CS; 4)переход с переключением задачи — передача управления другой задаче в многозадачной среде.

Условные переходы осущ. переход по заданному адресу в случае выполнения условия, задаваемого состоянием флагов процессора.

Код команды

Реальное условие

Условие для CMP

JA JNBE

CF = 0 и ZF = 0

если выше если не ниже или равно

JAE JNB JNC

CF = 0

если выше или равно если не ниже если нет переноса

JB JNAE JC

CF = 1

если ниже если не выше или равно если перенос

JBE JNA

CF = 1 и ZF = 1

если ниже или равно если не выше

JE JZ

ZF = 1

если равно если ноль

JG JNLE

ZF = 0 и SF = OF

если больше если не меньше или равно

JGE JNL

SF = OF

если больше или равно если не меньше

JL JNGE

SF <> OF

если меньше если не больше или равно

JLE JNG

ZF = 1 и SF <> OF

если меньше или равно если не больше

JNE JNZ

ZF = 0

если не равно если не ноль

JNO

OF = 0

если нет переполнения

JO

OF = 1

если есть переполнение

JNP JPO

PF = 0

если нет четности если нечетное

JP JPE

PF = 1

если есть четность если четное

JNS

SF = 0

если нет знака

JS

SF = 1

если есть знак

16) Префиксы повторения.

Префикс REP – при указании сл. за ним команда выполн. столько раз, сколько указано в регистре CX|ECX, уменьш. его знач. на 1. Отл. от Loop – действие распрю только на одну команду. REPZ(REPE) – аналогичен REP только прекращает цикл при ZF=0. REPNZ(REPNE) – аналогично REP – прекращает цикл при ZF=1.

;11) Сложение/вычитание длинных чисел (2)

ten dw 10

num1 dq 548000

num2 dq 52000

rezult dq 0

.stack 100h

.code

.386

main:

mov ax, @data

mov ds, ax

mov ecx, dword ptr num2

mov edx, dword ptr num2[4] ; Пара dx:cx

; Сложение

mov eax, dword ptr num1

mov ebx, dword ptr num1[4] ; Пара bx:ax

add eax, ecx

adc ebx, edx

mov dword ptr rezult, eax ; Результат

mov dword ptr rezult[4], ebx

printDQ rezult

; Вычитание

mov eax, dword ptr num1

mov ebx, dword ptr num1[4] ; Пара bx:ax

sub eax,ecx

sbb ebx,edx

mov dword ptr rezult, eax ; Результат

mov dword ptr rezult[4], ebx

printDQ rezult

mov ah, 4ch

int 21h

end main

;14)Поиск символа в строке

.186

cseg segment

assume cs:cseg

org 100h

main:

MAX equ 100

msgYES db "YES", '$'

msgNO db "NO", '$'

char db ?

string db MAX+1 dup(?)

mov si, 0

getstr:

mov ah, 01h

int 21h

cmp al, 0Dh

je exit_getstr

mov string[si], al

inc si

jmp getstr

exit_getstr:

mov string[si], '$'

mov ah, 01h

int 21h

mov char, al

mov cx, si

mov si, 0

seek:

mov al, string[si]

cmp al, char

je YES

inc si

loop seek

mov dx, offset msgNO

mov ah, 09h

int 21h

ret

YES:

mov dx, offset msgYES

mov ah, 09h

int 21h

ret

cseg ends

end main

17) Подпрограммы. Передача параметров. Ближние и дальние процедуры.

Подпрограммы на asm выз-ется командой call при этом выполн. сл. действия:

-1-в стеке сохр. адрес сл. после call команды (для мал. моделей только регистр IP, большие – CS:IP).

-2-В регистр CS:IP для больших моделей или IP загр. адрес точки входа в подпр.

-3- посл. командой подпрогр. должна быть команда ret она загр. из стека адрес сл. после call команды.

my_proc PROC – имя процедуры---

my_proc ENDP.

Для передачи параметров исп. 2 способа:

- через регистр;

- через стек;

Также можно передавать копию аргумента или адрес аргумента.

Команда CALL имеет 4 модификации:

- вызов прямой ближний(в пределах текущего программного сегмента – near ptr):call near ptr proc1;

- вызов косвенный ближний(word ptr): mov bx,offset proc1---call [bx];

- прямой дальний вызов(вызов процедуры, расположенной в другом сегменте кода – far ptr): call far ptr proc1;

- вызов косвенный дальний(dword ptr): adr dd proc1---call DS:adr(или call dword ptr adr).

Соседние файлы в предмете Конструирование программ и языки программирования