
лабораторная работа / лабораторные работы по ASSAMBLER / LABA PO ASM
.DOC
Днепропетровский Национальный Университет
Радиофизический факультет
Отчет к лабораторной работе №2
по курсу «Программирование на языке ассемблер»
Выполнил ст. гр. РС-05
Паляруш Александр
Г.Днепропетровск
2006 г.
Теоретические сведения:
Прежде всего, отметим, что в строковых командах под "строкой" понимается не только последовательность байтов (символов), но и последовательность слов. В связи с этим каждая строковая операция представлена в ПК двумя командами: одна из них предназначена для обработки строк из байтов, а другая - для обработки строк из слов. В Языке Ассемблера мнемокоды этих команд различаются тем, что в первом случае указывается буква B (byte), а в другом - буква W (word).
Пересылка строки
Пересылка строки (MOVS, move string): MOVSB
MOVSW
Команда MOVSB пересылает байт, а команда MOVSW - слово, абсолютный адрес которого задается парой регистров DS:SI, в ячейку, абсолютный адрес которой задается парой ES:DI, после чего значения регистров SI и DI автоматически меняются так, чтобы они указывали на соседние элементы (правила изменения этих регистров такие же, как и в команде CMPS):
[DS:SI] => [ES:DI]; SI: =SI+d; DI:=DI+d
Флаги эти команды не меняют.
Команда MOVS (в любом варианте) пересылает только один элемент строки, но зато сразу настраивается на работу с соседним элементом. Поэтому осталось лишь зациклить эту команду, чтобы можно было переслать всю строку из одного места памяти в другое. Для такого зацикливания можно воспользоваться любым префиксом повторения, т. к. команда MOVS не меняет флаги и потому выход из цикла возможен только по одной причине - по CX=0, т. е. когда будут переписаны все элементы строки. Обычно перед командой MOVS указывается префикс с названием REP, т. е. просто "повторяй" без добавки "пока равно" или "пока не равно", т. к. они здесь малоосмысленны:
REP MOVSB ; повторяй пересылку (байтов) CX раз
Основное назначение команды MOVS - быстрая перепись содержимого одной области памяти в другую. Например, если в сегменте данных имеются массивы
X DW 100 DUP (?)
Y DW 100 DUP (?)
и требуется выполнить присваивание X=Y, то сделать это можно так:
CLD ;просмотр вперед
LEA SI,Y ;DS :SI=начало Y («откуда»)
PUSH DS
POP ES ;установка ES на сегмент данных
LEA DI,X ;ES:DI=начало X («куда»)
MOV CX,100 ;сколько слов переписывать
REP MOVSW
Блок-схема:
Листинг программы:
Turbo Assembler Version 2.0 03/19/06 13:40:29 Page 1
yyy.ASM
1 masm
2 0000 model small
3 0000 .const
4 = 0010 restriction=16;ограничение на число копируемых символов
5 = 0012 number=18;число копируемых символов
6
7 0000 .data
8 0000 70 72 69 76 65 74 2C+ strings db 'privet,kak dela?',0ah,0dh,'$' ;исходная строка
9 6B 61 6B 20 64 65 6C+
10 61 3F 0A 0D 24
11 0013 10*(??) 24 stringd db restriction dup (?),’$’;строка результата
12 0024 53 6F 75 72 73 65 3A+ sourse db ‘Sourse: $’
13 20 24
14 002D 52 65 73 75 6C 74 3A+ result db ‘Result: $’
15 20 24
16
17 0000 .stack 100h
18
19 0036 .code
20 0000 B8 0000s mov ax,@data
21 0003 8E C0 mov es,ax
22 0005 8E D8 mov ds,ax
23 0007 BE 0000r mov si,offset strings
24 000A BF 0013r mov di,offset stringd
25
26 000D FC cld
27 000E B0 00 mov al,number le restriction; если number<=restriction, то al=1
28 0010 3C 00 cmp al,0
29 0012 74 08 je go ;если al=0,переход на метку go
30
31 0014 B9 0012 mov cx,number ;подготовка счётчика для копирования
32 0017 F3> A4 rep movsb ;копирование
33 0019 EB 06 90 jmp exit ;безусловный переход к выводу данных (метка exit)
34
35 001C go:
36 001C B9 0010 mov cx,restriction
37 001F F3> A4 rep movsb
38 ;----------------------------------------------------------------
39 0021 exit:
40 0021 B8 0024r mov ax,offset sourse ;вывод слова “источник”
41 0024 8B D0 mov dx,ax
42 0026 B4 09 mov ah,9
43 0028 CD 21 int 21h
44 002A B8 0000r mov ax,offset strings ;вывод исходной строки
45 002D 8B D0 mov dx,ax
46 002F B4 09 mov ah,09h
47 0031 CD 21 int 21h
48
49 0033 B8 002Dr mov ax,offset result;вывод слова “результат”
50 0036 8B D0 mov dx,ax
51 0038 B4 09 mov ah,09h
52 003A CD 21 int 21h
53
54 003C B8 0013r mov ax,offset stringd;вывод полученной строки
55 003F 8B D0 mov dx,ax
56 0041 B4 09 mov ah,09h
57 0043 CD 21 int 21h
Turbo Assembler Version 2.0 03/19/06 13:40:29 Page 2
yyy.ASM
58 ;-----------------------------------------------------------------
59 0045 B8 4C00 mov ax,4c00h; корректное завершение программы
60 0048 CD 21 int 21h
61 end
Turbo Assembler Version 2.0 03/19/06 13:40:29 Page 3
Symbol Table
Symbol Name Type Value
??DATE Text “03/19/06”
??FILENAME Text “yyy “
??TIME Text “13:40:29”
??VERSION Number 0200
@CODE Text _TEXT
@CODESIZE Text 0
@CPU Text 0101H
@CURSEG Text _TEXT
@DATA Text DGROUP
@DATASIZE Text 0
@FILENAME Text YYY
@MODEL Text 2
@WORDSIZE Text 2
EXIT Near _TEXT:0021
GO Near _TEXT:001C
NUMBER Number 0012
RESTRICTION Number 0010
RESULT Byte DGROUP:002D
SOURSE Byte DGROUP:0024
STRINGD Byte DGROUP:0013
STRINGS Byte DGROUP:0000
Groups & Segments Bit Size Align Combine Class
DGROUP Group
CONST 16 0000 Word Public DATA
STACK 16 0100 Para Stack STACK
_DATA 16 0036 Word Public DATA
_TEXT 16 004A Word Public CODE
Код программы:
asm
masm
model small
.const
restriction=16 ;ограничение на число копируемых символов
number=18 ;число копируемых символов
.data
strings db 'privet,kak dela?',0ah,0dh,'$' ;исходная строка
stringd db restriction dup (?),’$ ’;строка результата
sourse db ‘Sourse: $’
result db ‘Result: $’
.stack 100h
.code
mov ax,@data
mov es,ax
mov ds,ax
mov si,offset strings
mov di,offset stringd
cld ;флаг df=0, указывает направление копирования
mov al,number le restriction ; если number<=restriction, то al=1
cmp al,0 ;сравнивание значения (al) с 0
je go ;если al=0,переход на метку go
mov cx,number ;подготовка счётчика для копирования
rep movsb ;копирование
jmp exit ;безусловный переход к выводу данных (метка exit)
go:
mov cx,restriction ;подготовка счётчика для копирования
rep movsb ;организация цикла
;----------------------------------------------------------------
exit:
mov ax,offset sourse ;вывод слова “источник”
mov dx,ax
mov ah,9
int 21h
mov ax,offset strings ;вывод исходной строки
mov dx,ax
mov ah,09h
int 21h
mov ax,offset result ;вывод слова “результат”
mov dx,ax
mov ah,09h
int 21h
mov ax,offset stringd ;вывод полученной строки
mov dx,ax
mov ah,09h
int 21h
;-----------------------------------------------------------------
mov ax,4c00h ; корректное завершение программы
int 21h
end
Протокол выполнения программы:
Выводы:
Во время выполнения работы я ознакомился с основными сложными типами данных: массивы, строки, записи. Изучил работу команд строковых примитивов, таких как: movs, scas, stos, cmps, lods (в трёх режимах для каждой команды). Построил блок-схему, иллюстрирующую алгоритм программы. Ознакомился с командами сравнения и условного перехода (cmp и je(jne,ja,jb,jl,jg,jle,jge,jae,jbe) соответственно).