Embedded 如果用C编码的嵌入式系统是8位或16位的,它将如何处理像int这样的32位数据类型?
我认为我的想法是错误的,但我想知道一个少于32位的嵌入式系统如何使用32位的数据值。我是一名初级程序员,所以请对我放轻松:)base 10Embedded 如果用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 +
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米