Fix discovered misspelling

This commit is contained in:
AstiaSun 2019-11-01 11:20:56 +02:00
parent 6b5938017b
commit 210e9b50ee

View File

@ -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"