
лабораторная работа / лабораторные работы по ASSAMBLER / LABA PO ASM dlya Geni
.DOC
Днепропетровский Национальный Университет
Радиофизический факультет
Отчет к лабораторной работе №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) соответственно). Изучил принцип работы с логическими побитовыми операциями.