[AC2] Aula01 Addicionals
Signed-off-by: TiagoRG <tiago.rgarcia@ua.pt>
This commit is contained in:
parent
bab030ce63
commit
4d80ab7936
|
@ -0,0 +1,39 @@
|
||||||
|
#include <detpic32.h>
|
||||||
|
|
||||||
|
#define UP 1
|
||||||
|
#define DOWN 0
|
||||||
|
|
||||||
|
void wait(int);
|
||||||
|
|
||||||
|
int main(void) {
|
||||||
|
int state = 0;
|
||||||
|
int cnt = 0;
|
||||||
|
char c;
|
||||||
|
do {
|
||||||
|
putChar('\r'); // Carriage return character
|
||||||
|
printInt(cnt, 10 | 3 << 16); // 0x0003000A: decimal w/ 3 digits
|
||||||
|
putChar('\t'); // Tab character
|
||||||
|
printInt(cnt, 2 | 8 << 16); // 0x00080002: binary w/ 8 bits
|
||||||
|
|
||||||
|
wait(5); // wait 0.5s
|
||||||
|
|
||||||
|
c = inkey();
|
||||||
|
if (c == '+')
|
||||||
|
state = UP;
|
||||||
|
if (c == '-')
|
||||||
|
state = DOWN;
|
||||||
|
if (c == 'S')
|
||||||
|
while (inkey() != 'R');
|
||||||
|
|
||||||
|
if (state == UP)
|
||||||
|
cnt = (cnt + 1) & 0xFF; // Up counter MOD 256
|
||||||
|
else
|
||||||
|
cnt = (cnt - 1) & 0xFF; // Down counter MOD 256
|
||||||
|
} while (c != 'q');
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wait(int ts) {
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < 515000 * ts; i++); // wait approximately ts/10 seconds
|
||||||
|
}
|
|
@ -0,0 +1,107 @@
|
||||||
|
.equ INKEY, 1
|
||||||
|
.equ GETCHAR, 2
|
||||||
|
.equ PUTCHAR, 3
|
||||||
|
.equ READ_INT, 4
|
||||||
|
.equ READ_INT10, 5
|
||||||
|
.equ PRINT_INT, 6
|
||||||
|
.equ PRINT_INT10, 7
|
||||||
|
.equ PRINT_STR, 8
|
||||||
|
.equ READ_STR, 9
|
||||||
|
.equ EXIT, 10
|
||||||
|
.equ READ_CORE_TIMER, 11
|
||||||
|
.equ RESET_CORE_TIMER, 12
|
||||||
|
|
||||||
|
.equ UP, 1
|
||||||
|
.equ DOWN, 0
|
||||||
|
|
||||||
|
.data
|
||||||
|
.text
|
||||||
|
.globl main
|
||||||
|
|
||||||
|
# Mapa de registos
|
||||||
|
# $t0 → state
|
||||||
|
# $t1 → cnt
|
||||||
|
# $t2 → c
|
||||||
|
|
||||||
|
main:
|
||||||
|
li $t0, 0
|
||||||
|
li $t1, 0
|
||||||
|
|
||||||
|
do:
|
||||||
|
li $a0, '\r'
|
||||||
|
li $v0, PUTCHAR
|
||||||
|
syscall
|
||||||
|
|
||||||
|
move $a0, $t1
|
||||||
|
li $a1, 3
|
||||||
|
sll $a1, $a1, 16
|
||||||
|
ori $a1, $a1, 10
|
||||||
|
li $v0, PRINT_INT
|
||||||
|
syscall
|
||||||
|
|
||||||
|
li $a0, '\t'
|
||||||
|
li $v0, PUTCHAR
|
||||||
|
syscall
|
||||||
|
|
||||||
|
move $a0, $t1
|
||||||
|
li $a1, 8
|
||||||
|
sll $a1, $a1, 16
|
||||||
|
ori $a1, $a1, 2
|
||||||
|
li $v0, PRINT_INT
|
||||||
|
syscall
|
||||||
|
|
||||||
|
addi $sp, $sp, -16
|
||||||
|
sw $ra, 0($sp)
|
||||||
|
sw $t0, 4($sp)
|
||||||
|
sw $t1, 8($sp)
|
||||||
|
sw $t2, 12($sp)
|
||||||
|
li $a0, 5
|
||||||
|
jal wait
|
||||||
|
lw $ra, 0($sp)
|
||||||
|
lw $t0, 4($sp)
|
||||||
|
lw $t1, 8($sp)
|
||||||
|
lw $t2, 12($sp)
|
||||||
|
addi $sp, $sp, 16
|
||||||
|
|
||||||
|
li $v0, INKEY
|
||||||
|
syscall
|
||||||
|
move $t2, $v0
|
||||||
|
|
||||||
|
beq $t2, '+', if_plus
|
||||||
|
beq $t2, '-', if_minus
|
||||||
|
beq $t2, 'S', if_stop
|
||||||
|
j if
|
||||||
|
if_plus:
|
||||||
|
li $t0, UP
|
||||||
|
j if
|
||||||
|
if_minus:
|
||||||
|
li $t0, DOWN
|
||||||
|
j if
|
||||||
|
if_stop:
|
||||||
|
li $v0, INKEY
|
||||||
|
syscall
|
||||||
|
move $t2, $v0
|
||||||
|
bne $t2, 'R', if_stop
|
||||||
|
|
||||||
|
if:
|
||||||
|
bne $t0, UP, else
|
||||||
|
addi $t1, $t1, 1
|
||||||
|
andi $t1, $t1, 0xFF
|
||||||
|
j endif
|
||||||
|
else:
|
||||||
|
addi $t1, $t1, -1
|
||||||
|
andi $t1, $t1, 0xFF
|
||||||
|
endif:
|
||||||
|
bne $t2, 'q', do
|
||||||
|
jr $ra
|
||||||
|
|
||||||
|
|
||||||
|
wait:
|
||||||
|
li $t0, 0
|
||||||
|
mul $t1, $a0, 515000
|
||||||
|
wait_loop:
|
||||||
|
bge $t0, $t1, wait_return
|
||||||
|
addi $t0, $t0, 1
|
||||||
|
j wait_loop
|
||||||
|
wait_return:
|
||||||
|
jr $ra
|
|
@ -0,0 +1,68 @@
|
||||||
|
#include <detpic32.h>
|
||||||
|
|
||||||
|
#define SIZE 20
|
||||||
|
|
||||||
|
char *strcat(char *, char *);
|
||||||
|
char *strcpy(char *, char *);
|
||||||
|
int strlen(char *);
|
||||||
|
int strcmp(char *str1, char *str2);
|
||||||
|
|
||||||
|
int main(void) {
|
||||||
|
static char str1[SIZE + 1];
|
||||||
|
static char str2[SIZE + 1];
|
||||||
|
static char str3[2 * SIZE + 1];
|
||||||
|
|
||||||
|
printStr("Introduza 2 strings:\n");
|
||||||
|
readStr(str1, SIZE);
|
||||||
|
putChar('\n');
|
||||||
|
readStr(str2, SIZE);
|
||||||
|
putChar('\n');
|
||||||
|
printStr("Resultados:\n");
|
||||||
|
printStr("Str1 len: ");
|
||||||
|
printInt(strlen(str1), 10);
|
||||||
|
putChar('\n');
|
||||||
|
printStr("Str2 len: ");
|
||||||
|
printInt(strlen(str2), 10);
|
||||||
|
putChar('\n');
|
||||||
|
strcpy(str3, str1);
|
||||||
|
printStr("Str3 + Str2: ");
|
||||||
|
printStr(strcat(str3, str2));
|
||||||
|
putChar('\n');
|
||||||
|
printStr("Str1 == Str2: ");
|
||||||
|
printInt10(strcmp(str1, str2));
|
||||||
|
putChar('\n');
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
// Returns the length of string "str" (excluding the null character)
|
||||||
|
int strlen(char *str) {
|
||||||
|
int len;
|
||||||
|
for (len = 0; *str != '\0'; len++, str++);
|
||||||
|
return len;
|
||||||
|
}
|
||||||
|
// Copy the string pointed by "src" (including the null character) to
|
||||||
|
// destination (pointed by "dst")
|
||||||
|
char *strcpy(char *dst, char *src) {
|
||||||
|
char *p = dst;
|
||||||
|
for (; (*dst = *src) != '\0'; dst++, src++);
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
// Concatenates "dst" and "src" strings
|
||||||
|
// The result is stored in the "dst" string
|
||||||
|
char *strcat(char *dst, char *src) {
|
||||||
|
char *p = dst;
|
||||||
|
for (; *dst != '\0'; dst++);
|
||||||
|
strcpy(dst, src);
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Compares two strings, character by character
|
||||||
|
// Returned value is:
|
||||||
|
// < 0 string "str1" is "less than" string "str2" (first
|
||||||
|
// non-matching character in str1 is lower, in ASCII, than that of str2)
|
||||||
|
// = 0 string "str1" is equal to string "str2"
|
||||||
|
// > 0 string "str1" is "greater than" string "str2" (first
|
||||||
|
// non-matching character in str1 is greater, in ASCII, than that of str2)
|
||||||
|
int strcmp(char *str1, char *str2) {
|
||||||
|
for (; (*str1 == *str2) && (*str1 != '\0'); str1++, str2++);
|
||||||
|
return (*str1 - *str2);
|
||||||
|
}
|
|
@ -0,0 +1,223 @@
|
||||||
|
.equ INKEY, 1
|
||||||
|
.equ GETCHAR, 2
|
||||||
|
.equ PUTCHAR, 3
|
||||||
|
.equ READ_INT, 4
|
||||||
|
.equ READ_INT10, 5
|
||||||
|
.equ PRINT_INT, 6
|
||||||
|
.equ PRINT_INT10, 7
|
||||||
|
.equ PRINT_STR, 8
|
||||||
|
.equ READ_STR, 9
|
||||||
|
.equ EXIT, 10
|
||||||
|
.equ READ_CORE_TIMER, 11
|
||||||
|
.equ RESET_CORE_TIMER, 12
|
||||||
|
|
||||||
|
.equ SIZE, 20
|
||||||
|
|
||||||
|
.data
|
||||||
|
|
||||||
|
input: .asciiz "Introduza 2 strings:\n"
|
||||||
|
r_str: .asciiz "Resultados:\n"
|
||||||
|
res1: .asciiz "Str1 len: "
|
||||||
|
res2: .asciiz "Str2 len: "
|
||||||
|
res3: .asciiz "Str3 + Str2: "
|
||||||
|
res4: .asciiz "Str1 == Str2: "
|
||||||
|
|
||||||
|
str1: .space 21
|
||||||
|
str2: .space 21
|
||||||
|
str3: .space 41
|
||||||
|
|
||||||
|
.text
|
||||||
|
.globl main
|
||||||
|
|
||||||
|
main:
|
||||||
|
move $s0, $ra # Save $ra
|
||||||
|
|
||||||
|
la $a0, input
|
||||||
|
li $v0, PRINT_STR
|
||||||
|
syscall
|
||||||
|
|
||||||
|
la $a0, str1
|
||||||
|
li $a1, SIZE
|
||||||
|
li $v0, READ_STR
|
||||||
|
syscall
|
||||||
|
|
||||||
|
li $a0, '\n'
|
||||||
|
li $v0, PUTCHAR
|
||||||
|
syscall
|
||||||
|
|
||||||
|
la $a0, str2
|
||||||
|
li $a1, SIZE
|
||||||
|
li $v0, READ_STR
|
||||||
|
syscall
|
||||||
|
|
||||||
|
li $a0, '\n'
|
||||||
|
li $v0, PUTCHAR
|
||||||
|
syscall
|
||||||
|
|
||||||
|
la $a0, r_str
|
||||||
|
li $v0, PRINT_STR
|
||||||
|
syscall
|
||||||
|
|
||||||
|
la $a0, res1
|
||||||
|
li $v0, PRINT_STR
|
||||||
|
syscall
|
||||||
|
|
||||||
|
la $a0, str1
|
||||||
|
jal strlen
|
||||||
|
move $a0, $v0
|
||||||
|
li $a1, 10
|
||||||
|
li $v0, PRINT_INT
|
||||||
|
syscall
|
||||||
|
|
||||||
|
li $a0, '\n'
|
||||||
|
li $v0, PUTCHAR
|
||||||
|
syscall
|
||||||
|
|
||||||
|
la $a0, res2
|
||||||
|
li $v0, PRINT_STR
|
||||||
|
syscall
|
||||||
|
|
||||||
|
la $a0, str2
|
||||||
|
jal strlen
|
||||||
|
move $a0, $v0
|
||||||
|
li $a1, 10
|
||||||
|
li $v0, PRINT_INT
|
||||||
|
syscall
|
||||||
|
|
||||||
|
li $a0, '\n'
|
||||||
|
li $v0, PUTCHAR
|
||||||
|
syscall
|
||||||
|
|
||||||
|
la $a0, str3
|
||||||
|
la $a1, str1
|
||||||
|
jal strcpy
|
||||||
|
|
||||||
|
la $a0, res3
|
||||||
|
li $v0, PRINT_STR
|
||||||
|
syscall
|
||||||
|
|
||||||
|
la $a0, str3
|
||||||
|
la $a1, str2
|
||||||
|
jal strcat
|
||||||
|
move $a0, $v0
|
||||||
|
li $v0, PRINT_STR
|
||||||
|
syscall
|
||||||
|
|
||||||
|
li $a0, '\n'
|
||||||
|
li $v0, PUTCHAR
|
||||||
|
syscall
|
||||||
|
|
||||||
|
la $a0, res4
|
||||||
|
li $v0, PRINT_STR
|
||||||
|
syscall
|
||||||
|
|
||||||
|
la $a0, str1
|
||||||
|
la $a1, str2
|
||||||
|
jal strcmp
|
||||||
|
move $a0, $v0
|
||||||
|
li $v0, PRINT_INT10
|
||||||
|
syscall
|
||||||
|
|
||||||
|
li $a0, '\n'
|
||||||
|
li $v0, PUTCHAR
|
||||||
|
syscall
|
||||||
|
|
||||||
|
jr $s0
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#----------------------------------------------
|
||||||
|
# STRLEN
|
||||||
|
#----------------------------------------------
|
||||||
|
# Mapa de registos
|
||||||
|
# $a0 → str
|
||||||
|
# $t0 → len
|
||||||
|
# $t1 → *str
|
||||||
|
strlen:
|
||||||
|
li $t0, 0
|
||||||
|
strlen_loop:
|
||||||
|
lb $t1, 0($a0)
|
||||||
|
beq $t1, 0, strlen_return
|
||||||
|
addiu $t0, $t0, 1
|
||||||
|
addiu $a0, $a0, 1
|
||||||
|
j strlen_loop
|
||||||
|
strlen_return:
|
||||||
|
move $v0, $t0
|
||||||
|
jr $ra
|
||||||
|
#----------------------------------------------
|
||||||
|
|
||||||
|
#----------------------------------------------
|
||||||
|
# STRCPY
|
||||||
|
#----------------------------------------------
|
||||||
|
# Mapa de registos
|
||||||
|
# $a0 → dst
|
||||||
|
# $a1 → src
|
||||||
|
# $t0 → p
|
||||||
|
# $t1 → *src
|
||||||
|
strcpy:
|
||||||
|
move $t0, $a0
|
||||||
|
strcpy_loop:
|
||||||
|
lb $t1, 0($a1)
|
||||||
|
sb $t1, 0($a0)
|
||||||
|
beq $t1, 0, strcpy_return
|
||||||
|
addiu $a0, $a0, 1
|
||||||
|
addiu $a1, $a1, 1
|
||||||
|
j strcpy_loop
|
||||||
|
strcpy_return:
|
||||||
|
move $v0, $t0
|
||||||
|
jr $ra
|
||||||
|
#----------------------------------------------
|
||||||
|
|
||||||
|
#----------------------------------------------
|
||||||
|
# STRCAT
|
||||||
|
#----------------------------------------------
|
||||||
|
# Mapa de registos
|
||||||
|
# $a0 → dst
|
||||||
|
# $a1 → src
|
||||||
|
# $t0 → p
|
||||||
|
# $t1 → *dst
|
||||||
|
strcat:
|
||||||
|
move $t0, $a0
|
||||||
|
strcat_loop:
|
||||||
|
lb $t1, 0($a0)
|
||||||
|
beq $t1, 0, strcat_return
|
||||||
|
addiu $a0, $a0, 1
|
||||||
|
j strcat_loop
|
||||||
|
strcat_return:
|
||||||
|
addiu $sp, $sp, -20
|
||||||
|
sw $ra, 0($sp)
|
||||||
|
sw $a0, 4($sp)
|
||||||
|
sw $a1, 8($sp)
|
||||||
|
sw $t0, 12($sp)
|
||||||
|
sw $t1, 16($sp)
|
||||||
|
jal strcpy
|
||||||
|
lw $ra, 0($sp)
|
||||||
|
lw $a0, 4($sp)
|
||||||
|
lw $a1, 8($sp)
|
||||||
|
lw $t0, 12($sp)
|
||||||
|
lw $t1, 16($sp)
|
||||||
|
addiu $sp, $sp, 20
|
||||||
|
move $v0, $t0
|
||||||
|
jr $ra
|
||||||
|
#----------------------------------------------
|
||||||
|
|
||||||
|
#----------------------------------------------
|
||||||
|
# STRCMP
|
||||||
|
#----------------------------------------------
|
||||||
|
# Mapa de registos
|
||||||
|
# $a0 → str1
|
||||||
|
# $a1 → str2
|
||||||
|
# $t0 → *str1
|
||||||
|
# $t1 → *str2
|
||||||
|
strcmp:
|
||||||
|
lb $t0, 0($a0)
|
||||||
|
lb $t1, 0($a1)
|
||||||
|
bne $t0, $t1, strcmp_return
|
||||||
|
beq $t0, 0, strcmp_return
|
||||||
|
addiu $a0, $a0, 1
|
||||||
|
addiu $a1, $a1, 1
|
||||||
|
j strcmp
|
||||||
|
strcmp_return:
|
||||||
|
sub $v0, $t0, $t1
|
||||||
|
jr $ra
|
||||||
|
#----------------------------------------------
|
Loading…
Reference in New Issue