void_c 发表于 2009-3-25 08:52:40

51是小端模式,还是大端模式呢?

51是小端模式,还是大端模式呢?
还是51本身没有大小端之分,只是编译器采用大端或者小端。

lusson 发表于 2009-3-25 08:54:44

是编绎器的关系。。

billowtust 发表于 2009-3-25 08:57:44

应该是和芯片有关的吧

51是大端模式

buffalo 发表于 2009-3-25 09:07:14

学习

dr2001 发表于 2009-3-25 09:33:17

很久没有用51了。

标准52的指令集和寄存器,基本上都是8位的,因此不分大小端。
涉及大于8Bit操作应该是只有MOV DPTR, #imm一个指令,这个指令的编码印象中是大端的。就是OPCode, Hi 8Bit, Lo 8Bit,共3字节。

其它的数据类型,在C是编译器实现的,Keil用的是大端。用别的编译器可能会有变化。

yxw_bob 发表于 2009-3-28 14:51:29

【2楼】 billowtust 回答的很正确。是和芯片有关,51是大端模式 !!!!!!!!!!!!!

aozima 发表于 2009-3-28 16:04:27

KEIL C51 是大端模式 SDCC是小端模式
其它的MCU的其它编译器我都见过的是小端模式
从个人主观上讲我喜欢小端模式.

void_c 发表于 2009-3-28 16:27:14

iar8051也是小端模式。

livanfield 发表于 2009-3-28 21:27:23

51大端,AVR、微机小端。
小端就是“高高低低”(16位数的高8位放高地址),大端则刚好相反

yxw_bob 发表于 2009-3-28 22:59:23

【2楼】 billowtust 回答的很正确。是和芯片有关,51是大端模式 !!!!!!!!!!!!!

   本人无聊再重复一边。看来大家的51单片机,,,呵呵。。。

    建议大家好好的找本单片机的书好好的看看。

yxw_bob 发表于 2009-3-28 23:02:41

看一个CPU是大端模式,还是小端模式,主要看该CPU的WORD的存放方式。例如ARM,既可以是大端模式,也可以是小端模式;80X86是小端模式。

cddyy 发表于 2009-3-28 23:16:34

我只有在用联合体的时候才会去编译器里看下是什么模式,一般使用不用操心,

模式在8位机里面是看编译器的吧。

chess01 发表于 2009-4-3 16:35:20

4楼正解,大小端只与编译器有关,跟芯片没关系

rainyss 发表于 2009-4-3 23:28:20

大端.高字节在前.
unsigned long *x = 0x1000;
*x = 0x12345678;

:

0x1000: 12
0x1001: 34
0x1002: 56
0x1003: 78

大端小端并不是编译器说了算,是CPU架构说了算.8位机一样有16位操作数,你看16位操作数是大端还是小端.比如
ljmp 0x1234
看它的机器码是怎么写的,就清楚了:

02 12 34

unsv 发表于 2009-4-4 10:07:50

自己试试就知道了!!
keil是低地址存高字节!

win100 发表于 2009-12-3 23:41:08

学习了。

nicksean 发表于 2012-2-28 23:04:49

关于大小端的问题,我同意4楼的意见。就CPU指令来讲肯定是分大小端的,除非全部指令都是8位的。对于8位机来说,多字节的数据类型是由编译器来处理的,所以编译器就存在了大小端的问题。

如果我们将0x1234abcd写入到以0x0000开始的内存中,则结果为
            大端      小端
0x0000      0x12      0xcd
0x0001      0x34      0xab
0x0002      0xab      0x34
0x0003      0xcd      0x12

下面Keil C51编译出的代码来看,Keil 是大端的
    68: a.w = 0x1234;
    69:
C:0x15AC    752812   MOV      0x28,#0x12
C:0x15AF    752934   MOV      0x29,#0x34

从C51定时器的寄存器地址来看,我认为C51 CPU本身应该是小端的,以下摘自Keil 的帮助文档:
the 8052 uses addresses 0xCC and 0xCD for the low and high bytes of timer/counter 2 respectively.

Access to 16-bit SFRs using sfr16 is possible only when the low byte immediately precedes the high byte (little endian) and when the low byte is written last. The low byte is used as the address in the sfr16 declaration. For example:

sfr16 T2 = 0xCC;   /* Timer 2: T2L 0CCh, T2H 0CDh */
sfr16 RCAP2 = 0xCA;/* RCAP2L 0CAh, RCAP2H 0CBh */

hamipeter 发表于 2012-2-28 23:45:01

和CPU的指令有关系,51芯片本身是大端模式
页: [1]
查看完整版本: 51是小端模式,还是大端模式呢?