在PIC24汇编语言中,C中的无符号长整数是什么样的?

时间:2013-03-19 18:58:58

标签: c assembly unsigned-long-long-int pic24

我在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位数吗?)

有人可以告诉我这个例子中W2W3会有什么结果?

    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:                 

2 个答案:

答案 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