通过bithifting改变单词

时间:2017-03-02 01:04:25

标签: assembly arm

老实说,这是一项我必须坚持的家庭作业,需要指导。

任务是改变

1)COPE - >希望 2)希望 - > HOPS。

我已经设法做了1)通过向该位添加5,这很容易,因为添加会改变第一位。但是,我被困在如何改变HOPE到HOPS(2),因为现在我必须操纵最后一点。

我正在考虑使用ror,但如果我理解正确的话,ARM汇编语言会在旋转时切断它。 (仅存储31位而不是32位)因此,出于某种原因,使用rorHOPE更改为OPEH

任何人都可以提供有关如何执行此操作的指导吗?

到目前为止我的代码:

.syntax unified
.global main

main:
    mov R1, #0

@ load "COPE" into r1
cope:
    .ascii "COPE"

ldr r1, cope
mov r2, r1
add r2, #5 ; Got HOPE from COPE now.
mov r3, r2
# Now im stuck

谢谢!

1 个答案:

答案 0 :(得分:0)

使用EOR(XOR)的一个想法......

此代码示例不是优雅而有效的,并且可能是微不足道的。

.data
        array:  .ascii          "COPE"
        .equ    len.array,.-array
        .align
...
_start:
        mov r8, #0x48           // H
        mov r9, #0x53           // S
        mov r10, #len.array     // length of array
        mov r11,#1              // 
        sub r10, r10, r11       // decrement length by 1 since array element begins at 0

        ldr r1,=array           // COPE
        ldrb r2, [r1]           // get first byte size character
        eor r3, r2, r8          // XOR C H -> key
        eor r3, r3, r2          // XOR key C -> H
        strb r3, [r1]           // HOPE

        ldrb r2, [r1,r10]       // get last byte size character
        eor r3, r2, r9          // XOR E S -> key
        eor r3, r3, r2          // XOR key E -> H
        strb r3, [r1,r10]       // HOPS

...

步进时的gdb结果......

0x200c0:        "COPEA\023"
0x200c0:        "COPEA\023"
0x200c0:        "COPEA\023"
0x200c0:        "COPEA\023"
0x200c0:        "HOPEA\023"
0x200c0:        "HOPEA\023"
0x200c0:        "HOPEA\023"
0x200c0:        "HOPEA\023"
0x200c0:        "HOPEA\023"
0x200c0:        "HOPSA\023"