Как получить значение переменной asm на языке Си? - PullRequest
0 голосов
/ 04 января 2019

Теперь я пытаюсь понять код прошивки CM3. Но особенно я обнаружил, что часть кода сделана с помощью кода asm, как показано ниже, код asm

// Uart string output 
void UartPuts(unsigned char * mytext)
{
  unsigned char CurrChar;
  do {
    CurrChar = *mytext;
    if (CurrChar != (char) 0x0) {
      UartPutc(CurrChar);  // Normal data
      }
    *mytext++;
  } while (CurrChar != 0); 
  return;
}   
#if defined ( __CC_ARM   )
/* ARM RVDS or Keil MDK */
__asm void FlashLoader_ASM(void)
{
   MOVS  R0,#0
   LDR   R1,[R0]     ; Get initial MSP value
   MOV   SP, R1
   LDR   R1,[R0, #4] ; Get initial PC value
   BX    R1
}

и я хочу напечатать значение MSP и значение ПК с помощью функции UartPuts.

Подскажите, пожалуйста, как мне это сделать, чтобы распечатать?

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

Небольшое предостережение. Если вы попытаетесь прочитать с адреса 0x0, используя 'C', существует высокая вероятность того, что вы столкнетесь с ловушкой нулевого указателя времени компиляции, поскольку ваш начальный указатель указателя стека определен в C как недопустимый указатель.

Таким образом, в зависимости от компилятора (pre gcc 4.9.3 этого не сделает), вы можете увидеть совершенно неожиданный undef_opcode в собранном выводе. Не существует «чистого» способа чтения с адреса 0 в C, но использование арифметики с указателем должно работать (если вы не включите проверку нулевого указателя во время выполнения).

0 голосов
/ 06 января 2019

В одну сторону (синтаксис газа):

.thumb_func
.globl GET32
GET32:
    ldr r0,[r0]
    bx lr

extern unsigned int GET32 ( unsigned int );
unsigned int x;
...
x = GET32(0x00000000);
...
x = GET32(0x00000004);

другой способ, не требуется asm:

#define ZERO (*((volatile unsigned int *)0x00000000))
#define FOUR (*((volatile unsigned int *)0x00000004))
...
unsigned int x;
...
x = ZERO;
...
x = FOUR;

Может использовать uint32_t вместо unsigned int, если у вас есть stdint.h или эквивалентный. (приведет к неподписанному int для gcc и clang / llvm).

получено из вашего кода / синтаксиса

__asm uint32_t read_zero(void)
{
   MOVS  R0,#0
   LDR   R0,[R0]
   BX LR
}

__asm uint32_t read_four(void)
{
   MOVS  R0,#4
   LDR   R0,[R0]
   BX LR
}
...