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

18) Повторяющиеся блоки и макросы. Локальные метки.

Чтобы не запис. в программе часто повт. фрагмент, рекоменд. хранить ее в именованном МАКРОСЕ и потом исп. его имя всякий раз, когда этот код потр. Макроопределение – это группа команд, которая должна вставляться в текст вместо макрокоманды. Макрокоманда – задает имя макроопределения, которое определяет, какую группу команд, в какое место программы необх. поместить и какие аргументы должны исп-ся вместо параметров. Макрорасширение –группа команд, реал. макроопределение, в котором парам. заменены на адреса конкр. переменных. Макроопр. имеет сл. вид: <имя макроса> MACRO <формальные параметры через запятую>---<тело макроса>---ENDM. Макрокоманда запис сл. обр. <имя макро>/<параметр>,…/. При написании макроопределений необходимо, чтобы метки в программе были уникальными. Для этой цели в языке имеется директива – local. LOCAL d1,d2,…; формальные параметры. Директива LOCAL позволяет объявить метку локальной и сгенерировать для нее уникальное имя вида: ??0000, ??0001 и т.д.

;20) Умножение 32-битовых чисел (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

ten dw 10

num1 dd 548000

num2 dd 52000

rezult dq 0

.stack 100h

22) Стандартные директивы определения сегментов.

Директива SEGMENT используется для описания сегментов. Формат директивы: <имя>SEGMENT[параметры]…<имя> ENDS. Данная директива может содержать три типа параметров: выравнивание; объединение; класс. 1. Выравнивание – определяет границу памяти для стартового адреса сегмента: byte – на границе байта word – на гр. слово dword – на гр. двойное слово para – на гр. параграфа page – 256 байт. По умолчанию используется знач. PARA. 2. Объединение – показывает как должны объединятся сегменты с одинаковыми именами в разных модулях. Возможны сл. типы объединений: COMMON – для сегментов с одним и тем же именем и классом и имеющим параметр объединения common устанавл. один общий адрес загрузки(размер сегмента – максимальный из совм. сегментов.) Это позволяет: - уменьшить объем памяти исп. программой; - к одним и тем же данным можно обращаться с исп. разных имен; - к одним и тем же данным получ. разл. способ доступа(byte, word, dword и т.п.), PUBLIC – сегменты с одним и тем же именем, классов и топом объединения public загружаются в смежные блоки памяти (объед.) и размер всего сегмента равен сумме размеров объединенных сегментов. Требуется когда несколько разр. создают общий сегмент данных к которому необходим доступ из различных программных модулей., MEMORY – тип объединение подобный PUBLIC, STACK – все сегменты с одинаковым именем, классом и типом объединения stack компонуются в один общий сегмент, аналогично сегментам с типом public(различие в том что сегмент с типом компоновки stack и классом ‘stack’ считается сегментом стека. , AT-выражение – выражение определяет сегментный адрес памяти, т.е. задает номер параграфа с которого в памяти будет распологаться данный сегмент., PRIVATE – данный сегмент не будет объединяться с другими. Этот тип компановки модулей устанавливается по умолчанию.

;19) Транспонирование битовой матрицы (1)

printMATRIX macro MATRIX:REQ

LOCAL prints

LOCAL print

mov cx, 8

mov si, 0

prints:

xor ax, ax

mov bl, MATRIX[si]

push cx

mov cx, 8

print:

xor dx, dx

rol bl, 1

rcl dl, 1

add dl, 30h

mov ah, 02h

int 21h

loop print

pop cx

inc si

mov dx, offset refresh

mov ah, 09h

int 21h

loop prints

mov dx, offset refresh

mov ah, 09h

int 21h

endm

.MODEL small

.STACK 100h

.DATA

masSRC db 00110001b

db 00110010b

db 00110011b

db 00110100b

db 00110101b

db 00110110b

db 00110111b

db 00111000b

masDST db 8 dup(0)

;20) Умножение 32-битовых чисел (2)

.code

.386

main:

mov ax, @data

mov ds, ax

mov eax, num1

mul num2

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

mov dword ptr rezult[4], edx

printDQ rezult

mov ah, 4ch

int 21h

end main

;28) Вывести все ASCII символы

.model small

.stack 100h

.data

.code

main:

mov ax, @data

mov ds, ax

xor ax, ax

mov cx, 256

print:

mov ah, 02h

int 29h

inc al

loop print

mov ah, 4ch

int 21h

end main

end

;19) Транспонирование битовой матрицы (2)

refresh db 0Dh, 0Ah, '$'

.CODE

main:

mov ax, @data

mov ds, ax

printMATRIX masSRC

mov cx, 8

lea di, masDST

cycle1:

push cx

mov cx, 8

lea si, masSRC

cycle2:

rol masSRC[si], 1

rcl al, 1

inc si

loop cycle2

pop cx

mov [di], al

inc di

loop cycle1

printMATRIX masDST

mov ah, 4ch

int 21h

end main

;21) Поиск MIN и MAX значения в неупорядоченном списке

printnum macro num:REQ

LOCAL process

LOCAL print

mov ax, num

mov cx, 0

process:

inc cx

xor dx, dx

mov bx, 10

div bx

push dx

cmp ax, 0  jne process

print: pop dx

add dx, 30h  mov ah, 02h

int 21h

loop print

mov dl, ' '

mov ah, 02h

int 21h

endm

.MODEL small

.STACK 100h

.DATA

spisok dw 1000, 100, 4, 3000, 4566

len equ $ - spisok

MAX dw 0

MIN dw 0

.CODE

main: mov ax, @data

mov ds, ax

xor bx, bx

mov bx, spisok

mov MAX, bx

mov MIN, bx

mov cx, 5

dec cx

mov si, 2

seek: mov bx, spisok+si

cmp bx, MAX

jl tryMIN

mov MAX, bx

jmp continue

tryMIN:

cmp bx, MIN

jg continue

mov MIN, bx

continue:

add si, 2

loop seek

printnum MAX

printnum MIN

mov ah, 4ch

int 21h

end main

;24) Преобразовать строку в число - вернуть в регистр

.model small

.stack 100h

.data

string db "12345", '$'

len dw 5

ten dw 10

rezult dw 0

.code

main:

mov ax, @data

mov ds, ax

mov si, 0

mov cx, len

trans:

xor bx, bx

mov bl, string+si

sub bl, 30h

mov ax, rezult

mul ten

mov rezult, ax

add rezult, bx

inc si

loop trans

mov ah, 4ch

int 21h

end main

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