2014-11-30 3 views
0

Это домашнее заданиеARM ассемблере: цезарь высчитывать

Я должен взять данную строку и смещение в качестве параметров и создать зашифрованную версию строки. Вот что у меня есть

.global 
cypher: 
    stmfd sp!, {v1-v6, lr} @std 
    mov v1, a1    @hold the string pointer in v1 
    bl strlen    @get the length of the string in a1 
    add a1, a1, #1   @add null byte space to strlen 
    mov v2, a1    @hold the length of space needed in v2 
    bl malloc    @reserve space for new string in a1 
    mov v3, #0    @initial index of new string 
loop:ldr v4, [v1], #4  @load v4 with string pointer and increment by bytes 
    add v5, v4, a2   @add the offset to the current character 
    str v5, [a1, v3]  @store the new character in the new address 
    add v3, v3, #4   @increment the index by a byte 
    cmp v2, v3 
    bne loop 
    ldmfd sp!, {v1-v6, pc} @std  
    .end 

У меня возникли проблемы с тем, как правильно нарисовать персонажа. Как добавить смещение к символу? (Я предполагаю, что символы ascii должны быть увеличены?)

+0

Да они делают. Затем для дешифрования вы просто вычтите правильное смещение. Но я вижу, что это то, что вы делаете в своем коде. Итак, каков результат вашего кода? – Phil

+0

Испытанная строка - это «БЫСТРОЕ ВОЛОСНОЕ ВОСПРОИЗВЕДЕНИЕ НА ЛАЗУЮ СОБАКУ». Я получаю строку «XHE UUICO BRSWN JOX NUMPW OVIR TLE LEZY HOG» Кажется, что пропущено 3 символа между сменой персонажа – lilscarecrow

+0

Я думаю, это потому, что вы пропускают 4 байта. Можете ли вы попробовать изменить два набора из # 4 на # 1? – Phil

ответ

0

Вы повторяете цикл на четыре байта.

Ниже «правильный» один (и оптимизируют один, тоже: вам не нужно v3 и v5)

loop:ldrb v4, [v1], #1  @load v4 with string pointer and increment by bytes 
    subs v2, v2, #1 
    add v4, v4, a2   @add the offset to the current character 
    strb v4, [a1], #1  @store the new character in the new address 
    bne loop 

    ldmfd sp!, {v1-v6, pc} @std  
Смежные вопросы