Лаба 2 / осн.Тех защ Ассемблер
.docxДля интерпретации и запуска программы использовали dosbox.
mount d: c:\asm – создаём виртуальный диск, где корень –папка asm
d: - открываем созданный диск
tasm code.asm – компилируем исходный код
tlink code.obj – создаём исполняемый файл
td code – запускаем debug
F7 – делаем шаг в программе
Ключевые элементы:
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 для завершения программы.
Листинг программы:
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
mov ds, ax
; Ввод массива из 6 двоичных чисел
mov cx, 6
mov si, 0
inputLoop:
mov ah, 1 ; Функция 1 для ввода символа
int 21h
mov [binaryArray + si], al ; Сохраняем введенный символ в массив
inc si
loop inputLoop
; Сортировка массива на два подмассива
mov cx, 6
mov si, 0
mov di, 0
sortLoop:
mov al, [binaryArray + si]
cmp al, '0'
je positiveNumber
mov [negativeArray + di], al
inc di
jmp nextIteration
positiveNumber:
mov [positiveArray + si], al
nextIteration:
inc si
loop sortLoop
; Вывод положительных чисел
mov cx, 6
mov si, 0
outputPositiveLoop:
mov dl, [positiveArray + si]
mov ah, 2 ; Функция 2 для вывода символа
int 21h
inc si
loop outputPositiveLoop
; Вывод отрицательных чисел
mov cx, 6
mov si, 0
outputNegativeLoop:
mov dl, [negativeArray + si]
mov ah, 2 ; Функция 2 для вывода символа
int 21h
inc si
loop outputNegativeLoop
exit:
mov ah, 4ch
int 21h
code ends
end start