Как выглядит 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