0
0
-------------------------------------------------------------------------------------------------------------------------------------
开发环境:AVR Studio 4.19 + avr-toolchain-installer-3.4.1.1195-win32.win32.x86
芯片型号:ATmega16
芯片主频:8MHz
-------------------------------------------------------------------------------------------------------------------------------------
第一种实现方式
(2016.10.28)
今天临时起意、去看了位域部分的反汇编,看看汇编如何实现位域。
使用到的位域如下定义:
// 事件队列的结构(type[7bit],lock[1bit],data[32bit])
typedef struct
{
uint8_t type :7 ; // 消息类型、如数码管数据有更新:EVENT_SEG_UPDATE
uint8_t lock :1 ; // 加锁标志
uint32_t data; // 消息参数、如数码管的数据:1265214
}T_EVENT_LIST, *pT_EVENT_LIST;
使用这个结构的代码如下:
// --------------------------------------
event_buffer_task01[0].type = EVENT_SEG_UPDATE; // EVENT_SEG_UPDATE = 0x06
event_buffer_task01[0].data = second;
对应的反汇编代码如下:
87: event_buffer_task01[0].type = EVENT_SEG_UPDATE;
+00000098: 918000CC LDS R24,0x00CC Load direct from data space
+0000009A: 7880 ANDI R24,0x80 Logical AND with immediate
+0000009B: 6086 ORI R24,0x06 Logical OR with immediate
+0000009C: 938000CC STS 0x00CC,R24 Store direct to data space
88: event_buffer_task01[0].data = second;
+0000009E: 91800060 LDS R24,0x0060 Load direct from data space // second的地址是0x0060
+000000A0: 91900061 LDS R25,0x0061 Load direct from data space
+000000A2: 91A00062 LDS R26,0x0062 Load direct from data space
+000000A4: 91B00063 LDS R27,0x0063 Load direct from data space
+000000A6: 938000CD STS 0x00CD,R24 Store direct to data space // event_buffer_task0[0].data的地址是0x00CD
+000000A8: 939000CE STS 0x00CE,R25 Store direct to data space
+000000AA: 93A000CF STS 0x00CF,R26 Store direct to data space
+000000AC: 93B000D0 STS 0x00D0,R27 Store direct to data space
可以看出,为了操作处于同一个字节里面的
.type和
.lock,汇编里面使用
与操作和
或操作来实现对
bit7(.lock)和
bit[6:0](.type)的操作。
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
0