Embedded 如果用C编码的嵌入式系统是8位或16位的,它将如何处理像int这样的32位数据类型?

Embedded 如果用C编码的嵌入式系统是8位或16位的,它将如何处理像int这样的32位数据类型?,embedded,Embedded,我认为我的想法是错误的,但我想知道一个少于32位的嵌入式系统如何使用32位的数据值。我是一名初级程序员,所以请对我放轻松:)base 10 0100 <- carry in/out 5432 +1177 ====== 6609 然后得出6609的结果,因为我们知道它是基于列的,并且每个列都被单独处理 基地2 1111 +0011 ===== 11110 1111 +0011 ===== 10010 110 11 +11 ===== 10 111 11 +

我认为我的想法是错误的,但我想知道一个少于32位的嵌入式系统如何使用32位的数据值。我是一名初级程序员,所以请对我放轻松:)

base 10

 0100  <- carry in/out  
 5432
+1177
======
 6609
然后得出6609的结果,因为我们知道它是基于列的,并且每个列都被单独处理

基地2

 1111
+0011
=====

11110 
 1111
+0011
=====
10010

110 
 11
+11
=====
 10

111 
 11
+00
=====
100
    abcd
*   1101
========
    abcd
   0000
  abcd
+abcd
=========
结果10010

你可以把你的操作分解成你想要的8,16,13,97位。它是基于列(用于添加)的,并且只起作用。除法你们应该能够理解,乘法就是移位和加法,也可以将其转化为多重运算

n位*n位=2*n位,因此如果您有一个8位*8位=16位乘法,您可以在8位系统上使用它,否则您必须限制为4位*4位=8位并使用它(或者如果没有乘法,则只需执行移位和加法)

基地2

 1111
+0011
=====

11110 
 1111
+0011
=====
10010

110 
 11
+11
=====
 10

111 
 11
+00
=====
100
    abcd
*   1101
========
    abcd
   0000
  abcd
+abcd
=========
它可以分解为移位和加法问题,可以用4位、8位或M位处理器/寄存器/alu处理N位

或者换个角度来看,小学代数

(a+b)*(c+d)=ac+bc+ad+bd

mnop*tuvw=((mn*0x100)+(op))*((tu*0x100)+(vw))=(a+b)*(c+d)

您应该发现,您可以将带0x100术语和不带, 在不使用8位alu(或8位中的4位,视需要而定)将答案的各个部分组合在一起的情况下,分别从中执行这些操作

移位应该很明显,只需将位移到下一个字节或(半)字或其他位置

而按位操作(xor、and、or)是按位的,所以不需要任何特殊的操作,只要保持列对齐即可

编辑

或者你可以试试看

unsigned long fun1 ( unsigned long a, unsigned long b )
{
    return(a+b);
}

00000000 <_fun1>:
   0:   1166            mov r5, -(sp)
   2:   1185            mov sp, r5
   4:   1d40 0004       mov 4(r5), r0
   8:   1d41 0006       mov 6(r5), r1
   c:   6d40 0008       add 10(r5), r0
  10:   6d41 000a       add 12(r5), r1
  14:   0b40            adc r0
  16:   1585            mov (sp)+, r5
  18:   0087            rts pc

00000000 <fun1>:
   0:   0e 5c           add r12,    r14 
   2:   0f 6d           addc    r13,    r15 
   4:   30 41           ret 

00000000 <fun1>:
   0:   62 0f           add r22, r18
   2:   73 1f           adc r23, r19
   4:   84 1f           adc r24, r20
   6:   95 1f           adc r25, r21
   8:   08 95           ret
unsigned long fun1(unsigned long a,unsigned long b)
{
返回(a+b);
}
00000000 :
0:1166 mov r5,-(sp)
2:1185 mov sp,r5
4:1d40 0004 mov 4(r5),r0
8:1d41 0006 mov 6(r5),r1
c:6d40 0008加上10(r5),r0
10:6d41 000a添加12(r5),r1
14:0b40模数转换器r0
16:1585 mov(sp)+,r5
18:0087 rts pc
00000000 :
0:0e 5c添加r12、r14
2:0f 6d addc r13、r15
4:30 41 ret
00000000 :
0:62 0f添加r22和r18
2:73 1f模数转换器r23,r19
4:84 1f模数转换器r24,r20
6:95 1f模数转换器r25,r21
8:08 95 ret
如果您能够理解这些指令集,则可以获得额外的积分

unsigned long fun2 ( unsigned long a, unsigned long b )
{
    return(a*b);
}

00000000 <_fun2>:
   0:   1166            mov r5, -(sp)
   2:   1185            mov sp, r5
   4:   10e6            mov r3, -(sp)
   6:   1d41 0006       mov 6(r5), r1
   a:   1d40 000a       mov 12(r5), r0
   e:   1043            mov r1, r3
  10:   00a1            clc
  12:   0c03            ror r3
  14:   74d7 fff2       ash $-16, r3
  18:   6d43 0004       add 4(r5), r3
  1c:   70c0            mul r0, r3
  1e:   00a1            clc
  20:   0c00            ror r0
  22:   7417 fff2       ash $-16, r0
  26:   6d40 0008       add 10(r5), r0
  2a:   7040            mul r0, r1
  2c:   10c0            mov r3, r0
  2e:   6040            add r1, r0
  30:   0a01            clr r1
  32:   1583            mov (sp)+, r3
  34:   1585            mov (sp)+, r5
  36:   0087            rts pc
unsigned long fun2(unsigned long a,unsigned long b)
{
申报表(a*b);
}
00000000 :
0:1166 mov r5,-(sp)
2:1185 mov sp,r5
4:10E6movR3,-(sp)
6:1d41 0006 mov 6(r5),r1
a:1d40 000a mov 12(r5),r0
e:1043 mov r1,r3
10:00a1 clc
12:0c03 ror r3
14:74d7 fff2灰分$-16,r3
18:6d43 0004添加4(r5),r3
1c:70c0 mul r0,r3
1e:00a1 clc
20:0C00ROR r0
22:7417 fff2灰分$-16,r0
26:6d40 0008添加10(r5),r0
2a:7040 mul r0,r1
2c:10毫伏r3,r0
2e:6040加上r1和r0
30:0a01 clr r1
32:1583mov(sp)+,r3
34:1585 mov(sp)+,r5
36:0087 rts pc
基数10

 0100  <- carry in/out  
 5432
+1177
======
 6609
然后得出6609的结果,因为我们知道它是基于列的,并且每个列都被单独处理

基地2

 1111
+0011
=====

11110 
 1111
+0011
=====
10010

110 
 11
+11
=====
 10

111 
 11
+00
=====
100
    abcd
*   1101
========
    abcd
   0000
  abcd
+abcd
=========
结果10010

你可以把你的操作分解成你想要的8,16,13,97位。它是基于列(用于添加)的,并且只起作用。除法你们应该能够理解,乘法就是移位和加法,也可以将其转化为多重运算

n位*n位=2*n位,因此如果您有一个8位*8位=16位乘法,您可以在8位系统上使用它,否则您必须限制为4位*4位=8位并使用它(或者如果没有乘法,则只需执行移位和加法)

基地2

 1111
+0011
=====

11110 
 1111
+0011
=====
10010

110 
 11
+11
=====
 10

111 
 11
+00
=====
100
    abcd
*   1101
========
    abcd
   0000
  abcd
+abcd
=========
它可以分解为移位和加法问题,可以用4位、8位或M位处理器/寄存器/alu处理N位

或者换个角度来看,小学代数

(a+b)*(c+d)=ac+bc+ad+bd

mnop*tuvw=((mn*0x100)+(op))*((tu*0x100)+(vw))=(a+b)*(c+d)

您应该发现,您可以将带0x100术语和不带, 在不使用8位alu(或8位中的4位,视需要而定)将答案的各个部分组合在一起的情况下,分别从中执行这些操作

移位应该很明显,只需将位移到下一个字节或(半)字或其他位置

而按位操作(xor、and、or)是按位的,所以不需要任何特殊的操作,只要保持列对齐即可

编辑

或者你可以试试看

unsigned long fun1 ( unsigned long a, unsigned long b )
{
    return(a+b);
}

00000000 <_fun1>:
   0:   1166            mov r5, -(sp)
   2:   1185            mov sp, r5
   4:   1d40 0004       mov 4(r5), r0
   8:   1d41 0006       mov 6(r5), r1
   c:   6d40 0008       add 10(r5), r0
  10:   6d41 000a       add 12(r5), r1
  14:   0b40            adc r0
  16:   1585            mov (sp)+, r5
  18:   0087            rts pc

00000000 <fun1>:
   0:   0e 5c           add r12,    r14 
   2:   0f 6d           addc    r13,    r15 
   4:   30 41           ret 

00000000 <fun1>:
   0:   62 0f           add r22, r18
   2:   73 1f           adc r23, r19
   4:   84 1f           adc r24, r20
   6:   95 1f           adc r25, r21
   8:   08 95           ret
unsigned long fun1(unsigned long a,unsigned long b)
{
返回(a+b);
}
00000000 :
0:1166 mov r5,-(sp)
2:1185 mov sp,r5
4:1d40 0004 mov 4(r5),r0
8:1d41 0006 mov 6(r5),r1
c:6d40 0008加上10(r5),r0
10:6d41 000a添加12(r5),r1
14:0b40模数转换器r0
16:1585 mov(sp)+,r5
18:0087 rts pc
00000000 :
0:0e 5c添加r12、r14
2:0f 6d addc r13、r15
4:30 41 ret
00000000 :
0:62 0f添加r22和r18
2:73 1f模数转换器r23,r19
4:84 1f模数转换器r24,r20
6:95 1f模数转换器r25,r21
8:08 95 ret
如果您能够理解这些指令集,则可以获得额外的积分

unsigned long fun2 ( unsigned long a, unsigned long b )
{
    return(a*b);
}

00000000 <_fun2>:
   0:   1166            mov r5, -(sp)
   2:   1185            mov sp, r5
   4:   10e6            mov r3, -(sp)
   6:   1d41 0006       mov 6(r5), r1
   a:   1d40 000a       mov 12(r5), r0
   e:   1043            mov r1, r3
  10:   00a1            clc
  12:   0c03            ror r3
  14:   74d7 fff2       ash $-16, r3
  18:   6d43 0004       add 4(r5), r3
  1c:   70c0            mul r0, r3
  1e:   00a1            clc
  20:   0c00            ror r0
  22:   7417 fff2       ash $-16, r0
  26:   6d40 0008       add 10(r5), r0
  2a:   7040            mul r0, r1
  2c:   10c0            mov r3, r0
  2e:   6040            add r1, r0
  30:   0a01            clr r1
  32:   1583            mov (sp)+, r3
  34:   1585            mov (sp)+, r5
  36:   0087            rts pc
unsigned long fun2(unsigned long a,unsigned long b)
{
申报表(a*b);
}
00000000 :
0:1166 mov r5,-(sp)
2:1185 mov sp,r5
4:10E6movR3,-(sp)
6:1d41 0006米