Задача состоит в том, чтобы изучить программирование на ассемблере, написав подпрограмму, которая может преобразовывать 4-битный шестнадцатеричный код в 7-битный ASCII. Сначала я понятия не имел, но после некоторых исследований я мог приложить усилия и нарисовать блок-схему и составить программу, но это не совсем правильно, поэтому я прошу вашего руководства, чтобы помочь мне решить эту проблему.
Собственно текст задания такой:
ГА 3.1. Нарисуйте блок-схему подпрограммы для преобразования 4-битного шестнадцатеричного значения в соответствующий 7-битный код ASCII. См. полную спецификацию для hexasc ниже. Пример: двоичное число 0010 (шестнадцатеричная цифра 2) преобразуется в 011 0010 (ASCII-код для «2»). Другой пример: двоичное число 1011 (шестнадцатеричная цифра B) преобразуется в 100 0010 (ASCII-код для 'B'). Убедитесь, что ваша подпрограмма задокументирована в соответствии с нашими требованиями.
ГА 3.2. Используя лабораторный проект в Nios II IDE, создайте новый файл с именем hexasc.s.
ГА 3.3. В файле hexasc.s напишите подпрограмму hexasc, которая преобразует 4-битное шестнадцатеричное значение в соответствующий 7-битный код ASCII.
Я нарисовал блок-схему для программы:
И программа, которую я пробовал, такова, но я подозреваю, что она не соответствует спецификации:
.global main
.text
.align 2
main: movi r8, 0x09
movi r9, 0x0f
andi r4, r4, 0x0f
bgt r8, r4, L1
movi r2, 0x1e
add r2, r2, r4
andi r2, r2, 0xff
movia r2,putchar
br L2
L1: movi r2, 0x29
add r2, r2, r4
andi r2, r2, 0xff
movia r2,putchar
L2: .end
Можете ли вы помочь мне разработать и решить это задание? Времени полно, не раньше чем через месяц.
Обновлять
Увидев здесь в комментарии, что блок-схема неверна, я внес необходимые коррективы:
Я также хочу обсудить, насколько корректен этот алгоритм преобразования между шестнадцатеричными и ASCII.
Обновить / изменить
Вот полная программа.
.global hexasc
.text
.align 2
hexasc: movi r8, 0x09
movi r9, 0x0f
andi r4, r4, 0x0f #keep only 4 bits
bgt r4, r8, L1 #is x>9?
movi r2, 0x30
add r2, r2, r4
andi r2, r2, 0xff
ret
L1: movi r2, 0x37
add r2, r2, r4
andi r2, r2, 0xff
ret
a=h+((h>9)?55:49);
, но я не уверен, что понимаю. - person Niklas R.   schedule 21.08.2012a=h+((h>9)?55:49)
? Это то, что теперь описывает исправленная диаграмма, за исключением того, что в формуле должно быть 48, а не 49. - person Alexey Frunze   schedule 21.08.2012'0'
. Пусть ассемблер выполнит работу по оценке того, что'0'
равно 30H, а 30H + 5 равно 35H, что является символом ASCII «5». Если вы сделаете это таким образом, ваш код будет самодокументируемым, а не замусоренным магическими числами. - person indiv   schedule 21.08.2012