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

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

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

Отчет к лабораторной работе №2

по курсу «Программирование на языке ассемблер»

Выполнил ст. гр. РС-05

Куликов Евгений

Г.Днепропетровск

2006 г.

Задание:

Напишите программу, для копирования десятиэлементного массива 32-разрядных целых чисел в другой массив, отобразите сумму элементов скопированного массива.

Теоретические сведения:

В языке ассемблера массивы описываются по директивам определения данных с использованием конструкции повторения DUP. Однако кое-что здесь требует уточнения.

Пусть имеется массив X из 30 элементов-слов:

X DW 30 DUP(?)

Как видно, при описании массива указывается количество элементов в нем и их тип, но не указывается, как нумеруются (индексируются) его элементы. Поэтому такому описанию может соответствовать и массив, в котором элементы нумеруются с 0, т. е. Х[0..29], и массив, в котором нумерация начинается с 1, т. е. Х[1..30], и массив с любым другим начальным индексом k, т. е. X[k..29+k]. Таким образом, автор программы может "накладывать" на массив различные диапазоны изменения индекса. Какой диапазон выбрать? Иногда границы изменения индекса могут жестко определяться условиями задачи (например, в задаче явно сказано, что элементы нумеруются с 1). Но если нумерация не навязывается извне, тогда лучше выбрать нумерацию с 0.

Следующий вопрос, который возникает при работе с массивами, - это как осуществляется доступ к их элементам, как реализуются переменные с индексом. Чтобы ответить на этот вопрос, надо предварительно познакомиться с такой особенностью ЭВМ, как модификация адресов.

До сих пор мы рассматривали команды, в которых для операндов из памяти указывались их точные адреса (имена), например: MOV СХ,А. Однако в общем случае в команде вместе с адресом может быть указан в квадратных скобках некоторый регистр, например: MOV СХ,А[ВХ]. Тогда команда будет работать не с указанным в ней адресом А, а с так называемым исполнительным (другое название - эффективным) адресом Аисп, который вычисляется по следующей формуле:

Аисп = (А + [ВХ]) mod 2 16,

где [ВХ] обозначает содержимое регистра ВХ.

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

Turbo Assembler Version 2.0 03/24/06 01:42:58 Page 1

LABA2.ASM

1 MASM

2 0000 MODEL SMALL

3 0000 STACK 100H

4 0000 .DATA

5 ;ИНИЦИАЛИЗАЦИЯ ПЕРЕЧИСЛЕНИЕМ ЭЛЕМЕНТОВ МАССИВА 1

6 0000 00000123 11111111 + MAS1 DD 123H,11111111H,22222222H,0AAAAAAAH,0DDDDDDH,0,0,0,0,11122233H

7 22222222 0AAAAAAA +

8 00DDDDDD 00000000 +

9 00000000 00000000 +

10 00000000 11122233

11 0028 0A*(00000000) MAS2 DD 10 DUP (0) ;ИНИЦИАЛИЗАЦИЯ ВТРОГО МАССИВА НУЛЕВЫМИ ЭЛЕМЕНТАМИ В ЦИКЛЕ

12 0050 0000 X DW (?) ;ПЕРЕМЕННАЯ,ХРАНЯЩАЯ ЗНАЧЕНИЕ ПОЛОВИНЫ ДВОЙНОГО СЛОВА - СУММЫ(РЕЗУЛЬТАТА)

13 0052 0000 TEMP DW (?) ;ВСПОМОГАТЕЛЬНАЯ ПЕРЕМЕННАЯ ДЛЯ ПРОЦЕДУРЫ

14 0054 .CODE

15 0000 B8 0000s MOV AX,@DATA ;СВЯЗЫВАЕМ РЕГИСТР DS С СЕГМЕНТОМ ДАННЫХ

16 0003 8E D8 MOV DS,AX ;-----------------------------

17 ;----------------------------------------------------------------------------------

18 ;КОПИРОВАНИЕ ЭЛЕМЕНТОВ ИЗ ОДНОГО МАССИВА В ДРУГОЙ

19 0005 B9 000A MOV CX,10 ;СЧЁТЧИК ДЛЯ КОЛИЧЕСТВА КОПИРУЕМЫХ ЭЛЕМЕНТОВ

20 0008 BE 0000 MOV SI,0 ;ЗНАЧЕНИЕ ИНДЕКСА ЭЛЕМЕНТА В-

21 000B COPY: ;-МАССИВЕ(ОПРЕДЕЛЯЕТ СМЕЩЕНИЕ)

22 000B 8B 84 0000r MOV AX,WORD PTR MAS1[SI] ;ОБРАЩАЕМСЯ К МЛАДШЕМУ СЛОВУ ЯЧЕЙКИ МАССИВА 1

23 000F 89 84 0028r MOV WORD PTR MAS2[SI],AX ;КОПИРУЕМ В СООТВЕТСТВУЮЩУЮ ЯЧЕЙКУ МАССИВА 2

24 0013 8B 94 0002r MOV DX,WORD PTR MAS1[SI+2] ;АНАЛОГИЧНО ПОСТУПАЕМ СО СТАРШИМ СЛОВОМ

25 0017 89 94 002Ar MOV WORD PTR MAS2[SI+2],DX ;----------------

26 001B 83 C6 04 ADD SI,4 ;УВЕЛИЧИВАЕМ ИНДЕКС ЭЛЕМЕНТА (4-Т.К. ДВОЙНОЕ СЛОВО)

27 001E E2 EB LOOP COPY ;ПЕРЕХОДИМ ПО МЕТКЕ COPY

28 ;---------------------------------------------------------------------------------

29 ;СЛОЖЕНИЕ ЭЛЕМЕНТОВ МАССИВА-ПРИЁМНИКА

30 0020 BE 0000 MOV SI,0 ;ЗНАЧЕНИЕ ИНДЕКСА ЭЛЕМЕНТА

31 0023 8B 84 002Ar MOV AX,WORD PTR MAS2[SI+2] ;ПОМЕЩАЕМ В АХ СТАРШИЙ БАЙТ ПЕРВОГО ЭЛ-ТА МАССИВА

32 0027 8B 94 0028r MOV DX,WORD PTR MAS2[SI] ;ПОМЕЩАЕМ В DX МЛАДШИЙ БАЙТ

33 002B B9 0009 MOV CX,9 ;СЧЁТЧИК ДЛЯ ЦИКЛА СУММИРОВАНИЯ,ДОБАВЛЯЕМ 9-

34 002E CIKL: ;-ОСТАВШИХСЯ ЭЛЕМЕНТОВ

35 002E 83 C6 04 ADD SI,4 ;ПЕРЕХОД К СЛЕДУЮЩЕМУ ЭЛЕМЕНТУ МАССИВА

36 0031 03 94 0028r ADD DX,WORD PTR MAS2[SI] ;К DX ДОБАВЛЯЕМ МЛАДШЕЕ СЛОВО ЭЛЕМЕНТА С ИНДЕКСОМ SI

37 0035 73 03 JNC GO ;ЕСЛИ ФЛАГ ПЕРЕПОЛНЕНИЯ НЕ УСТАНОВЛЕН,ТО ИДЁМ НА GO

38 0037 05 0001 ADD AX,1 ;ЕСЛИ CF=1(УСТАНОВЛЕН),ТО МЫ ПОТЕРЯЛИ СТАРШИЙ РАЗРЯД-

39 ;-И ЭТО НУЖНО УЧЕСТЬ, ПРИБАВИТЬ ЕГО К СТАРШЕМУ СЛОВУ

40 003A 03 84 002Ar GO: ADD AX,WORD PTR MAS2[SI+2];К AX ДОБАВЛЯЕМ СТАРШЕЕ СЛОВО ЭЛЕМЕНТА С ИНДЕКСОМ SI

41 003E E2 EE LOOP CIKL

42 ;------------------------------------------------------------------------------

43 ;ПЕРЕДАЧА ПАРАМЕТРОВ ДЛЯ ВЫВОДА НА МОНИТОР

44 0040 8B D8 MOV BX,AX ;ПЕРЕДАЁМ В ПРОЦЕДУРУ ВЫВОДА СТАРШЕЕ СЛОВО РЕЗУЛЬТАТА-

45 ;-ЧЕРЕЗ РЕГИСТР BX

46 0042 52 PUSH DX ;СОХРАНЯЕМ ЗНАЧЕНИЕ DX В СТЕК

47 0043 BF 0001 MOV DI,1 ;СЧЁТЧИК ДЛЯ ВЫХОДА ИЗ ПРОЦЕДУРЫ

48 0046 EB 04 90 JMP XXX ;ИДЁМ НА ВЫПОЛНЕНИЕ ПРОЦЕДУРЫ ВЫВОДА

49 0049 5A PR:POP DX ;ВОССТАНАВЛИВАЕМ ИЗ СТЕКА ЗНАЧЕНИЕ РЕГИСТРА DX

50 004A 8B DA MOV BX,DX ;ПЕРЕДАЁМ В ПРОЦЕДУРУ МЛАДШЕЕ СЛОВО РЕЗУЛЬТАТА

51 ;-------------------------------------------------------------------------------

52 ;ПРОЦЕДУРА ДЛЯ ВЫВОДА 16-РАЗРЯДНЫХ 16-РИЧНЫХ ЧИСЕЛ

53 004C XXX:

54 004C SHOW_16 PROC ;НАЧАЛО ПРОЦЕДУРЫ(НУЖНО ПЕРЕДАТЬ ЧЕРЕЗ РЕГИСТР BX-

55 004C 89 1E 0050r MOV X,BX ;-ЧИСЛО ДЛЯ ВЫВОДА (16 БИТ))

56 0050 89 1E 0052r MOV TEMP,BX ;ВСПОМОГАТЕЛЬНАЯ ПЕРЕМЕННАЯ ДЛЯ ХРАНЕНИЯ ЧИСЛА

57 0054 BE 0001 MOV SI,1 ;СМЕЩЕНИЕ В СЛОВЕ И ОДНОВРЕМЕННО СЧЁТЧИК ВНЕШНЕГО ЦИКЛА

Turbo Assembler Version 2.0 03/24/06 01:42:58 Page 2

LABA2.ASM

58

59 0057 METKA: ;ВНЕШНИЙ ЦИКЛ ДЛЯ БАЙТА

60 0057 B1 04 MOV CL,4 ;CL=4

61 0059 D2 AC 0052r SHR BYTE PTR TEMP[SI],CL;ЗАНУЛЯЕМ МЛАДШИЕ 4 БИТА SI-ТОГО БАЙТА ПЕРЕМЕННОЙ TEMP

62 005D B3 01 MOV BL,1 ;СЧЁТЧИК ДЛЯ ВНУТРЕННЕГО ЦИКЛА

63 005F CIKLV: ;ВНУТРЕННИЙ ЦИКЛ ДЛЯ 4 БИТ

64 005F 8A 94 0052r MOV DL,BYTE PTR TEMP[SI] ;DL:=ЗНАЧЕНИЕ SI-ТОГО БАЙТА СЛОВА(TEMP)

65 0063 80 FA 0A CMP DL,10 ;ПРОВЕРЯЕМ,ЧТО НУЖНО ВЫВОДИТЬ - ЦИФРУ ИЛИ БУКВУ(А-F)

66 0066 7D 06 JGE ABC1 ;ЕСЛИ БУКВУ,ТО НА МЕТКУ АВС1 (ПРИ DL>=10)

67 0068 80 C2 30 ADD DL,30H ;ЕСЛИ ЦИФРУ,ТО ПРИБАВЛЯЕМ ACCII-КОД НУЛЯ(30H)

68 006B EB 04 90 JMP EX1 ;ПЕРЕХОДИМ К ВЫВОДУ СИМВОЛА ПО МЕТКЕ EX1

69 006E 80 C2 37 ABC1: ADD DL,37H ;ПРИБАВЛЯЕМ АССII-КОД БУКВЫ А(37H)

70 0071 B4 02 EX1: MOV AH,02H ;ВЫВОД СИМВОЛА

71 0073 CD 21 INT 21H ;-----------------

72 0075 A1 0050r MOV AX,X ;СНОВА ПОМЕЩАЕМ В AX ЗНАЧЕНИЕ ПЕРЕМЕННОЙ

73 0078 A3 0052r MOV TEMP,AX ;ТЕПЕРЬ TEMP СНОВА СОДЕРЖИТ ЗНАЧЕНИЕ НУЖНОГО СЛОВА

74 007B 80 FB 00 CMP BL,0 ;ПРОВЕРКА УСЛОВИЯ ВЫХОДА ИЗ ВНУТРЕННЕГО ЦИКЛА

75 007E 74 0A JE EXIT ;ЕСЛИ BL=0, ТО ВЫХОДИМ

76

77 0080 B1 0F MOV CL,00001111B ;ЗАНУЛЯЕМ СТАРШИЕ 4 БИТА SI-ТОГО БАЙТА

78 0082 20 8C 0052r AND BYTE PTR TEMP[SI],CL;------------------------------

79 0086 FE CB DEC BL ;BL=0

80 0088 EB D5 JMP CIKLV ;ПЕРЕХОД К НАЧАЛУ ВНУТРЕННЕГО ЦИКЛА

81

82 008A EXIT:

83 008A 4E DEC SI ;SI:=SI-1

84 008B 83 FE 00 CMP SI,0 ;ЕСЛИ SI=0(ПОСЛЕ ПЕРВОГО ПРОХОДА),ТО ИДЁМ НА МЕТКА,

85 008E 74 C7 JE METKA ;ЕСЛИ SI=255(ПОСЛЕ ВТОРОГО ПРОХОДА),ТО ВЫХОДИМ ИЗ ПРОГРАММЫ

86 0090 SHOW_16 ENDP ;КОНЕЦ ПРОЦЕДУРЫ ВЫВОДА

87 ;---------------------------------------------------------------------------------

88 ;ОПРЕДЕЛЯЕМ,КУДА ДАЛЬШЕ ИДТИ - НА ВЫВОД МЛАДШЕГО СЛОВА РЕЗУЛЬТАТА ИЛИ НА ВЫХОД

89 0090 4F DEC DI ;DI:=DI-1

90 0091 83 FF 00 CMP DI,0 ;ЕСЛИ DI=0(ПОСЛЕ ВЫВОДА СТАРШЕГО СЛОВА),ТО ИДЁМ ВЫВОДИТЬ

91 0094 74 B3 JE PR ;МЛАДШЕЕ СЛОВО ПО МЕТКЕ PR,ЕСЛИ DI=255(ПОСЛЕ ВЫВОДА-

92 ;-МЛАДШЕГО СЛОВА )ТО ВЫХОДИМ ИЗ ПРОГРАММЫ

93 ;---------------------------------------------------------------------------------

94 0096 B8 4C00 MOV AX,4C00H ;КОРРЕКТНОЕ ЗАВЕРШЕНИЕ ПРОГРАММЫ

95 0099 CD 21 INT 21H

96 END

Turbo Assembler Version 2.0 03/24/06 01:42:58 Page 3

Symbol Table

Symbol Name Type Value

??DATE Text "03/24/06"

??FILENAME Text "LABA2 "

??TIME Text "01:42:58"

??VERSION Number 0200

@CODE Text _TEXT

@CODESIZE Text 0

@CPU Text 0101H

@CURSEG Text _TEXT

@DATA Text DGROUP

@DATASIZE Text 0

@FILENAME Text LABA2

@MODEL Text 2

@WORDSIZE Text 2

ABC1 Near _TEXT:006E

CIKL Near _TEXT:002E

CIKLV Near _TEXT:005F

COPY Near _TEXT:000B

EX1 Near _TEXT:0071

EXIT Near _TEXT:008A

GO Near _TEXT:003A

MAS1 Dword DGROUP:0000

MAS2 Dword DGROUP:0028

METKA Near _TEXT:0057

PR Near _TEXT:0049

SHOW_16 Near _TEXT:004C

TEMP Word DGROUP:0052

X Word DGROUP:0050

XXX Near _TEXT:004C

Groups & Segments Bit Size Align Combine Class

DGROUP Group

STACK 16 0100 Para Stack STACK

_DATA 16 0054 Word Public DATA

_TEXT 16 009B Word Public CODE

Код программы:

MASM

MODEL SMALL

STACK 100H

.DATA

;ИНИЦИАЛИЗАЦИЯ ПЕРЕЧИСЛЕНИЕМ ЭЛЕМЕНТОВ МАССИВА 1

MAS1 DD 123H,11111111H,22222222H,0AAAAAAAH,0DDDDDDH,0,0,0,0,11122233H

MAS2 DD 10 DUP (0) ;ИНИЦИАЛИЗАЦИЯ ВТРОГО МАССИВА НУЛЕВЫМИ ЭЛЕМЕНТАМИ В ЦИКЛЕ

X DW (?) ;ПЕРЕМЕННАЯ,ХРАНЯЩАЯ ЗНАЧЕНИЕ ПОЛОВИНЫ ДВОЙНОГО СЛОВА - СУММЫ(РЕЗУЛЬТАТА)

TEMP DW (?) ;ВСПОМОГАТЕЛЬНАЯ ПЕРЕМЕННАЯ ДЛЯ ПРОЦЕДУРЫ

.CODE

MOV AX,@DATA ;СВЯЗЫВАЕМ РЕГИСТР DS С СЕГМЕНТОМ ДАННЫХ

MOV DS,AX ;-----------------------------

;----------------------------------------------------------------------------------

;КОПИРОВАНИЕ ЭЛЕМЕНТОВ ИЗ ОДНОГО МАССИВА В ДРУГОЙ

MOV CX,10 ;СЧЁТЧИК ДЛЯ КОЛИЧЕСТВА КОПИРУЕМЫХ ЭЛЕМЕНТОВ

MOV SI,0 ;ЗНАЧЕНИЕ ИНДЕКСА ЭЛЕМЕНТА В-

COPY: ;-МАССИВЕ(ОПРЕДЕЛЯЕТ СМЕЩЕНИЕ)

MOV AX,WORD PTR MAS1[SI] ;ОБРАЩАЕМСЯ К МЛАДШЕМУ СЛОВУ ЯЧЕЙКИ МАССИВА 1

MOV WORD PTR MAS2[SI],AX ;КОПИРУЕМ В СООТВЕТСТВУЮЩУЮ ЯЧЕЙКУ МАССИВА 2

MOV DX,WORD PTR MAS1[SI+2] ;АНАЛОГИЧНО ПОСТУПАЕМ СО СТАРШИМ СЛОВОМ

MOV WORD PTR MAS2[SI+2],DX ;----------------

ADD SI,4 ;УВЕЛИЧИВАЕМ ИНДЕКС ЭЛЕМЕНТА (4-Т.К. ДВОЙНОЕ СЛОВО)

LOOP COPY ;ПЕРЕХОДИМ ПО МЕТКЕ COPY

;---------------------------------------------------------------------------------

;СЛОЖЕНИЕ ЭЛЕМЕНТОВ МАССИВА-ПРИЁМНИКА

MOV SI,0 ;ЗНАЧЕНИЕ ИНДЕКСА ЭЛЕМЕНТА

MOV AX,WORD PTR MAS2[SI+2] ;ПОМЕЩАЕМ В АХ СТАРШИЙ БАЙТ ПЕРВОГО ЭЛ-ТА МАССИВА

MOV DX,WORD PTR MAS2[SI] ;ПОМЕЩАЕМ В DX МЛАДШИЙ БАЙТ

MOV CX,9 ;СЧЁТЧИК ДЛЯ ЦИКЛА СУММИРОВАНИЯ,ДОБАВЛЯЕМ 9-

CIKL: ;-ОСТАВШИХСЯ ЭЛЕМЕНТОВ

ADD SI,4 ;ПЕРЕХОД К СЛЕДУЮЩЕМУ ЭЛЕМЕНТУ МАССИВА

ADD DX,WORD PTR MAS2[SI] ;К DX ДОБАВЛЯЕМ МЛАДШЕЕ СЛОВО ЭЛЕМЕНТА С ИНДЕКСОМ SI

JNC GO ;ЕСЛИ ФЛАГ ПЕРЕПОЛНЕНИЯ НЕ УСТАНОВЛЕН,ТО ИДЁМ НА GO

ADD AX,1 ;ЕСЛИ CF=1(УСТАНОВЛЕН),ТО МЫ ПОТЕРЯЛИ СТАРШИЙ РАЗРЯД-

;-И ЭТО НУЖНО УЧЕСТЬ, ПРИБАВИТЬ ЕГО К СТАРШЕМУ СЛОВУ

GO: ADD AX,WORD PTR MAS2[SI+2];К AX ДОБАВЛЯЕМ СТАРШЕЕ СЛОВО ЭЛЕМЕНТА С ИНДЕКСОМ SI

LOOP CIKL

;------------------------------------------------------------------------------

;ПЕРЕДАЧА ПАРАМЕТРОВ ДЛЯ ВЫВОДА НА МОНИТОР

MOV BX,AX ;ПЕРЕДАЁМ В ПРОЦЕДУРУ ВЫВОДА СТАРШЕЕ СЛОВО РЕЗУЛЬТАТА-

;-ЧЕРЕЗ РЕГИСТР BX

PUSH DX ;СОХРАНЯЕМ ЗНАЧЕНИЕ DX В СТЕК

MOV DI,1 ;СЧЁТЧИК ДЛЯ ВЫХОДА ИЗ ПРОЦЕДУРЫ

JMP XXX ;ИДЁМ НА ВЫПОЛНЕНИЕ ПРОЦЕДУРЫ ВЫВОДА

PR:POP DX ;ВОССТАНАВЛИВАЕМ ИЗ СТЕКА ЗНАЧЕНИЕ РЕГИСТРА DX

MOV BX,DX ;ПЕРЕДАЁМ В ПРОЦЕДУРУ МЛАДШЕЕ СЛОВО РЕЗУЛЬТАТА

;-------------------------------------------------------------------------------

;ПРОЦЕДУРА ДЛЯ ВЫВОДА 16-РАЗРЯДНЫХ 16-РИЧНЫХ ЧИСЕЛ

XXX:

SHOW_16 PROC ;НАЧАЛО ПРОЦЕДУРЫ(НУЖНО ПЕРЕДАТЬ ЧЕРЕЗ РЕГИСТР BX-

MOV X,BX ;-ЧИСЛО ДЛЯ ВЫВОДА (16 БИТ))

MOV TEMP,BX ;ВСПОМОГАТЕЛЬНАЯ ПЕРЕМЕННАЯ ДЛЯ ХРАНЕНИЯ ЧИСЛА

MOV SI,1 ;СМЕЩЕНИЕ В СЛОВЕ И ОДНОВРЕМЕННО СЧЁТЧИК ВНЕШНЕГО ЦИКЛА

METKA: ;ВНЕШНИЙ ЦИКЛ ДЛЯ БАЙТА

MOV CL,4 ;CL=4

SHR BYTE PTR TEMP[SI],CL;ЗАНУЛЯЕМ МЛАДШИЕ 4 БИТА SI-ТОГО БАЙТА ПЕРЕМЕННОЙ TEMP

MOV BL,1 ;СЧЁТЧИК ДЛЯ ВНУТРЕННЕГО ЦИКЛА

CIKLV: ;ВНУТРЕННИЙ ЦИКЛ ДЛЯ 4 БИТ

MOV DL,BYTE PTR TEMP[SI] ;DL:=ЗНАЧЕНИЕ SI-ТОГО БАЙТА СЛОВА(TEMP)

CMP DL,10 ;ПРОВЕРЯЕМ,ЧТО НУЖНО ВЫВОДИТЬ - ЦИФРУ ИЛИ БУКВУ(А-F)

JGE ABC1 ;ЕСЛИ БУКВУ,ТО НА МЕТКУ АВС1 (ПРИ DL>=10)

ADD DL,30H ;ЕСЛИ ЦИФРУ,ТО ПРИБАВЛЯЕМ ACCII-КОД НУЛЯ(30H)

JMP EX1 ;ПЕРЕХОДИМ К ВЫВОДУ СИМВОЛА ПО МЕТКЕ EX1

ABC1: ADD DL,37H ;ПРИБАВЛЯЕМ АССII-КОД БУКВЫ А(37H)

EX1: MOV AH,02H ;ВЫВОД СИМВОЛА

INT 21H ;-----------------

MOV AX,X ;СНОВА ПОМЕЩАЕМ В AX ЗНАЧЕНИЕ ПЕРЕМЕННОЙ

MOV TEMP,AX ;ТЕПЕРЬ TEMP СНОВА СОДЕРЖИТ ЗНАЧЕНИЕ НУЖНОГО СЛОВА

CMP BL,0 ;ПРОВЕРКА УСЛОВИЯ ВЫХОДА ИЗ ВНУТРЕННЕГО ЦИКЛА

JE EXIT ;ЕСЛИ BL=0, ТО ВЫХОДИМ

MOV CL,00001111B ;ЗАНУЛЯЕМ СТАРШИЕ 4 БИТА SI-ТОГО БАЙТА

AND BYTE PTR TEMP[SI],CL;------------------------------

DEC BL ;BL=0

JMP CIKLV ;ПЕРЕХОД К НАЧАЛУ ВНУТРЕННЕГО ЦИКЛА

EXIT:

DEC SI ;SI:=SI-1

CMP SI,0 ;ЕСЛИ SI=0(ПОСЛЕ ПЕРВОГО ПРОХОДА),ТО ИДЁМ НА МЕТКА,

JE METKA ;ЕСЛИ SI=255(ПОСЛЕ ВТОРОГО ПРОХОДА),ТО ВЫХОДИМ ИЗ ПРОГРАММЫ

SHOW_16 ENDP ;КОНЕЦ ПРОЦЕДУРЫ ВЫВОДА

;---------------------------------------------------------------------------------

;ОПРЕДЕЛЯЕМ,КУДА ДАЛЬШЕ ИДТИ - НА ВЫВОД МЛАДШЕГО СЛОВА РЕЗУЛЬТАТА ИЛИ НА ВЫХОД

DEC DI ;DI:=DI-1

CMP DI,0 ;ЕСЛИ DI=0(ПОСЛЕ ВЫВОДА СТАРШЕГО СЛОВА),ТО ИДЁМ ВЫВОДИТЬ

JE PR ;МЛАДШЕЕ СЛОВО ПО МЕТКЕ PR,ЕСЛИ DI=255(ПОСЛЕ ВЫВОДА-

;-МЛАДШЕГО СЛОВА )ТО ВЫХОДИМ ИЗ ПРОГРАММЫ

;---------------------------------------------------------------------------------

MOV AX,4C00H ;КОРРЕКТНОЕ ЗАВЕРШЕНИЕ ПРОГРАММЫ

INT 21H

END

Протокол выполнения программы:

Выводы:

Во время выполнения работы я ознакомился с основными сложными типами данных: массивы, строки, записи, объединения. Научился проводить различные арифметические и логические операции с 32-разрядными числами. Ознакомился с командами сравнения и условного перехода (cmp и je(jne,ja,jb,jl,jg,jle,jge,jae,jbe) соответственно). Изучил принцип работы с логическими побитовыми операциями.

9

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