Шифр Цезаря сборки руки

Я новичок в сборке оружия и использую armsim для школьного проекта. У меня несколько проблем.

  1. Мне нужно прочитать несколько строк из txtfile, и каждая строка имеет строку, которая займет до 85 байтов (на строку). Моя программа читает только первую строку, я не знаю, как читать остальную часть файла.
  2. Я должен взять каждый символ из каждой строки и добавить 13, если значение символа я назову «a» ((a>=65 && a‹=77) || (a>=97 && a‹=109)). Мне нужно вычесть 13, если ((a>=78 && a‹=109)||(a>=110 && a‹=122)). Если (a==32), то я распечатываю пробел и перехожу к следующему символу. Я не понимаю, как это сделать с помощью ветвей...

Цикл обрабатывает символ за символом и выводит символ на стандартный вывод. Вот мой код до сих пор ... Я потратил на это дни и часы, и я просто не могу обдумать это. Я только столкнулся с java до сих пор.

.equ SWI_Open, 0x66 @open a file
.equ SWI_Close,0x68 @close a file
.equ SWI_PrChr,0x00 @ Write an ASCII char to Stdout
.equ SWI_PrStr, 0x69 @ Write a null-ending string
.equ SWI_PrInt,0x6b @ Write an Integer
.equ SWI_RdInt,0x6c @ Read an Integer from a file
.equ SWI_RdStr, 0x6a @ Read string from file
.equ Stdout, 1 @ Set output target to be Stdout
.equ SWI_Exit, 0x11 @ Stop execution
.global _start
.text
_start:

ldr r0,=InFileName @ set Name for input file
mov r1,#0 @ mode is input
swi SWI_Open @ open file for input
ldr r1,=InFileHandle
str r0,[r1]
ldr r7,[r1]
ldr r1,=array
mov r2,#85
swi SWI_RdStr @stores the string into =array 

mov r5,#0 @r5 is index

loop: @processes a single char then loops back
cmp r5,r2 @r2 is 83
bge procstop
ldrb r4,[r1,r5] @loads the character value from =array[r5] into r4

cmp r4,#77
ble add
cmp r4,#65
bge add

cmp r4,#97
bge add
cmp r4,#109 
ble add

cmp r4,#78
bge sub
cmp r4,#90
ble sub

cmp r4,#110
bge sub
cmp r4,#122
ble sub

add:
add r4,r4,#13

sub:
sub r4,r4,#13

mov r0,r4
swi SWI_PrChr

strb r4,[r1,r5]
add r5,r5,#1
B loop
procstop:

mov r0,#Stdout
swi SWI_PrStr
swi SWI_Exit

.data
InFileName: .asciz "lab4.txt"
EndOfFileMsg: .asciz "End of file reached\n"
ColonSpace: .asciz": "
NL: .asciz "\n " @ new line
array: .skip 85
.align
InFileHandle: .word 0


.end

person Jnewbie    schedule 30.09.2015    source источник
comment
Вы знаете Си? Если вы не знакомы с ассемблером, попробуйте сделать программу на С, потом переводить на ассемблирование пошагово, на месте, пока не останется С.   -  person ElderBug    schedule 30.09.2015
comment
К сожалению не знаю С.   -  person Jnewbie    schedule 30.09.2015
comment
А как насчет другого языка? C лучше, потому что он ближе к ассемблеру, но могут работать и другие языки. Цель состоит в том, чтобы начать с потока программы, с которым вы знакомы.   -  person ElderBug    schedule 30.09.2015
comment
У меня есть псевдокод программы, написанный на java. Он должен читать каждую строку, пока readLine не вернет null (конец файла), но я не уверен, как перевести это в сборку. Я думаю, что первая часть кода верна, и после обработки всех символов в первой строке файла я бы вернулся к началу. Хотя я не уверен, как сборка перебирает строки файла. В java это было бы просто bufferedreader.readLine()!=null, буферизованный ридер заканчивал бы каждую строку на \n   -  person Jnewbie    schedule 30.09.2015
comment
В java запретите циклы for (только while и do/while). Используйте char[] вместо String и предположите, что readLine работает как SWI_RdStr и возвращает char[]. Чтобы перевести if/else if, поместите метку до и после обоих блоков {} и определите, какие переходы нужно сделать, чтобы они имели одинаковое поведение.   -  person ElderBug    schedule 30.09.2015
comment
Хорошо, я получил файл, чтобы прочитать каждую строку. Не понимал, что он будет читать конец строки и выполнять итерацию самостоятельно.   -  person Jnewbie    schedule 30.09.2015
comment
Я не знаю точно, как работает SWI_RdStr, но кажется, что он вернет количество символов, прочитанных в r0, поэтому вы знаете, что читать больше нечего, когда r0 равно 0. Что-то вроде while( SWI_RdStr(file,my_array,85) != 0) в java.   -  person ElderBug    schedule 30.09.2015


Ответы (1)


Ах, я понял это. Я не знал, почему я не подумал об этом раньше. Не нужно сравнивать все это, просто нужно выполнять каждое сравнение по одному от самого маленького сравнения до самого большого, в основном это цепочка операторов if/else if.

person Jnewbie    schedule 30.09.2015