assembly 如何在ARM汇编中获取字符串中字符的ASCII值?

mu0hgdu0  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(154)

我必须把下面的代码转换成汇编语言:

void rotN1(char *str, int n)
{ // NB: str will be modified in-place
  char *p;
  for (p = str; *p != '\0'; p++)
  {
    int currChar = (int)*p;
    if (currChar >= 'a' && currChar <= 'z')
    {
      currChar = currChar + n;
      if (currChar > 'z')
      {
        currChar = currChar - 26;
      }
      *p = (char)currChar;
    }
  }
}

它基本上是在一个给定的字符串(str)上使用凯撒密码,n是加密密钥。

.data
        array:  .string         %[str]
        .equ    len.array,.-array
        .align

.text
        .global  main
main:

        nop

        ldr r2,=array           // pointer
        MOV r0, #0              // initialise loop index to 0
        MOV r1, #len.array      // number of elements 
    MOV r4, %[n]
        Loop:
                ldrb r3, [r2, r0]
            mov r6, # 
            B check_A 
            B check_Z
            ADD r3, r3, r4
            

        ADD r0, r0, #1           //increment loop index
        CMP r0, r1
        BLE Loop

_exit:
        mov r7, #1
        svc 0


check_A:
CMP r3, #97
BLT _exit

check_Z:
CMP r3, #122
BGT _exit

我还没有完成代码,但是在遍历数组的时候,我需要在每次迭代中得到那个字符的ASCII值。有没有办法做到这一点?我必须在C中以内嵌ARM的方式来做这件事。

jrcvhitl

jrcvhitl1#

  • ...“我需要在每次迭代中获取该字符的ASCII值。"*

你已经有了。
每个ASCII字符都有一个整数值,如链接表中所示。字符范围从A-到Z(如表的小数列中所示)的整数值范围是从6590,而a-z的范围是从97122。因此,在数组中,例如:

char msg[] = "Hello";

x1M7 N1 x具有x1M8 N1 x值,
msg[4]具有111的值,
msg[5]具有0的值。
注意,最后一次转换是因为msg是用字符串文字初始化的,并且C中的string literals被定义为以NULL终止符终止的char数组。注意,不是所有的char数组都要求以NULL终止,在这种情况下,该数组将是简单的char数组。而不是C字符串。
此外,正如您在帖子中显示的那样,用单引号括起来的ASCII码char表示该字符的整数值。例如,在表达式中

char aitch = 'H';

aitch现在的值为72。(同样,以10为基数显示)

相关问题