2017-03-02 104 views
1

我会说实话,这是一个我坚持的作业练习,需要指导。通过bitshifting改变单词

任务是改变

1)COPE - > HOPE 2)HOPE - > HOPS。

我已经设法做到了1)在该位添加5,这很容易,因为添加会改变第一位。然而,我坚持要如何改变希望到HOPS(2),因为现在我必须操纵最后一点。

我正在考虑使用ror,但是如果我理解正确,ARM汇编语言在旋转时切断位。 (仅存储31位而不是32位)因此,使用ror由于某种原因将HOPE更改为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

从什么'添加停止0x12000000'你? – Jester

+0

这不是比特,而是你操纵的字节。在ASCII编码中,每个字母只使用一个字节(8位)。你将“字符串”加载到32位寄存器中,32/8 = 4 => 4个字符将适合(更长的字符串不会)。如果您要以十六进制格式检查“r2”的值,每对数字都是一个字节。我只是认为ARM是big-endian,所以我希望在最重要的字节(MSB)中有'C'('0x43'),即。你的'add r2,#5'会影响'E',而不会影响'C'......但是也许你的ARM是x86的小端,那么'C'是最低有效字节(LSB)添加5会修改它。 – Ped7g

+0

并且'ror'确实将所有32位数字全方位旋转,没有任何东西丢失。因此,以8/24位旋转将每个字母移动1个位置到任一方向,越过末端的位置将返回到第一个位置。 ('H'(out)< - 'OPE'< - 'H'(in)')。 – Ped7g

回答

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"