| Название | Размер | Изменён |
| test.c | 1558 байт | 895 дн. 11 час. назад |
| test.ld | 274 байт | 895 дн. 11 час. назад |
| vectors.S | 1012 байт | 895 дн. 11 час. назад |
Исходные коды (архитектура ARM, неделя 3, май 2024)
Добавить комментарий
| Название | Размер | Изменён |
| CMakeLists.txt | 2642 байт | 986 дн. 9 час. назад |
| cpu.h | 127 байт | 986 дн. 8 час. назад |
| cpu_a9.h | 487 байт | 986 дн. 8 час. назад |
| create-sd.sh | 593 байт | 986 дн. 8 час. назад |
| cstart.c | 985 байт | 986 дн. 8 час. назад |
| gic.c | 1261 байт | 986 дн. 8 час. назад |
| gic.h | 2634 байт | 986 дн. 8 час. назад |
| irq.c | 715 байт | 986 дн. 8 час. назад |
| irq.h | 304 байт | 986 дн. 8 час. назад |
| linkscript.ld | 893 байт | 986 дн. 8 час. назад |
| startup.s | 1681 байт | 986 дн. 8 час. назад |
| uart_pl011.c | 2776 байт | 986 дн. 8 час. назад |
| uart_pl011.h | 2167 байт | 986 дн. 8 час. назад |
| Название | Размер | Изменён |
| CMakeLists.txt | 2632 байт | 993 дн. 9 час. назад |
| cpu.h | 127 байт | 993 дн. 9 час. назад |
| cpu_a9.h | 487 байт | 993 дн. 9 час. назад |
| create-sd.sh | 593 байт | 993 дн. 9 час. назад |
| cstart.c | 985 байт | 993 дн. 9 час. назад |
| gic.c | 1261 байт | 993 дн. 9 час. назад |
| gic.h | 2634 байт | 993 дн. 9 час. назад |
| irq.c | 715 байт | 993 дн. 9 час. назад |
| irq.h | 304 байт | 993 дн. 9 час. назад |
| linkscript.ld | 893 байт | 993 дн. 9 час. назад |
| startup.s | 1679 байт | 993 дн. 9 час. назад |
| uart_pl011.c | 2759 байт | 993 дн. 9 час. назад |
| uart_pl011.h | 2167 байт | 993 дн. 9 час. назад |
Урок 1.3, задача 3.
// Теперь более сложное задание. Вам требуется написать функцию pow, которая принимает на вход два беззнаковых числа x и p (в регистрах RDI и RSI соответственно) и возвращает значение x^p (x в степени p) в регистре RAX. Гарантируется, что x и p не могут быть равны 0 одновременно (по отдельности они все еще могут быть равны 0). Также гарантируется, что ответ помещается в 64 бита.
// ВАЖНО: не забудьте, что кроме инструкций условного перехода (jcc) есть и инструкция безусловного перехода jmp - она может вам пригодиться.
pow:
// Put your code here
CMP $0,%RDI
JZ null_number
CMP $0,%RSI
JZ null_power
MOV %RDI,%RAX
MOV %RSI,%RBX
compute_power:
CMP $1,%RBX
JE func_end
MUL %RDI
DEC %RBX
JMP compute_power
null_power:
MOV $1,%RAX
JMP func_end
null_number:
MOV $0,%RAX
func_end:
ret
Урок 1.2, задача 4
// В регистрах RSI и RDX вам даны два числа, ваша задача поменять их местами, как и в одном из предыдущих заданий. Но добавляется условие, что все остальные регистры общего назначения должны остаться неизменными. Т. е. если вы используете какой-то регистр общего назначения кроме RSI и RDX, то вы должны сохранить и затем восстановить сохраненное значение регистра (ну или не пользоваться этими регистрами вовсе). // Вам разрешено пользоваться следующими регистрами общего назначения: RAX, RBX, RCX, RDX, RBP, RDI, RSI, R8 - R15. // В задании предполагается использование стека, но вы должны восстановить стек в исходное состояние. // Put your code here PUSH %RSI PUSH %RDX POP %RSI POP %RDX
Урок 1.3, задача 1
// А теперь ваша задача написать функцию swap. Функция принимает на вход два указателя на 64-битные числа (в регистрах RDI и RSI) и должна обменять значения в памяти.
// ВАЖНО: функция принимает указатели на значения, которые нужно обменять, а не сами значения, т. е. не забудьте, что чтобы добраться до значений указатели нужно разыменовать.
swap:
// Put your code here
PUSH (%RDI)
PUSH (%RSI)
POP (%RDI)
POP (%RSI)
RET
Урок 1.3, задача 2
// Попробуйте по аналогии с примером в лекции написать функцию, возвращающую минимум из двух переданных ей аргументов. Аргументы (беззнаковые целые числа) передаются в регистрах RDI и RSI. Результат работы функции должен быть сохранен в регистре RAX.
min:
// Put your code here
MOV %RDI,%RAX
CMP %RSI,%RAX
JB rax_below
MOV %RSI,%RAX
rax_below:
RET
| Название | Размер | Изменён |
| CMakeLists.txt | 2632 байт | 999 дн. 22 час. назад |
| cpu.h | 127 байт | 999 дн. 22 час. назад |
| cpu_a9.h | 487 байт | 999 дн. 22 час. назад |
| create-sd.sh | 593 байт | 999 дн. 22 час. назад |
| cstart.c | 985 байт | 999 дн. 22 час. назад |
| gic.c | 1261 байт | 999 дн. 22 час. назад |
| gic.h | 2634 байт | 999 дн. 22 час. назад |
| irq.c | 715 байт | 999 дн. 22 час. назад |
| linkscript.ld | 893 байт | 999 дн. 22 час. назад |
| startup.s | 1678 байт | 999 дн. 22 час. назад |
| uart_pl011.c | 2193 байт | 999 дн. 22 час. назад |
| uart_pl011.h | 1606 байт | 999 дн. 22 час. назад |
Задача 2, урок 1.2
// Сложите два числа в регистрах RSI и RDX, результат должен быть в регистре RSI. // Вам разрешено пользоваться следующими регистрами общего назначения: RAX, RBX, RCX, RDX, RBP, RDI, RSI, R8 - R15. // В задании не предполагается использование стека, даже если вы знаете, что это такое. // Put your code here ADD %RDX,%RSI
Задача 3, урок 1.2
// В регистре RSI вам дано целое число - градусы по шкале Фаренгейта (Tf). // Напишите код, который получит в регистре RSI сответствующее значение по шкале Цельсия (Tc). // Формула для перевода из шкалы Фаренгейта в шкалу Цельсия: // Tc=(5*(Tf-32))/9 // ВАЖНО: в качестве операнда инструкций div и mul не может выступать просто число (a. k. a. immediate), т. е. вам придется загрузить делитель/множитель в регистр и использовать регистр. // Так как мы не рассматривали операции с нецелыми числами, нужно отбросить нецелую часть результата и вернуть только целую. Кроме того гарантируется, что входное число и ответ будут беззнаковыми числами (более формально гарантируется, что // 32<=Tf<=220 // Вам разрешено пользоваться следующими регистрами общего назначения: RAX, RBX, RCX, RDX, RBP, RDI, RSI, R8 - R15. // В задании не предполагается использование стека, даже если вы знаете, что это такое. // Put your code here SUB $32,%RSI MOV %RSI,%RAX MOV $5,%RBX MUL %RBX MOV $9,%RBX DIV %RBX MOV %RAX,%RSI
// Напишите код, который обменивает значения в регистрах RSI и RDX. Т. е. если перед выполнением вашего кода в регистре RSI хранится число 1, а в регистре RDX хранится число 2, то после выполнения кода в регистре RSI должно храниться число 2, а в регистре RDX число 1. // Вам разрешено пользоваться следующими регистрами общего назначения: RAX, RBX, RCX, RDX, RBP, RDI, RSI, R8 - R15. // В задании не предполагается использование стека, даже если вы знаете, что это такое. // Put your code here MOV %RSI, %RAX MOV %RDX, %RSI MOV %RAX, %RDX
| Название | Размер | Изменён |
| CMakeLists.txt | 2632 байт | 1013 дн. 22 час. назад |
| cpu.h | 127 байт | 1013 дн. 22 час. назад |
| cpu_a9.h | 487 байт | 1013 дн. 22 час. назад |
| create-sd.sh | 593 байт | 1013 дн. 22 час. назад |
| cstart.c | 977 байт | 1013 дн. 22 час. назад |
| gic.c | 1076 байт | 1013 дн. 22 час. назад |
| gic.h | 2493 байт | 1013 дн. 22 час. назад |
| linkscript.ld | 893 байт | 1013 дн. 22 час. назад |
| startup.s | 1678 байт | 1013 дн. 22 час. назад |
| uart_pl011.c | 2193 байт | 1013 дн. 22 час. назад |
| uart_pl011.h | 1606 байт | 1013 дн. 22 час. назад |