mirror of
https://github.com/adambard/learnxinyminutes-docs.git
synced 2024-12-24 10:01:38 +00:00
Fix discovered misspelling
This commit is contained in:
parent
6b5938017b
commit
210e9b50ee
@ -8,9 +8,9 @@ translators:
|
|||||||
lang: uk-ua
|
lang: uk-ua
|
||||||
---
|
---
|
||||||
|
|
||||||
Мова асемблера MIPS (англ. Microprocessor without Interlocked Pipeline Stages) була написана для роботи з мікропорцесорами MIPS, парадигма яких була описана в 1981 році [Джоном Геннессі](https://uk.wikipedia.org/wiki/Джон_Лерой_Геннессі). Ці RISC процесори використовуються у таких вбудованих системах, як маршрутизатори та мережеві шлюзи.
|
Мова ассемблера MIPS (англ. Microprocessor without Interlocked Pipeline Stages) була написана для роботи з мікропроцесорами MIPS, парадигма яких була описана в 1981 році [Джоном Геннессі](https://uk.wikipedia.org/wiki/Джон_Лерой_Геннессі). Ці RISC процесори використовуються у таких вбудованих системах, як маршрутизатори та мережеві шлюзи.
|
||||||
|
|
||||||
[Read More](https://en.wikipedia.org/wiki/MIPS_architecture)
|
[Детальніше](https://en.wikipedia.org/wiki/MIPS_architecture)
|
||||||
|
|
||||||
```asm
|
```asm
|
||||||
# Коментарі позначені як'#'
|
# Коментарі позначені як'#'
|
||||||
@ -22,7 +22,7 @@ lang: uk-ua
|
|||||||
.data # У цьому розділі дані зберігаються у пам'яті, виділеній в RAM, подібно до змінних
|
.data # У цьому розділі дані зберігаються у пам'яті, виділеній в RAM, подібно до змінних
|
||||||
# в мовах програмування вищого рівня
|
# в мовах програмування вищого рівня
|
||||||
|
|
||||||
# Змінна оголошується наступним чином: [назва]: .[тип] [значенння]
|
# Змінна оголошується наступним чином: [назва]: .[тип] [значення]
|
||||||
# Наприклад:
|
# Наприклад:
|
||||||
hello_world: .asciiz "Hello World\n" # Оголосити текстову змінну
|
hello_world: .asciiz "Hello World\n" # Оголосити текстову змінну
|
||||||
num1: .word 42 # word - це чисельний тип 32-бітного розряду
|
num1: .word 42 # word - це чисельний тип 32-бітного розряду
|
||||||
@ -39,7 +39,7 @@ lang: uk-ua
|
|||||||
_float: .float 3.14 # 4 байти
|
_float: .float 3.14 # 4 байти
|
||||||
_double: .double 7.0 # 8 байтів
|
_double: .double 7.0 # 8 байтів
|
||||||
|
|
||||||
.align 2 # Вирівнення пам'яті даних, де число
|
.align 2 # Вирівнювання пам'яті даних, де число
|
||||||
# показує кількість байтів, вирівнених
|
# показує кількість байтів, вирівнених
|
||||||
# у степені 2. (.align 2 означає
|
# у степені 2. (.align 2 означає
|
||||||
# чисельне (word) вирівнювання оскільки
|
# чисельне (word) вирівнювання оскільки
|
||||||
@ -63,15 +63,15 @@ lang: uk-ua
|
|||||||
syscall # Виконує зазначену системну команду
|
syscall # Виконує зазначену системну команду
|
||||||
# з обраним аргументом ($a0)
|
# з обраним аргументом ($a0)
|
||||||
|
|
||||||
# Регісти (використовуються, щоб тримати дані протягом виконання програми)
|
# Регістри (використовуються, щоб тримати дані протягом виконання програми)
|
||||||
# $t0 - $t9 # Тимчасові регістри використовуються
|
# $t0 - $t9 # Тимчасові регістри використовуються
|
||||||
# для проміжних обчислень всередині
|
# для проміжних обчислень всередині
|
||||||
# підпрограм (не зберігаються між
|
# підпрограм (не зберігаються між
|
||||||
# викликами функцій)
|
# викликами функцій)
|
||||||
|
|
||||||
# $s0 - $s7 # Збережені регісти, у яких значення
|
# $s0 - $s7 # Збережені регістри, у яких значення
|
||||||
# збегіраються між викликами підпрограм.
|
# зберігаються між викликами підпрограм.
|
||||||
# Зазвичай збегрігаються у стеку.
|
# Зазвичай зберігаються у стеку.
|
||||||
|
|
||||||
# $a0 - $a3 # Регістри для передачі аргументів для
|
# $a0 - $a3 # Регістри для передачі аргументів для
|
||||||
# підпрограм
|
# підпрограм
|
||||||
@ -82,28 +82,28 @@ lang: uk-ua
|
|||||||
la $t0, label # Скопіювати адресу в пам'яті, де
|
la $t0, label # Скопіювати адресу в пам'яті, де
|
||||||
# зберігається значення змінної label
|
# зберігається значення змінної label
|
||||||
# в регістр $t0
|
# в регістр $t0
|
||||||
lw $t0, label # Скопівати чисельне значення з пам'яті
|
lw $t0, label # Скопіювати чисельне значення з пам'яті
|
||||||
lw $t1, 4($s0) # Скопівати чисельне значення з адреси
|
lw $t1, 4($s0) # Скопіювати чисельне значення з адреси
|
||||||
# пам'яті ресгіста зі зміщенням в
|
# пам'яті регістра зі зміщенням в
|
||||||
# 4 байти (адреса + 4)
|
# 4 байти (адреса + 4)
|
||||||
lb $t2, label # Скопіювати буквений символ в частину
|
lb $t2, label # Скопіювати буквений символ в частину
|
||||||
# нижчого порядку регістра $t2
|
# нижчого порядку регістра $t2
|
||||||
lb $t2, 0($s0) # Скопіювати буквений символ з адреси
|
lb $t2, 0($s0) # Скопіювати буквений символ з адреси
|
||||||
# в $s0 із зсувом 0
|
# в $s0 із зсувом 0
|
||||||
# Подіне використання і 'lh' для halfwords
|
# Подібне використання і 'lh' для halfwords
|
||||||
|
|
||||||
sw $t0, label # Збегігти чисельне значення в адресу в
|
sw $t0, label # Зберегти чисельне значення в адресу в
|
||||||
# пам'яті, що відповідає змінній label
|
# пам'яті, що відповідає змінній label
|
||||||
sw $t0, 8($s0) # Збегігти чисельне значення в адресу,
|
sw $t0, 8($s0) # Зберегти чисельне значення в адресу,
|
||||||
# зазначеній у $s0, та зі зсувом у 8 байтів
|
# що зазначена у $s0, та зі зсувом у 8 байтів
|
||||||
# Така ж ідея використання 'sb' та 'sh' для буквених символів та halfwords.
|
# Така ж ідея використання 'sb' та 'sh' для буквених символів та halfwords.
|
||||||
# 'sa' не існує
|
# 'sa' не існує
|
||||||
|
|
||||||
|
|
||||||
### Математичні операції ###
|
### Математичні операції ###
|
||||||
_math:
|
_math:
|
||||||
# Пам'ятаємо, що попередньо потрібно завантажити данні в пам'ять
|
# Пам'ятаємо, що попередньо потрібно завантажити дані в пам'ять
|
||||||
lw $t0, num # Із розділа з данними
|
lw $t0, num # Із розділа з даними
|
||||||
li $t0, 5 # Або безпосередньо з константи
|
li $t0, 5 # Або безпосередньо з константи
|
||||||
li $t1, 6
|
li $t1, 6
|
||||||
add $t2, $t0, $t1 # $t2 = $t0 + $t1
|
add $t2, $t0, $t1 # $t2 = $t0 + $t1
|
||||||
@ -114,39 +114,39 @@ lang: uk-ua
|
|||||||
div $t0, $t1 # Виконує $t0 / $t1. Отримати частку можна
|
div $t0, $t1 # Виконує $t0 / $t1. Отримати частку можна
|
||||||
# за допомогою команди 'mflo', остаток - 'mfhi'
|
# за допомогою команди 'mflo', остаток - 'mfhi'
|
||||||
|
|
||||||
# Bitwise Shifting
|
# Бітовий зсув
|
||||||
sll $t0, $t0, 2 # Побітовий здвиг вліво з безпосереднім
|
sll $t0, $t0, 2 # Побітовий зсув вліво на 2. Біти вищого порядку
|
||||||
# значенням (константою) 2
|
# не зберігаються, нищого - заповнюються 0
|
||||||
sllv $t0, $t1, $t2 # Здвиг вліво зі змінною кількістю у
|
sllv $t0, $t1, $t2 # Зсув вліво зі змінною кількістю у
|
||||||
# регістрі
|
# регістрі
|
||||||
srl $t0, $t0, 5 # Побітовий здвиг вправо (не збегігає
|
srl $t0, $t0, 5 # Побітовий зсув вправо на 5 (не зберігає
|
||||||
# знак, знак розширюється 0)
|
# біти, біти зліва заповнюються 0)
|
||||||
srlv $t0, $t1, $t2 # Здвиг вправо зі змінною кількістю у
|
srlv $t0, $t1, $t2 # Зсув вправо зі змінною кількістю у
|
||||||
# регістрі
|
|
||||||
sra $t0, $t0, 7 # Побітовий арифметичний збвиг вправо
|
|
||||||
# (зберігає знак)
|
|
||||||
srav $t0, $t1, $t2 # Здвиг вправо зі змінною кількістю у
|
|
||||||
# регістрі
|
# регістрі
|
||||||
|
sra $t0, $t0, 7 # Побітовий арифметичний зсув вправо
|
||||||
|
# (зберігає біти)
|
||||||
|
srav $t0, $t1, $t2 # Зсув вправо зі змінною кількістю у
|
||||||
|
# регістрі зі збереження значеннь бітів
|
||||||
|
|
||||||
# Bitwise operators
|
# Побітові операції
|
||||||
and $t0, $t1, $t2 # Побітове І (AND)
|
and $t0, $t1, $t2 # Побітове І (AND)
|
||||||
andi $t0, $t1, 0xFFF # Побітове І з беспосереднім значенням
|
andi $t0, $t1, 0xFFF # Побітове І з безпосереднім значенням
|
||||||
or $t0, $t1, $t2 # Побітове АЛЕ (OR)
|
or $t0, $t1, $t2 # Побітове АБО (OR)
|
||||||
ori $t0, $t1, 0xFFF # Побітове АЛЕ з беспосереднім значенням
|
ori $t0, $t1, 0xFFF # Побітове АБО з безпосереднім значенням
|
||||||
xor $t0, $t1, $t2 # Побітова виключна диз'юнкція (XOR)
|
xor $t0, $t1, $t2 # Побітова виключна диз'юнкція (XOR)
|
||||||
xori $t0, $t1, 0xFFF # Побітове XOR з беспосереднім значенням
|
xori $t0, $t1, 0xFFF # Побітове XOR з безпосереднім значенням
|
||||||
nor $t0, $t1, $t2 # Побітова стрілка Пірса (NOR)
|
nor $t0, $t1, $t2 # Побітова стрілка Пірса (NOR)
|
||||||
|
|
||||||
## Розгалуження ##
|
## Розгалуження ##
|
||||||
_branching:
|
_branching:
|
||||||
# В овсновному інструкції розгалуження мають наступну форму:
|
# В основному інструкції розгалуження мають наступну форму:
|
||||||
# <instr> <reg1> <reg2> <label>
|
# <instr> <reg1> <reg2> <label>
|
||||||
# де label - це назва змінної, в яку ми хочемо перейти, якщо зазначене твердження
|
# де label - це назва змінної, в яку ми хочемо перейти, якщо зазначене твердження
|
||||||
# правдиве
|
# правдиве
|
||||||
|
|
||||||
beq $t0, $t1, reg_eq # Перейдемо у розгалуження reg_eq
|
beq $t0, $t1, reg_eq # Перейдемо у розгалуження reg_eq
|
||||||
# якщо $t0 == $t1, інакше -
|
# якщо $t0 == $t1, інакше -
|
||||||
# винонати наступну строку
|
# виконати наступний рядок
|
||||||
bne $t0, $t1, reg_neq # Розгалужується, якщо $t0 != $t1
|
bne $t0, $t1, reg_neq # Розгалужується, якщо $t0 != $t1
|
||||||
b branch_target # Розгалуження без умови завжди виконується
|
b branch_target # Розгалуження без умови завжди виконується
|
||||||
beqz $t0, req_eq_zero # Розгалужується, якщо $t0 == 0
|
beqz $t0, req_eq_zero # Розгалужується, якщо $t0 == 0
|
||||||
@ -173,7 +173,7 @@ lang: uk-ua
|
|||||||
L1:
|
L1:
|
||||||
sub $s0, $s0, $s3 # f = f - i
|
sub $s0, $s0, $s3 # f = f - i
|
||||||
|
|
||||||
# Нижще наведений приклад знаходження максимального значееня з 3 чисел
|
# Нижче наведений приклад знаходження максимального значення з 3 чисел
|
||||||
# Пряма трансляція в Java з логіки MIPS:
|
# Пряма трансляція в Java з логіки MIPS:
|
||||||
# if (a > b)
|
# if (a > b)
|
||||||
# if (a > c)
|
# if (a > c)
|
||||||
@ -185,13 +185,13 @@ lang: uk-ua
|
|||||||
# else
|
# else
|
||||||
# max = c;
|
# max = c;
|
||||||
|
|
||||||
# Нехай $s0 = a, $s1 = b, $s2 = c, $v0 = повернути регіст
|
# Нехай $s0 = a, $s1 = b, $s2 = c, $v0 = повернути регістр
|
||||||
ble $s0, $s1, a_LTE_b # якщо (a <= b) розгалуження(a_LTE_b)
|
ble $s0, $s1, a_LTE_b # якщо (a <= b) розгалуження(a_LTE_b)
|
||||||
ble $s0, $s2, max_C # якщо (a > b && a <=c) розгалуження(max_C)
|
ble $s0, $s2, max_C # якщо (a > b && a <=c) розгалуження(max_C)
|
||||||
move $v0, $s1 # інакше [a > b && a > c] max = a
|
move $v0, $s1 # інакше [a > b && a > c] max = a
|
||||||
j done # Перейти в кінець програми
|
j done # Перейти в кінець програми
|
||||||
|
|
||||||
a_LTE_b: # Мітка розгаруження, коли a <= b
|
a_LTE_b: # Мітка розгалуження, коли a <= b
|
||||||
ble $s1, $s2, max_C # якщо (a <= b && b <= c) розгалуження(max_C)
|
ble $s1, $s2, max_C # якщо (a <= b && b <= c) розгалуження(max_C)
|
||||||
move $v0, $s1 # якщо (a <= b && b > c) max = b
|
move $v0, $s1 # якщо (a <= b && b > c) max = b
|
||||||
j done # Перейти в кінець програми
|
j done # Перейти в кінець програми
|
||||||
@ -203,16 +203,16 @@ lang: uk-ua
|
|||||||
|
|
||||||
## Цикли ##
|
## Цикли ##
|
||||||
_loops:
|
_loops:
|
||||||
# Цикл складається з умови виходу та з інстукції переходу після його завершення
|
# Цикл складається з умови виходу та з інструкції переходу після його завершення
|
||||||
li $t0, 0
|
li $t0, 0
|
||||||
while:
|
while:
|
||||||
bgt $t0, 10, end_while # Коли $t0 менше 10, продовжувати інтерації
|
bgt $t0, 10, end_while # Коли $t0 менше 10, продовжувати ітерації
|
||||||
addi $t0, $t0, 1 # Збільшити значення
|
addi $t0, $t0, 1 # Збільшити значення
|
||||||
j while # Перейти на початок циклу
|
j while # Перейти на початок циклу
|
||||||
end_while:
|
end_while:
|
||||||
|
|
||||||
# Транспонування 2D матриці
|
# Транспонування 2D матриці
|
||||||
# Припустмо, що $a0 зберігає адресу цілочисельної матриці розмірністю 3 x 3
|
# Припустимо, що $a0 зберігає адресу цілочисельної матриці розмірністю 3 x 3
|
||||||
li $t0, 0 # Лічильник для i
|
li $t0, 0 # Лічильник для i
|
||||||
li $t1, 0 # Лічильник для j
|
li $t1, 0 # Лічильник для j
|
||||||
matrix_row:
|
matrix_row:
|
||||||
@ -233,10 +233,10 @@ lang: uk-ua
|
|||||||
|
|
||||||
## Функції ##
|
## Функції ##
|
||||||
_functions:
|
_functions:
|
||||||
# Фукнції - це процедури, що викликаються, приймають аргументи та повертають значення
|
# Функції - це процедури, що викликаються, приймають аргументи та повертають значення
|
||||||
|
|
||||||
main: # Програма починається з головної функції
|
main: # Програма починається з головної функції
|
||||||
jal return_1 # jal збереже поточний PC в $ra,
|
jal return_1 # jal збереже поточний ПЦ (програмний центр) в $ra,
|
||||||
# а потім перейде до return_1
|
# а потім перейде до return_1
|
||||||
|
|
||||||
# Як передати аргументи?
|
# Як передати аргументи?
|
||||||
@ -246,36 +246,36 @@ lang: uk-ua
|
|||||||
jal sum # Тепер ми можемо викликати функцію
|
jal sum # Тепер ми можемо викликати функцію
|
||||||
|
|
||||||
# Як щодо рекурсії?
|
# Як щодо рекурсії?
|
||||||
# Тут потрібно дещо більше роботи оскільки ми маємо впевнетись, що ми збережемо
|
# Тут потрібно дещо більше роботи оскільки ми маємо впевнитись, що ми збережемо
|
||||||
# та зчитаємо попередній PC в $ra, оскільки jal автоматично перепише її при виклику
|
# та зчитаємо попередній ПЦ в $ra, оскільки jal автоматично перепише її при виклику
|
||||||
li $a0, 3
|
li $a0, 3
|
||||||
jal fact
|
jal fact
|
||||||
|
|
||||||
li $v0, 10
|
li $v0, 10
|
||||||
syscall
|
syscall
|
||||||
|
|
||||||
# Ця функйія повертає 1
|
# Ця функція повертає 1
|
||||||
return_1:
|
return_1:
|
||||||
li $v0, 1 # Завантажити val в регіст $v0
|
li $v0, 1 # Завантажити val в регіст $v0
|
||||||
jr $ra # Повернутись до попереднього PC і продовжити виконання
|
jr $ra # Повернутись до попереднього ПЦ і продовжити виконання
|
||||||
|
|
||||||
|
|
||||||
# Function with 2 args
|
# Функція з двома аргументами
|
||||||
sum:
|
sum:
|
||||||
add $v0, $a0, $a1
|
add $v0, $a0, $a1
|
||||||
jr $ra # Повернутись
|
jr $ra # Повернутись
|
||||||
|
|
||||||
# Фекурсивна функція, яка знаходить факторіал
|
# Рекурсивна функція, яка знаходить факторіал
|
||||||
fact:
|
fact:
|
||||||
addi $sp, $sp, -8 # Виділити місце в стеку
|
addi $sp, $sp, -8 # Виділити місце в стеку
|
||||||
sw $s0, ($sp) # Зберегти регістр, що містить поточне число
|
sw $s0, ($sp) # Зберегти регістр, що містить поточне число
|
||||||
sw $ra, 4($sp) # Зберегти попереднє PC
|
sw $ra, 4($sp) # Зберегти попередній ПЦ
|
||||||
|
|
||||||
li $v0, 1 # Проініціліазувати значення, що повертатиметься
|
li $v0, 1 # Проініціалізувати значення, що повертатиметься
|
||||||
beq $a0, 0, fact_done # Закінчити, якщо параметр 0
|
beq $a0, 0, fact_done # Закінчити, якщо параметр 0
|
||||||
|
|
||||||
# Інакше, продовжити рекурсію
|
# Інакше, продовжити рекурсію
|
||||||
move $s0, $a0 # Скоріювати $a0 в $s0
|
move $s0, $a0 # Скопіювати $a0 в $s0
|
||||||
sub $a0, $a0, 1
|
sub $a0, $a0, 1
|
||||||
jal fact
|
jal fact
|
||||||
|
|
||||||
@ -283,7 +283,7 @@ lang: uk-ua
|
|||||||
|
|
||||||
fact_done:
|
fact_done:
|
||||||
lw $s0, ($sp)
|
lw $s0, ($sp)
|
||||||
lw $ra, ($sp) # Відновити PC
|
lw $ra, ($sp) # Відновити ПЦ
|
||||||
addi $sp, $sp, 8
|
addi $sp, $sp, 8
|
||||||
|
|
||||||
jr $ra
|
jr $ra
|
||||||
@ -295,9 +295,9 @@ lang: uk-ua
|
|||||||
# Це не заміна функцій.
|
# Це не заміна функцій.
|
||||||
# Вони мають бути оголошені перед використанням
|
# Вони мають бути оголошені перед використанням
|
||||||
|
|
||||||
# Макрос для виведення нових строк (оскільки операція лосить часто виконується)
|
# Макрос для виведення нових рядків (оскільки операція досить часто виконується)
|
||||||
.macro println()
|
.macro println()
|
||||||
la $a0, newline # Значення нової строки зберігатиметься тут
|
la $a0, newline # Значення нового рядка зберігатиметься тут
|
||||||
li $v0, 4
|
li $v0, 4
|
||||||
syscall
|
syscall
|
||||||
.end_macro
|
.end_macro
|
||||||
@ -316,7 +316,7 @@ lang: uk-ua
|
|||||||
li $t0, 1
|
li $t0, 1
|
||||||
print_int($t0)
|
print_int($t0)
|
||||||
|
|
||||||
# Ми таком можемо передавати безпосередньо значення в макроси
|
# Значення також можна передавати безпосередньо в макроси
|
||||||
.macro immediates(%a, %b)
|
.macro immediates(%a, %b)
|
||||||
add $t0, %a, %b
|
add $t0, %a, %b
|
||||||
.end_macro
|
.end_macro
|
||||||
@ -336,13 +336,13 @@ lang: uk-ua
|
|||||||
.data
|
.data
|
||||||
list: .word 3, 0, 1, 2, 6 # Це масив чисел
|
list: .word 3, 0, 1, 2, 6 # Це масив чисел
|
||||||
char_arr: .asciiz "hello" # Це текстовий масив
|
char_arr: .asciiz "hello" # Це текстовий масив
|
||||||
buffer: .space 128 # Видтляє блок пам'яті, що
|
buffer: .space 128 # Виділяє блок пам'яті, що
|
||||||
# автоматично не очищується
|
# автоматично не очищується
|
||||||
# Ці блоки пам'яті вирівнюють
|
# Ці блоки пам'яті вирівнені
|
||||||
# оддин одного
|
# вирівнені поруч один з одним
|
||||||
|
|
||||||
.text
|
.text
|
||||||
la $s0, list # Завантажити адрегу у список
|
la $s0, list # Завантажити адресу списку
|
||||||
li $t0, 0 # Лічильник
|
li $t0, 0 # Лічильник
|
||||||
li $t1, 5 # Довжина списку
|
li $t1, 5 # Довжина списку
|
||||||
|
|
||||||
@ -359,7 +359,7 @@ lang: uk-ua
|
|||||||
end_loop:
|
end_loop:
|
||||||
|
|
||||||
## Включення ##
|
## Включення ##
|
||||||
# Це потрібно для імпорту стороннії файлівв програму (але насправді, код з цього файлу
|
# Потрібно для імпорту сторонніх файлів у програму (насправді, код з цього файлу
|
||||||
# копіюється та вставляється в місце, де оголошений імпорт)
|
# копіюється та вставляється в місце, де оголошений імпорт)
|
||||||
.include "somefile.asm"
|
.include "somefile.asm"
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user