ARMv7 Assembly Language: как обратить массив символов и вывести его на другой массив символов - PullRequest
0 голосов
/ 07 апреля 2019

Я новичок в программировании на ассемблере ARM7.

Я пытаюсь реализовать простую функцию в сборке ARM, которая принимает массив символов, переворачивает его и сохраняет в другом массиве символов равной длины.

Я включил мой код C и код языка сборки ARM7 ниже. Однако мой код не выводит правильную обратную строку; что, вероятно, из-за моих инструкций ASM. Я использую Linux на 32-битной машине.

reverseString.s (код ниже)

.global reverseString

.text

reverseString:
    MOV R2, R1          @store strIn[0] into R2
    PUSH {R4-R6}        @save regs
    MOV R4, #0          @R4 will be strIn_len reg, store 0 for count

@finds the length of the strIn arr
strlen_loop:
    LDR R3, [R2], #1    @increment through strIn arr
    ADD R4, R4, #1      @count the no. of chars
    CMP R3, #0          @check if null term hit
    BNE strlen_loop     @if yes leave, else cont.

@string reversal loop
    MOV R0, R2          @movs ptr of strOut to last element
loop:
    CMP R4, #0          @makes sure count !=0
    BEQ loop_end        @if yes, end loop
    LDR R5, [R1], #1    @incr. address of strIn in R1 and put into R5
    STR R5, [R0], #-1   @store the value at address in strOut
    SUB R4, R4, #1      @decrement counter var
    B loop

loop_end:
    POP {R4-R6} @restore regs
    BX LR

reverseString.c (код ниже)

#include <stdio.h>
#include <stdint.h>

extern void reverseString(char strOut[], const char strIn[]);

#define COUNT 6

int main()
{ 
  const char strIn[COUNT] = "candy";
  char strOut[COUNT];
  reverseString(strOut, strIn);
  printf("%s\r\n", strOut);
  return 0;
}

скомпилировано в командной строке с использованием

gcc -g -o reverseString reverseString.s reverseString.c
./reverseString

output

1 Ответ

0 голосов
/ 07 апреля 2019

Попробуйте эксперимент. Инициализируйте strOut чем-то, а после вызова reverseString выведите strIn и strOut. Обратите внимание на несколько забавный вывод.

Сейчас, в

        MOV R0, R2          @movs ptr of strOut to last element

Последний элемент чего именно?

R2, в strlen_loop выше, прошел strIn, и в этот момент содержит адрес его конца. Теперь R0 также содержит этот адрес, а остальная часть кода не имеет отношения к strOut. Он пытается повернуть вспять strIn.

Этот шаг не только вреден, но и излишен. Просто скопируйте с [R2], #-1 на [R0], #1.

...