[英]Inline assembly statements in C code and extended ASM for ARM Cortex architectures
[英]Is there a way to convert this C code to ARM Inline Assembly?
這是凱撒密碼的 C 代碼,它以給定的文本和加密密鑰作為其參數。 我必須將其轉換為 ARM 內聯匯編程序。
void rotN(char *str, int n)
{
char *p;
for (p = str; *p != 0; p++)
{
int currChar = (int)*p;
if (currChar >= 97 && currChar <= 122)
{
currChar = currChar + n;
if (currChar > 122)
{
currChar = currChar - 26;
}
*p = (char)currChar;
}
if (currChar >= 65 && currChar <= 90)
{
currChar = currChar + n;
if (currChar > 90)
{
currChar = currChar - 26;
}
*p = (char)currChar;
}
}
}
在這里,我使用了 65、90、97、122 和 0,因為它們是 'A'、'Z'、'a'、'z' 和 '\0' 的 ASCII 值。
void rotN(char *str, int n){
asm volatile(
"str %[str], [%[str]]\n\t"
"mov r0, %[n]\n\t"
"mov r1, %[str]\n\t"
"mov r2, #0\n\t"
"1: ldrb r3, [r1, r2]\n\t"
"cmp r3, #0\n\t"
"beq 2f\n\t"
"cmp r3, #97\n\t"
"blo 2f\n\t"
"cmp r3, #122\n\t"
"bhi 2f\n\t"
"sub r3, r3, #26\n\t"
"b 1b\n\t"
"2: add r3, r3, r0\n\t"
"cmp r3, #122\n\t"
"bhi 2f\n\t"
"cmp r3, #97\n\t"
"blo 2f\n\t"
"sub r3, r3, #26\n\t"
"b 1b\n\t"
"2:\n\t"
"strb r3, [r1, r2]\n\t"
:
: [str] "r" (str), [n] "r" (n)
: "r0", "r1", "r2", "r3"
);
}
上面的代碼是我到目前為止所做的,但似乎不起作用。 我究竟做錯了什么?
好吧,您可以使用適當的gcc
交叉編譯器來生成匯編代碼。 我不確定這是否滿足您的要求。
將代碼保存到rot.c
並運行以下命令,將gcc
替換為適合您的 ARM 設備的交叉編譯器版本:
gcc rot.c -S -O0
上述命令還關閉了可能有用的優化 ( -O0
)。
將生成一個rot.s
,其中包含該文件的整個程序集。 您不需要整個文件,但它可以幫助您找出手動移植工作中出錯的地方。
.syntax unified
.arch armv5
.global rotN
.text
// void rotN(char *str, int n);
pStr .req r0
delta .req r1
currChar .req r2
temp .req r3
dummy .req r12
.balign 64
.func
rotN:
ldrb currChar, [pStr], #1
.balign 16
1:
cmp currChar, #0
add temp, currChar, delta
bxeq lr
cmp currChar, #97
rsbshs dummy, currChar, #122
blo 5f
cmp temp, #122
subhi temp, temp, #26
ldrb currChar, [pStr], #1
strb temp, [pStr, #-2]
b 1b
.balign 16
5:
cmp currChar, #65
rsbshs dummy, currChar, #90
ldrb currChar, [pStr], #1
blo 1b
cmp temp, #90
subhi temp, temp, #26
strb temp, [pStr, #-2]
b 1b
.endfunc
.end
以上是使用標准指令集的純匯編版本。
將其視為一個教科書示例,最多比 C 版本快大約 10%。 (這值得么???)
請不要再詢問有關細節的問題。 只需按照說明進行操作,直到您完全理解整個代碼 - 這是最好的學習方式。
如果這是一項專業任務,並且 CPU 是armv6
或更高版本,我會使用增強的 DSP/SIMD 指令並使其速度提高兩倍,但那是另一回事。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.