我必须把下面的代码转换成汇编语言:
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的方式来做这件事。
1条答案
按热度按时间jrcvhitl1#
你已经有了。
每个ASCII字符都有一个整数值,如链接表中所示。字符范围从
A
-到Z
(如表的小数列中所示)的整数值范围是从65
到90
,而a-z
的范围是从97
到122
。因此,在数组中,例如:x1M7 N1 x具有x1M8 N1 x值,
msg[4]
具有111
的值,msg[5]
具有0
的值。注意,最后一次转换是因为
msg
是用字符串文字初始化的,并且C
中的string literals被定义为以NULL
终止符终止的char
数组。注意,不是所有的char
数组都要求以NULL
终止,在这种情况下,该数组将是简单的char
数组。而不是C
字符串。此外,正如您在帖子中显示的那样,用单引号括起来的ASCII码
char
表示该字符的整数值。例如,在表达式中aitch
现在的值为72。(同样,以10为基数显示)