Опубликован: 19.01.2025 | Доступ: свободный | Студентов: 0 / 0 | Длительность: 05:57:00
Лекция 5:

Лабораторная работа №4. Логические и арифметические операции, операции сравнения и сдвига

< Лекция 4 || Лекция 5 || Лекция 6 >

4.1 Цель и задачи

Целью работы является разработка изучение логических и арифметических операций, операций сравнения и сдвига в рамках языка ассемблер RISC-V. Для этого необходимо выполнить следующие задачи:

  1. Изучить логические и арифметические операции I-type.
  2. Изучить логические и арифметические операции R-type.

Презентация к блоку "Ассемблер RISC-V"

4.2. Основные теоретические сведения

4.2.1 Логические и арифметические операции I-type

Таблица 4.1. Операции I-type
Instruction name opcode funct3 description
addi ADD immediate 0010011 0x0 rd=rs1 + imm
xori XOR immediate 0010011 0x4 rd=rs1 ^ imm
ori OR immediate 0010011 0x6 rd=rs1 | imm
andi AND immediate 0010011 0x7 rd=rs1 & imm
slli Shift Left Logical Imm 0010011 0x1 Imm(11:5)=0x00, rd=rs1<< imm(4:0)
srli Shift Right Logical Imm 0010011 0x5 Imm(11:5)=0x00, rd=rs1>> imm(4:0)
srai Shift Right Arith Imm 0010011 0x5 Imm(11:5)=0x20, rd=rs1>> imm(4:0)
stli Set Less Than Imm 0010011 0x2 rd=(rs1 < imm)?0:1
sltiu Set Less Than Imm. Unsigned 0010011 0x3 rd=(rs1 < imm)?0:1

Команды I-type (Таблица 4.1) принимают непосредственное значение imm (константу), исходный регистр rs1 и целевой регистр rd.

Поскольку инструкция addi rd, rs1, imm использует значение imm в качестве значения со знаком, она работает для арифметического сложения (imm = 0...2047) и вычитания (imm = -2048…-1), т.е. нет команды subi.

Инструкции xori, ori и andi rd, rs1, imm выполняют побитовую операцию xor, or, and соответственно. Например, пусть значение регистра x1 равно 0?9; в двоичной системе счисления (обозначается префиксом 0b) это 0b1001. Команда xori x1, x1, 0?3 выполняет операцию xor над содержимым регистра x1, таким образом

 x1 = x1 xor 0?3 = 0b1001 xor 0b0011 = 0b1010 = 0xa.

Инструкции slli, srli и srai выполняют операции сдвига, используя непосредственное значение в качестве количества сдвигов. Непосредственным значением является положительное число из 5 бит (0...31).

Логический сдвиг влево выполняется с помощью команды slli rd, rs1, imm. Она перемещает влево каждый бит значения исходного регистра rs1 на число бит, заданное непосредственным значением, и записывает результат в rd. При каждом сдвиге младший значащий бит устанавливается равным нулю, а старший значащий бит отбрасывается.

Логический сдвиг вправо выполняется аналогично с помощью srli rd, rs1, imm. Регистр rs1 побитово сдвигается вправо на immediate, и результат поступает в rd. Здесь самый старший бит заполняется нулем, а младший бит отбрасывается.

Обработка или заполнение старшего значащего бита отличается для арифметического сдвига вправо, выполняемого с помощью srai rd, rs1, imm. Самый старший бит (msb) сохраняется. Если msb равен 0 перед сдвигом, то msb заполняется значением 0 после сдвига. Если msb равен 1 перед сдвигом, то msb заполняется значением 1. Например, пусть значение регистра x1 равно 0?9, в двоичной системе счисления это 0b1001. Командаslli x1, x1, 0?2 выполняет логический сдвиг содержимого регистра x1 влево таким образом

 x1 = x1 << 0?2 = 0b1001 << 2 = 0b100100 = 0?24.

Оставшиеся две инструкции slti rd, rs1, imm и sltiu rd, rs1,imm сравнивают содержимое исходного регистра rs1 с непосредственным значением (imm) и устанавливают в rd значение 0, если значение исходного регистра rs1 < imm. Разница между обеими инструкциями заключается в том, что slti использует значения со знаком, и в сравнении используются значения со знаком. Примеры

addi x3, x1, 3              	# x3 = x1 + 3
andi x3, x1, 3               	# x3 = x1 & 3
slli x3, x1, 3                 # x3 = x1 << 3
addi x3, x1, -3              	# x3 = x1 - 3
  

4.2.2 Логические и арифметические операции R-type

Операции R-type (Таблица 4.2) включают арифметические и логические операции, которые используют два регистра в качестве источника и один регистр в качестве приемника. Большинство инструкций являются аналогом операций с непосредственными значениями.

Таблица 4.2. Операции R-type
Instruction name opcode funct3 description
add ADD 0110011 0x0 rd=rs1 + rs2
sub SUB 0110011 0x0 rd=rs1 - rs2
xor XOR 0110011 0x4 rd=rs1 ^ rs2
or OR 0110011 0x6 rd=rs1 | rs2
and AND 0110011 0x7 rd=rs1 & rs2
sll Shift Left Logical 0110011 0x1 rd=rs1<< rs2
srl Shift Right Logical 0110011 0x5 rd=rs1>> rs2
sra Shift Right Arith 0110011 0x5 rd=rs1>> rs2
stl Set Less Than 0110011 0x2 rd=(rs1 < rs2)?0:1
sltu Set Less Than Un 0110011 0x3 rd=(rs1 < rs2)?0:1

Примеры

add  x3, x1, x2	 # x3 = x1 + x2
slt x3, x1, x2 	 # if x1 < x2 then x3 = 1 else x3 = 0
and  x3, x1, x2 	# x3 = x1 & x2
sll x3, x1, x2 	 # x3 = x1 << x2
 

Пример сложения I-type и R -type описан в Таблице 4.3.

Таблица 4.3. Сложение операций
Адрес Машинный код Инструкция Комментарий
0x0 0x00100093 addi x1, x0, 1 # x1=1
0x4 0x00108093 addi x1, x1, 1 # x1=2
0x8 0x00108133 add x2, x1, x1 # x2=4

Рассмотрим пример сложных вычислений a = ((b+3) >> c) - 1. Предположим, что a, b, c находятся в регистрах s2, s3 и s4 соответственно. Используйте регистр s5 для y0 и регистр s6 для y1.

addi s5, s3, 3  # y0 = b + 3
srl s6, s5, s4  # y1 = y0 >> c
addi s2, s6, -1 # a =  y1 - 1
 

4.3. Задание к лабораторной работе

  1. Создать программу согласно варианту, которая
    • выполняет заданные действия,
    • выводит на экран сообщения о результатах/ошибках.
  2. Откомпилировать программу и запустить на исполнение.
  3. Отладить программу, проследить изменения в регистрах.

Варианты заданий

Напишите программы, которые вводят два целых значения x и y, вычисляют следующие выражения и выводят результат:

  1. (x + 5) - (y - 7)
  2. (x >> 2) + ((y - 1) << 3) (>> - логический сдвиг)
  3. (x << y) - 10
  4. (x >> y) + 10 (>> - арифметический сдвиг)
  5. ((x << 2) - y + 5) >> 1 (>> - арифметический сдвиг)
  6. x * 6 - y * 3 (выполнить умножение, используя сдвиг, сложение, вычитание)
  7. 2 * x * x - 3 * y + 4
  8. (x + 5) / y + 10 / (y - 1)
  9. (x / y) * y + x % y
  10. x & (-1 << 5)
  11. x | (-1 >> 27) (>> - логический сдвиг)
  12. Установите y-ий бит x в 1 (номера битов начинаются с 0)
  13. Установите y-ий бит x в 0 (номера битов начинаются с 0)
  14. x > y ? 0 : 1
  15. (x == (y + 3)) ? 0 : 1
  16. x < -5 & y > 10

4.3.1 Описание последовательности выполнения работы

Скомпилируйте исходную программу и убедитесь в ее работоспособности в RISC-V ОС, либо через qemu-riscv64.

4.3.2 Пример выполнения задания на защиту

Напишите программу, которая:

  • очищает регистры t0, t1,t2 (использовать andi);
  • загружает 0x1A352A9C и 0x1B2D4C6A соответственно в регистры t0, t1;
  • добавляет в регистр t0 константу 0x1CB;
  • складывает регистры t0, t1, результат помещает в t2.

Результат

andi t0, t0, 0     # Clear register t0
andi t1, t1, 0     # Clear register t1
andi t2, t2, 0     # Clear register t2
li t0, 0x1A352A9C  # Loading register t0 with a value
li t1, 0x1B2D4C6A  # Loading register t1 with a value
addi t0, t0, 0x1CB # Add t0 with an immediate value
add t2, t0, t1     # Add -- t0 with t1 and place the result in t2
 

4.4. Вопросы для контроля

  1. Как выполнить эти операции без использования инструкции умножения?

    x * 2

    x * 3

    x * 4

    x * 5

    x * 8

    x * 31

  2. Как выполнить эти операции без использования инструкции деления?

    x / 2

    x / 3

    x / 5

    x / 8

    x / 31

< Лекция 4 || Лекция 5 || Лекция 6 >