B001-Atmega16-位域的汇编实现

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

你可能感兴趣的:(汇编,位域,位域的实现)