Learn Assembly
Τμήμα Πληροφορικής & Τηλεπικοινωνιών
Αρχιτεκτονική Υπολογιστών Εργαστήριο - 3ο Εξάμηνο
Κωνσταντίνος Σακκάς
Copyright © 2023 Κωνσταντίνος Σακκάς. Με την επιφύλαξη παντός δικαιώματος
Assembly Mips - Παραδείγματα
- Hello World!
- Άμεση Πρόσθεση
- Πρόσθεση δύο αριθμών απο τον χρήστη
- Επαναληπτικό Αθροισμα
- Παράδειγμα με IF
- Παράδειγμα με FOR
- Παράδειγμα με While
- Παράδειγμα πολλαπλασιαμό
- Σύνθετο παράδειγμα Πρόσθεσης
- Η εντολή jal
- Έλεγχος Παλίνδρομου Αριθμού
2η Εργασία Εξαμήνου
- Άμεση πρόσθεση
- Άμεση πρόσθεση δεκαδικού αριθμού στην ίδια μεταβλητή
- Άμεση αρχικοποίηση αριθμού με 0
- Άμεση πρόσθεση δεκαδικού αριθμού σε διαφορετική μεταβλητή
- Άμεση πρόσθεση του 0 σε μεταβλητές
Εισαγωγή στην Assembly
- Δήλωση μεταβλητών
- Πρόσθεση (δύο μεταβλητές)
- Πρόσθεση (περισσότερες μεταβλητές)
- Αφαίρεση (δύο μεταβλητές)
- Αφαίρεση (περισσότερες μεταβλητές)
- Πολλαπλασιασμός
- Διαίρεση
- Συνδυασμός πράξεων
Assembly
- Πράξεις με $
- Φόρτωση δεδομένων
- Φόρτωση δεδομένων με offset
- Αποθήκευση δεδομένων
- Φόρτωση και Αποθήκευση δεδομένων
- Σταθερές μεταβλητές
- Άμεση πρόσθεση
- Η σταθερά μηδέν (zero)
Εντολές στην Assembly (εκτός ύλης)
- Σύμβολα
- Η εντολή MOV (move)
- Η εντολή JMP (jump)
- Η εντολή FCB (Field Constant Byte)
- Η εντολή FDB (Field Double Byte)
- Η εντολή EQU (EQUate)
- Η εντολή DBNZ (Decrement & Branch if Not Zero)
- Η εντολή DBNZA (Decrement & Branch if Not Zero - Accumulator)
- Η εντολή DBNZX (Decrement & Branch if Not Zero - IndeX)
- Οι εντολές DEC, DECA, DECX
- Οι εντολές INC, INCA, INCX
- Οι εντολές BNE (Branch if Not Equal) BEQ (Branch if Equal)
- Οι εντολές JSR (Jump to SubRoutine) RTS (ReTurn from Subroutine)
- Οι εντολές BRSET (BRanch if n bit SET) BRSET (BRanch if n bit CLeaR)
- Η εντολή EOR (Exclusive OR)
- Η εντολή LDA (LoaD Accumulator)
- Η εντολή SΤA (STore Accumulator)
- Η εντολή LDX (LoaD IndeX)
- Η εντολή SΤX (STore IndeX)
- Η εντολή CLRX (CLeaR IndeX)
- Η εντολή CLRA (CLeaR Accumulator)
- Η εντολή CLR (CLeaR register)
- Η εντολή CMPX (CoMPare indeX)
- Η εντολή CMPΑ (CoMPare Αccumulator)
- Η εντολή BLS (Branch if Lower or Same)
- Η εντολή BLO (Branch if LOwer)
- Η εντολή BHS (Branch if Higher or Same)
- Η εντολή BHI (Branch if HIgher)
MIPS & Assembly
- Αριστερή λογική ολίσθηση
- Δεξιά λογική ολίσθηση
- Λογικό AND
- Λογικό OR
- Λογικό NOR - NOT
- ∆ιακλαδώσεις υπό συνθήκη - BRQ (διακλάδωση σε περίπτωση ισότητας)
- ∆ιακλαδώσεις υπό συνθήκη - BNE (διακλάδωση σε περίπτωση µη ισότητας)
- If - then - else
- Παράδειγμα με IF
- While
- Παράδειγμα με While
- Εντολή set-on-less-than
- Η For
- Προσηµασµένοι & Απρόσηµοι
- ∆ιαδικασίες στο MIPS
- Κλήση & επιστροφή
- ∆ιαδικασία-φύλλο (leaf)
Pseudo-instructions
In MIPS, some operations can be performed with help of other instructions. The most common operations are unified in pseudo-instructions — they can be coded in assembly language, and assembler will expand them to real instructions. The exact expansion is compiler-defined, but the result should be similar to ours:
Data moves
Name | Assembly syntax | Expansion | Operation in C |
---|---|---|---|
move | move $t, $s |
or $t, $s, $zero |
t = s |
clear | clear $t |
or $t, $zero, $zero |
t = 0 |
load 16-bit immediate | li $t, C |
ori $t, $zero, C_lo |
t = C |
load 32-bit immediate | li $t, C |
lui $t, C_hi ori $t, $t, C_lo |
t = C |
load label address | la $t, A |
lui $t, A_hi ori $t, $t, A_lo |
t = A |
Branches
Name | Assembly syntax | Expansion |
---|---|---|
branch unconditionally | b C |
beq $zero, $zero, C |
branch unconditionally and link |
bal C |
bgezal $zero, C |
branch if greater than | bgt $s, $t, C |
slt $at, $t, $s bne $at, $zero, C |
branch if less than | blt $s, $t, C |
slt $at, $s, $t bne $at, $zero, C |
branch if greater than or equal |
bge $s, $t, C |
slt $at, $s, $t beq $at, $zero, C |
branch if less than or equal |
ble $s, $t, C |
slt $at, $t, $s beq $at, $zero, C |
branch if greater than unsigned |
bgtu $s, $t, C |
sltu $at, $t, $s bne $at, $zero, C |
branch if zero | beqz $s, C |
beq $s, $zero, C |
branch if equal to immediate | beq $t, V, C |
ori $at, $zero, V beq $t, $at, C |
branch if not equal to immediate | bne $t, V, C |
ori $at, $zero, V bne $t, $at, C |
Multiplication/Division
Name | Assembly syntax | Expansion | Operation in C |
---|---|---|---|
multiplicate and return 32 bits |
mul $d, $s, $t |
mult $s, $t mflo $d |
d = (s * t) & 0xFFFFFFFF |
quotient | div $d, $s, $t |
div $s, $t mflo $d |
d = s / t |
remainder | rem $d, $s, $t |
div $s, $t mfhi $d |
d = s % t |
Jumps
Name | Assembly syntax | Expansion | Operation in C |
---|---|---|---|
jump register and link to ra | jalr $s |
jalr $s, $ra |
ra = PC + 4; goto s; |
Logical operations
Name | Assembly syntax | Expansion | Operation in C |
---|---|---|---|
not | not $t, $s |
nor $t, $s, $zero |
t = ~s |
No-operations
Name | Assembly syntax | Expansion | Operation in C |
---|---|---|---|
nop | nop |
sll $zero, $zero, 0 |
{} |
In fact, every MIPS instruction that has $zero
as its destination and doesn’t touch memory, access I/O system, and/or call a trap, can be treated as a nop
; but using sll $zero, $zero, 0
is the most convenient because it’s byte code is all-zeroes 0x00000000
.
Should we implement pseudo-instructions
Since 2014/2015, all instructions are printed as real MIPS instructions in MIPT-MIPS. Unexpanded pseudo-instructions are left only in testing traces source files (.s
files).