Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Отчет№6(asm).docx
Скачиваний:
2
Добавлен:
01.04.2025
Размер:
33 Кб
Скачать
☆

Алгоритм работы программы

1.Заданы две 4-х-байтовые таблицы: SOURSE и DEST.

2.SOURSE - исходная таблица, DEST - конечная. Программа копирует каждый байт из таблицы 3.SOURSE в таблицу DEST по следующему правилу:

4.если байт <0F; то к этому байту добавляется 0F и результат пересыпается в DEST;

5.если байт =0F, то он пересылается в DEST без изменений;

6.если байт >0F, то из него вычитается 0F и результат пересылается в

7.DEST. Таблица SOURSE содержит следующие элементы: 01, АF, 0F, 08.

Листинг программы

Turbo Assembler Version 3.2 06/12/12 18:44:53 Page 1

lab1.asm

lab1

1 ; ========================

2 0000 my_stack segment stack 'stack'

3 0000 40*(73 74 61 63 6B + db 64 dup('stack ')

4 20 20 20)

5 0200 my_stack ends

6 ; ========================

7 0000 dseg segment

8 0000 01 AF 0F 08 source db 01h,0afh,0fh,08h

9 0004 04*(??) dest db 4 dup(?)

10 0008 dseg ends

11 ; ========================

12 0000 cseg segment

13 assume cs:cseg,ds:dseg,ss:my_stack

14 0000 entry proc far

15 0000 1E push ds

16 0001 33 C0 xor ax,ax

17 0003 50 push ax

18 0004 B8 0000s mov ax,dseg

19 0007 8E D8 mov ds,ax

20 0009 B9 0004 mov cx,4

21 000C BB 0000r mov bx,offset source ; or LEA bx,source

22 000F BF 0004r mov di, offset dest ; or LEA di,dest

23 0012 again:

24 0012 8A 07 mov al,[bx]

25 0014 3C 0F cmp al,0fh

26 0016 74 09 je e

27 0018 72 05 jb a

28 001A 2C 0F sub al,0fh

29 001C EB 03 90 jmp e

30 001F 04 0F a: add al,0fh

31 0021 88 05 e: mov [di],al

32 0023 43 inc bx

33 0024 47 inc di

34 0025 E2 EB loop again

35 0027 CB ret

36 0028 entry endp

37 0028 cseg ends

38 end entry

Turbo Assembler Version 3.2 06/12/12 18:44:53 Page 2

Symbol Table

lab1

Symbol Name Type Value

??DATE Text "06/12/12"

??FILENAME Text "lab1 "

??TIME Text "09:34:13"

??VERSION Number 0314

@CPU Text 0101H

@CURSEG Text CSEG

@FILENAME Text LAB1

@WORDSIZE Text 2

A Near CSEG:001F

AGAIN Near CSEG:0012

DEST Byte DSEG:0004

E Near CSEG:0021

ENTRY Far CSEG:0000

SOURCE Byte DSEG:0000

Groups & Segments Bit Size Align Combine Class

CSEG 16 0028 Para none

DSEG 16 0008 Para none

MY_STACK 16 0200 Para Stack STACK

Ответы на вопросы по программе

А) Регистры ds и ax необходимо запомнить в стеке до их использования в программе, чтобы потом можно было восстановить их прежнее значение.

Б) Данные команды выполняют настройку сегментного регистра ds, т. е. помещают адрес сегмента данных, содержащийся в переменной dseg, в регистр ds с использованием регистра ax в качестве промежуточного буфера.

В) В регистре bx находится смещение (эффективный адрес) первого элемента таблицы source в пределах регистра ds. в этом регистре содержится смещение (offset) текущего элемента таблицы source.

Г) В регистре di хранится находится смещение первого элемента таблицы DEST в пределах регистра ds и в процессе выполнения программы в нем содержится смещение текущего элемента таблицы DEST.

Д) В первом цикле программы команда mov al,[bx] помещает в al значение 01h, а команда cmp al,0fh сравнивает al и 0fh путем вычитания второго из первого, и т. к. 01h<0fh, то результат вычитания отрицательный (SF=1). Физический адрес команды определяет пара регистров cs:ip и он вычисляется по следующей формуле:

Физический адрес = смещение + 16*(регистр сегмента)

Умножение на 16 равносильно приписыванию четырех нулей справа в двоичной системе, либо одного нуля справа в шестнадцатеричной системе счисления.

Физический адрес команды MOV AL,[BX] равен 00120h (cs) + 000fh (ip) = 0012fh.

Физический адрес операнда, находящегося в памяти, определяется парой сегментов ds:bx (в данном случае) и вычисляется по той же формуле, что и адрес команды.

Физический адрес операнда равен 00000h (ds) + 0000h (bx) = 00000h

Е) Команда JB A выполняет условный переход к метке A, если al<0fh в предыдущей команде CMP AL,0FH.

Ж) Физический адрес команды MOV [DI],AL равен 00210h (cs) + 001fh (ip) = 0022fh.

Физический адрес первого операнда равен 00000h (ds) + 0004h (di) = 00004h.

В первом цикле программы значение 10h (01h + 0fh) записывается в 4-й байт по адресу ds:0000.

З) Команда LOOP AGAIN выполняет переход к метке AGAIN, если значение регистра cx отлично от 0.

В конце первого цикла cx=3 и поэтому выполняется команда MOV AL,[BX].

И) Т. к. 0afh (число в al)>0fh, то команды JE E и JB A не делают перехода и выполняется команда

SUB AL, 0FH.

К) Содержимое сегмента данных (ds:0000) в конце второго цикла:

01 AF 0F 08 10 A0 00 00

Л) В третьем цикле программы al=0fh, zf=1, в таблицу DEST записывается число 0fh.

М) В 4-м цикле программы в al записывается число 08h, оно сравнивается с 0fh и в четвертый байт таблицы DEST записывается число 17h.

Н) Содержимое таблицы DEST в конце выполнения программы:

10 A0 0F 17

Число циклов программы (4) определяется значением регистра cx.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]