1

我在 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,所以为什么它是一个 unsigned long 是为了其他讨论。现在,我想知道;哪个是高位词,哪个是低位词?(就此而言,longPIC24 C 中是 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

有人可以确认或纠正我对 unsigned long int 的 Hi/Low 顺序的想法吗?

编辑评论者要求这样做。可以回答问题(评论是我的)

请求评论,大小似乎是 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:                 
4

2 回答 2

2

这是来自 MPLAB C Compiler for PIC24 MCU 用户指南的片段:

5.3 数据表示
多字节数量以“小端”格式存储,这意味着:

  • 最低有效字节存储在最低地址
  • 最低有效位存储在编号最低的位位置

例如,长值的0x12345678存储地址0x100如下:
0x1000x1010x1020x103
 0x78  0x56  0x34  0x12 

再举一个例子,long 值0x12345678存储在寄存器 w4 和​​ w5 中:
   w4       w5   
0x56780x1234

于 2014-08-24T13:54:57.657 回答
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
于 2014-08-24T16:20:54.143 回答