老实说,这是一项我必须坚持的家庭作业,需要指导。
任务是改变
1)COPE - >希望 2)希望 - > HOPS。
我已经设法做了1)通过向该位添加5,这很容易,因为添加会改变第一位。但是,我被困在如何改变HOPE到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
谢谢!
答案 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"