簡體   English   中英

有沒有辦法將此 C 代碼轉換為 ARM 內聯匯編?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM