Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лаба 2 / assembler code тех защ

.txt
Скачиваний:
0
Добавлен:
09.02.2024
Размер:
6.52 Кб
Скачать
data segment
binaryArray db 6 dup (?) ; Объявляем массив из 6 байтов для ввода двоичных чисел
positiveArray db 6 dup (0) ; Массив для положительных чисел
negativeArray db 6 dup (0) ; Массив для отрицательных чисел
data ends

code segment
assume cs:code, ds:data ; Устанавливаем сегменты кода и данных

start:
mov ax, data ; Загружаем адрес сегмента данных в регистр AX
mov ds, ax ; Устанавливаем сегмент данных

; Ввод массива из 6 двоичных чисел
mov cx, 6 ; Устанавливаем счетчик на 6 (количество чисел в массиве)
mov si, 0 ; Устанавливаем индекс исходного массива

inputLoop:
mov ah, 1 ; Функция 1 для ввода символа
int 21h ; Вызываем прерывание 21h для ввода
mov [binaryArray + si], al ; Сохраняем введенный символ в массив
inc si ; Увеличиваем индекс
loop inputLoop ; Повторяем, пока не введем все 6 символов

; Сортировка массива на два подмассива
mov cx, 6 ; Устанавливаем счетчик на 6 (количество чисел в массиве)
mov si, 0 ; Устанавливаем индекс исходного массива
mov di, 0 ; Устанавливаем индекс положительного массива

sortLoop:
mov al, [binaryArray + si] ; Загружаем символ из массива
cmp al, '0' ; Сравниваем с ASCII-кодом '0'
je positiveNumber ; Если равно '0', переходим к positiveNumber
mov [negativeArray + di], al ; Сохраняем в отрицательный массив
inc di ; Увеличиваем индекс отрицательного массива
jmp nextIteration ; Переходим к следующей итерации

positiveNumber:
mov [positiveArray + si], al ; Сохраняем в положительный массив

nextIteration:
inc si ; Увеличиваем индекс исходного массива
loop sortLoop ; Повторяем, пока не обработаем все символы

; Вывод положительных чисел
mov cx, 6 ; Устанавливаем счетчик на 6 (количество чисел в массиве)
mov si, 0 ; Устанавливаем индекс положительного массива

outputPositiveLoop:
mov dl, [positiveArray + si] ; Загружаем символ из положительного массива
mov ah, 2 ; Функция 2 для вывода символа
int 21h ; Вызываем прерывание 21h для вывода
inc si ; Увеличиваем индекс положительного массива
loop outputPositiveLoop ; Повторяем, пока не выведем все символы

; Вывод отрицательных чисел
mov cx, 6 ; Устанавливаем счетчик на 6 (количество чисел в массиве)
mov si, 0 ; Устанавливаем индекс отрицательного массива

outputNegativeLoop:
mov dl, [negativeArray + si] ; Загружаем символ из отрицательного массива
mov ah, 2 ; Функция 2 для вывода символа
int 21h ; Вызываем прерывание 21h для вывода
inc si ; Увеличиваем индекс отрицательного массива
loop outputNegativeLoop ; Повторяем, пока не выведем все символы

exit:
mov ah, 4ch ; Функция 4Ch для завершения программы
int 21h ; Вызываем прерывание 21h

code ends
end start

Конечно, давайте кратко объясним некоторые ключевые элементы синтаксиса:

1. `db`: Это директива (оператор), используемая для определения байтовых данных (data byte). Например, `binaryArray db 6 dup (?)` выделяет массив из 6 байтов, каждый из которых инициализируется вопросительным знаком, обозначающим, что эти данные будут введены пользователем.

2. `dup`: Это ключевое слово, используемое вместе с `db`, чтобы указать количество повторений. В данном случае, `6 dup (?)` означает, что мы хотим создать массив из 6 байтов, каждый из которых инициализирован вопросительным знаком.

3. `data segment` и `data ends`: Эти директивы определяют сегмент данных, где мы объявляем переменные и массивы данных.

4. `mov`: Это инструкция, которая перемещает (копирует) данные из одного места в другое. Например, `mov ax, data` копирует адрес сегмента данных в регистр AX.

5. `int 21h`: Это прерывание (interrupt), которое вызывает обработчик прерывания 21h (в DOS), предоставляющий доступ к различным службам, таким как ввод и вывод.

6. `loop`: Это инструкция, которая выполняет цикл, уменьшая счетчик CX и переходя к метке, если счетчик не равен нулю.

7. `code segment`, `code ends`, `assume cs:code`: Определяют сегмент кода и указывают, что сегмент кода находится в регистре CS.

8. `ah`, `al`, `dx`, `cx`, `si`, `di`: Регистры общего назначения.

9. `4Ch` и `int 21h`: Это прерывание DOS для завершения программы.

Эти элементы представляют основные концепции синтаксиса x86 ассемблера, используемого в приведенном вами коде.
Соседние файлы в папке Лаба 2