Скачиваний:
71
Добавлен:
11.02.2014
Размер:
75.78 Кб
Скачать

Днепропетровский Национальный Университет

Радиофизический факультет

Отчет к лабораторной работе №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) соответственно).

7

Соседние файлы в папке лабораторные работы по ASSAMBLER