我在PIC24上用C定义了一个变量
假设变量的名称(在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,所以为什么它是无符号长的是其他讨论。现在,我想知道;哪个是高阶词,哪个是低阶词呢? (就此而言,PIC24 C中的long
是32位数吗?)
有人可以告诉我这个例子中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
有人可以确认或纠正我对无符号long int的高/低顺序的看法吗?
EDIT 评论者要求此。可以回答这个问题(评论是我的)
请求的评论,大小似乎是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:
答案 0 :(得分:2)
以下是来自MPLAB C编译器的PIC24 MCU用户指南的片段:
5.3数据表示
多字节数量以“小端”格式存储,这意味着:
- 最低有效字节存储在最低地址
- 最低有效位存储在编号最小的位
例如,
0x12345678
的长值存储在地址0x100
,如下所示:
的为0x100 强> 的 0x101 强> 的 0x102 强> <强> 0x103 强>
0x78 0x56储存 0x34 0×12作为另一个例子,
0x12345678
的长值存储在寄存器w4和w5中:
w4 w5
0x5678的 0x1234的
答案 1 :(得分:1)
你也可以查看程序的程序集,试着了解它们的编译器是如何做到的......例如:
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