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 なのかは別の議論に委ねます。今のところ、知りたいです。どちらが上位語でどちらが下位語ですか? (longさらに言えば、PIC24 Cの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

誰かが 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

以下は、PIC24 MCU 用 MPLAB C コンパイラのユーザー ガイドからの抜粋です。

5.3 データ表現
マルチバイト量は「リトルエンディアン」形式で保存されます。これは、次のことを意味します。

  • 最下位バイトは最下位アドレスに格納されます
  • 最下位ビットは、最小番号のビット位置に格納されます

例として、 の long 値は次のよう0x12345678に address に格納されます。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 に答える