Как выглядит Unsigned Long in C на языке ассемблера PIC24?

У меня есть переменная, определенная в C на PIC24

Допустим, имя переменной (в файле C) The_Number_Of_Bytes

В коде PIC24 C это определяется следующим образом...

 unsigned long The_Number_Of_Bytes=0;   // number of bytes in buffer

Я буду вызываться, когда массив байтов с именем DATABUF01 будет содержать The_Number_Of_Bytes байтов (извините за подразумеваемую избыточность), и мне нужно убедиться, что я делаю столько байтов, а затем останавливаюсь.

Я довольно уверен, что число будет меньше 65535, поэтому, почему это длинная без знака, для других обсуждений. Сейчас я хочу знать; какое слово старшего разряда и какое слово младшего разряда? (В этом отношении, это long 32-битное число в PIC24 C?)

Может ли кто-нибудь сказать мне, что будет в W2 а также W3 в этом примере?

    Mov.W   #_The_Number_Of_Bytes, W1       ;From the dispatcher
    Mov.W   [W1++], W2                      ;My question: Hi Order or Low Order ?
    Mov.W   [W1],   W3                      ;My question: Hi Order or Low ?

    Mov.W   #_DATABUF01, W4                 ;The Start

    Mov.B   [W4++], W5                      ;First byte...

    :                                       ;Whatever
    :                                       ;Whatever
    :                                       ;Whatever

Может ли кто-нибудь подтвердить или исправить мои мысли о порядке Hi / Low для unsigned long int?

Редактировать комментатор просил это. Может ответить на вопрос (комментарии мои)

Запрашиваемый комментарий, размер составляет 4 байта, из этого...

  45:                 unsigned long i=0;    
    0AB6A  B80060     mul.uu 0x0000,#0,0x0000    ;make a zero
    0AB6C  980710     mov.w 0x0000,[0x001c+2]    ;no clue which word
    0AB6E  980721     mov.w 0x0002,[0x001c+4]    ;aha, if I made it 1 or 2, I'd know
  46:                 unsigned int Fischer;
  47:                 
  48:                 Fischer = sizeof(i);
      0AB70  200040     mov.w #0x4,0x0000         ;So it must be 4
      0AB72  780F00     mov.w 0x0000,[0x001c]     ;okay, it's a 4 byte number
  49:                 

2 ответа

Решение

Вот фрагмент из MPLAB C Compiler для PIC24 MCU: руководство пользователя:

5.3 ПРЕДСТАВЛЕНИЕ ДАННЫХ
Многобайтовые количества хранятся в формате "little-endian", что означает:

  • Младший значащий байт хранится по младшему адресу
  • Младший значащий бит хранится в позиции с наименьшим номером

Как пример, длинное значение 0x12345678 хранится по адресу 0x100 следующее:
0x100 0x101 0x102 0x103
0x78 0x56 0x34 0x12

В качестве другого примера, длинное значение 0x12345678 хранится в регистрах w4 и w5:
w4 w5
0x5678 0x1234

Вы также можете просмотреть сборку для программы, чтобы попытаться понять, как их компилятор делает это... например:

int main(int argc, char** argv)
{
  long i = 56;
  long j = i;
  return 0;
}

становится... (xc16-gcc -S main.c)

    .file "/Users/grady/MPLABXProjects/testpic24.X/main.c"
    .section    .text,code
    .align  2
    .global _main   ; export
    .type   _main,@function
_main:
    .set ___PA___,1
    lnk #12
    mov w0,[w14+8]
    mov w1,[w14+10]
    mov #56,w4
    mov #0,w5
    mov.d   w4,[w14]
    mov.d   [w14],w4
    mov w4,[w14+4]
    mov w5,[w14+6]
    clr w4
    mov w4,w0
    ulnk    
    return  
    .set ___PA___,0

    .section __c30_signature, info, data
    .word 0x0001
    .word 0x0000
    .word 0x0000

; MCHP configuration words

    .set ___PA___,0
    .end
Другие вопросы по тегам