Лабораторные работы. Неелова / МЗЯП ЛР №2 Отчет
.docxФЕДЕРАЛЬНОЕ АГЕНТСТВО СВЯЗИ
ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ
«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ТЕЛЕКОММУНИКАЦИЙ ИМ. ПРОФ. М.А. БОНЧ-БРУЕВИЧА» (СПбГУТ)
ФАКУЛЬТЕТ ИНФОРМАЦИОННЫХ ТЕХНОЛОГИЙ И ПРОГРАММНОЙ ИНЖЕНЕРИИ (ИТПИ)
КАФЕДРА ПРОГРАММНОЙ ИНЖЕНЕРИИ И ВЫЧИСЛИТЕЛЬНОЙ ТЕХНИКИ (ПИИВТ)
Дисциплина: «Машинно-зависимые языки программирования»
Лабораторная работа №2.
По теме:
Команды арифметических операций. Условия
Выполнил:
Студент группы ИКПИ-32
Яковлев М. А.
Приняла:
Неелова О. Л.
Подпись ______________
Цель работы
Изучение функционирования основных ассемблерных команд, получение навыков по составлению простых программ на Ассемблере.
Ход работы
Программа 1
.text
.global _start
_start: LDR R0, =ARR_A
LDR R1, =ARR_B
LDR R2, N
MOV R3, #0
LOOP: LDR R4, [R0], #4
LDR R5, [R1], #4
MLA R3, R4, R5, R3
SUBS R2, R2, #1
BGT LOOP
STR R3, RESULT
STOP: B STOP
N: .word 4
ARR_A: .word 5, -3, -6, 9
ARR_B: .word 2, 14, -3, 2
RESULT: .space 4
.end
Результат для каждого цикла:
В 1-й итерации R3 = 5 * 2 = 10 (0x0000000A)
Во 2-й итерации R3 = 10 + (-3 * 14) = -32 (0xFFFFFFE0)
В 3-й итерации R3 = -32 + (-6 * -3) = -14 (0xFFFFFFF2)
В 4-й итерации R3 = -14 + (9 * 2) = 4 (0x00000004)
Конечный результат в регистре R3 и в памяти по адресу (0x00000050) RESULT будет 4.
Программа 2
.text
.global _start
_start:
LDR R1, =0x7E89FD56
MOVW R2, 0x53A4
MOVT R2, 0x7BC7
MOV R3, #0
ADD R3, R1, R2
ADDS R3, R1, R2
SUB R3, R1, R2
SUBS R4, R1, R2
STOP: B STOP
.end
Команда |
NF (31 разряд) |
ZF (30 разряд) |
CF (29 разряд) |
VF (28 разряд) |
ADD |
- |
- |
- |
- |
ADDS |
1 |
0 |
0 |
1 |
SUB |
- |
- |
- |
- |
SUBS |
0 |
0 |
1 |
0 |
Для определения переполнения в ARM ассемблере следует использовать команду CMN, а не CMP.
Разница между CMP и CMN:
CMP (Compare) — это команда, которая выполняет вычитание между двумя регистрами, но не сохраняет результат в регистре. Она лишь обновляет флаги состояния CPSR, такие как флаги переноса (C), переполнения (V), нуля (Z) и отрицательного результата (N). Основной целью команды CMP является сравнение двух чисел. Эта команда не может установить флаг переполнения, так как операнды априори с разными знаками.
CMN (Compare Negative) — это команда, которая выполняет сложение между двумя регистрами и также обновляет флаги CPSR, но не сохраняет результат. В отличие от CMP, она работает с суммой двух чисел, а не с их разностью. И поэтому может выставить флаг переполнения.
Программа 3
.text
.global _start
_start: LDR R0, ADR
LDR R1, CNT
LDR R5, #2
MET:
LDR R2, [R0]
TST R2, #8
ADDEQ R3, R1, R2
SUBNE R3, R1, R2
STR R3, RESULT
SUBS R5, #1
BNE MET
fin: B fin
ADR: .word 0xFF200040
CNT: .word 100
RESULT: .space 4
.end
Первое число: 12 (содержит 3-ий разряд, при TST R2, #8 не будет выставлен Zero flag (0), команда SUBNE выполнится, потому что флаг Z не установлен)
Второе число: 20 (не содержит 3-ий разряд, при TST R2, #8 будет выставлен Zero flag (1), команда ADDEQ выполнится, потому что флаг Z установлен.)
№ цикла |
R3 (ADDEQ) |
R3 (SUBNE) |
RESULT |
1. |
- |
88 (0x00000058) |
88 (0x00000058) |
2. |
120 (0x00000078) |
- |
120 (0x00000078) |
Вывод
В ходе лабораторной работы были изучены команды для выполнения арифметических операций и работы с условиями на ассемблере, включая использование флагов. Результаты программ подтвердили правильность работы арифметических операций, условных команд и работы с памятью.
Санкт-Петербург
2025 г.
