AVR单片机C语言调用汇编指令集的宏

/*************************************
*** AVR单片机C语言调用汇编指令集的宏 ***
*************************************/

#ifndef _ASM_H_
#define _ASM_H_

/********************
*** 算术和逻辑指令 ***
********************/

// ### ADD ### 两个寄存器相加 (dest = dest + src)
#define ASM_ADD(dest, src) asm volatile ("add %0, %1" : "=r" (dest) : "r" (src))

// ### ADC ### 两个寄存器带进位位相加 (dest = dest + src + carry)
#define ASM_ADC(dest, src) asm volatile ("adc %0, %1" : "=r" (dest) : "r" (src))

// ### ADC_zero ### Add Carry To Register dest (dest = dest + carry), Special Form Of ADC
#define ASM_ADCzero(dest) asm volatile ("adc %0, __zero_reg__" : "=r" (dest) :)

// ### ADIW ### 立即数与字相加 (word = word - const)
#define ASM_ADIW(word, const) asm volatile ("adiw %0, %1" : "=w" (word) : "I" (const))

// ### SUB ### 两个寄存器相减 (dest = dest - src)
#define ASM_SUB(dest, src) asm volatile ("sub %0, %1" : "=r" (dest) : "r" (src))

// ### SUBI ### 立即数与寄存器相减 (reg = reg - const)
#define ASM_SUBI(reg, const) asm volatile ("subi %0, %1" : "=d" (reg) : "M" (const))

// ### SBC ### 两个寄存器带进位位相减 (dest = dest - src - carry)
#define ASM_SBC(dest, src) asm volatile ("sbc %0, %1" : "=r" (dest) : "r" (src))

// ### SBC_zero ### Subtract Carry From Register dest (dest = dest - carry), Special Form Of SBC
#define ASM_SBC_zero(dest) asm volatile ("sbc %0, __zero_reg__ " : "=r" (dest) :)

// ### SBIW ### 字与立即数相减 (reg = reg - const)
#define ASM_SBIW(word, const) asm volatile ("sbiw %0, %1" : "=w" (word) : "I" (const))

// ### AND ### 两个寄存器逻辑与 (dest = dest & src)
#define ASM_AND(dest, src) asm volatile ("and %0, %1" : "=r" (dest) : "r" (src))

// ### ANDI ### 寄存器与常数逻辑与 (reg = reg & const)
#define ASM_ANDI(reg, const) asm volatile ("andi %0, %1" : "=d" (reg) : "M" (const))

// ### OR ### 两个寄存器逻辑或 (dest = dest | src)
#define ASM_OR(dest, src) asm volatile ("or %0, %1" : "=r" (dest) : "r" (src))

// ### ORI ### 寄存器与常数逻辑或 (reg = reg | const)
#define ASM_ORI(reg, const) asm volatile ("ori %0, %1" : "=d" (reg) : "M" (const))

// ### EOR ### 两个寄存器异或 (dest = dest ^ src)
#define ASM_EOR(dest, src) asm volatile ("eor %0, %1" : "=r" (dest) : "r" (src))

// ### COM ### 1的补码 (reg = 0xFF - reg)
#define ASM_COM(reg) asm volatile ("com %0" : "=r" (reg) : "0" (reg))

// ### NEG ### 2的补码 (reg = 0x00 - reg)
#define ASM_NEG(reg) asm volatile ("neg %0" : "=r" (reg) : "0" (reg))

// ### SBR ### 寄存器的某些位置位 (reg = reg | mask)
#define ASM_SBR(reg, mask) asm volatile ("sbr %0, %1" : "=d" (reg) : "M" (mask))

// ### CBR ### 寄存器的某些

位清零 (reg = reg & ~mask)
#define ASM_CBR(reg, mask) asm volatile ("sbr %0, %1" : "=d" (reg) : "M" (mask))

// ### INC ### 加一 (reg = reg + 1)
#define ASM_INC(reg) asm volatile ("inc %0" : "=r" (reg) : "0" (reg))

// ### DEC ### 减一Rd ← (reg = reg - 1)
#define ASM_DEC(reg) asm volatile ("dec %0" : "=r" (reg) : "0" (reg))

// ### TST ### 测试为0或负 (reg = reg & reg)
#define ASM_TST(reg) asm volatile ("tst %0" : "=r" (reg) : "0" (reg))

// ### CLR ### 清零寄存器 (reg = reg ^ reg)
#define ASM_CLR(reg) asm volatile ("clr %0" : "=r" (reg) : "0" (reg))

// ### SER ### 置位寄存器 (reg = 0xFF)
#define ASM_SER(reg) asm volatile ("ser %0" : "=r" (reg) : "0" (reg))

// ### MUL ### 无符号数相乘 (r1:r0 = ureg1 * ureg2)
#define ASM_MUL(ureg1, ureg2) asm volatile ("mul %0, %1" :: "r" (ureg1), "r" (ureg2))

// ### MULS ### 有符号数相乘 (r1:r2 = sreg1 * sreg2)
#define ASM_MULS(sreg1, sreg2) asm volatile ("muls %0, %1" :: "d" (sreg1), "d" (sreg2))

// ### MULSU ### 有符号数与无符号数相乘 (r1:r2 = sreg * ureg)
#define ASM_MULSU(sreg, ureg) asm volatile ("mulsu %0, %1" :: "a" (sreg), "a" (ureg))

// ### FMUL ### 无符号小数相乘 (r1:r2 = (ureg1 * ureg2) << 1)
#define ASM_FMUL(ureg1, ureg2) asm volatile ("fmul %0, %1" :: "a" (ureg1), "a" (ureg2))

// ### FMULS ### 有符号小数相乘 (r1:r2 = (sreg1 * sreg2) << 1)
#define ASM_FMULS(sreg1, sreg2) asm volatile ("fmuls %0, %1" :: "a" (sreg1), "a" (sreg2))

// ### FMULSU ### 无符号小数与有符号小数相乘 (r1:r2 = (sreg * ureg) << 1)
#define ASM_FMULSU(sreg, ureg) asm volatile ("fmulsu %0, %1" :: "a" (sreg), "a" (ureg))



/***************
*** 跳转指令 ***
***************/
// ### ICALL ### 相对调用到(Z) (PC = Z)
#define ASM_ICALL() asm volatile ("icall" :: )



/******************
*** 数据传输指令 ***
******************/

// ### MOV ### 寄存器之间数据转移 (dest = src)
#define ASM_MOV(dest, src) asm volatile ("mov %0, %1" : "=r" (dest) : "r" (src))

// ### MOVW ### 拷贝寄存器字 (dest = src)
#define ASM_MOVW(dest, src) asm volatile ("movw %0, %1" : "=r" (dest) : "r" (src))

// ### LDI ### 加载立即数 (reg = const)
#define ASM_LDI(reg, const) asm volatile ("ldi %0, %1" : "=d" (reg) : "M" (const))

// ### LD ### 使用 X, Y, Z 指针间接加载 (reg = *ptr)
#define ASM_LD(reg, ptr) asm volatile ("ld %0, %a1" : "=r" (reg) : "e" (ptr))

// ### LD ### 1.预减X, Y, Z, 2.使用 X 指针间接加载 (ptr = ptr - 1, reg = *ptr)
#define ASM_decLD(reg, ptr) asm volatile ("ld %0, -%a1" : "=r" (reg) : "e" (ptr))

// ### LD ### 1.使用 X, Y, Z 指针间接加载, 2.指针后加 (reg = *ptr, ptr = ptr + 1)
#define ASM_LDinc(reg, ptr) asm volatile ("ld %0, %a1+" : "=r" (reg) : "

e" (ptr))

// ### STS ### 直接存储到SRAM
// 变量存储到SRAM的用法: static uint8_t var; uint8_t value = 123; ASM_STS (&var, value);
// 值存储到SFR的用法: uint8_t value = 5; ASM_STS (_SFR_MEM_ADDR (SPMCR), value);
#define ASM_STS(addr, reg) asm volatile ("sts %0, %1" : : "i" (addr), "r" (reg))

// ### LPM ### 加载程序存储器 (R0 = *Z)
#define ASM_LPM() asm volatile ("lpm" ::)

// ### LPM ### 加载程序存储器 (reg = *Z)
#define ASM_LPM_Z(reg) asm volatile ("lpm %0, Z" : "=r" (reg))

// ### LPM ### 加载程序存储器并执行后加操作 (reg = *Z, Z = Z + 1)
#define ASM_LPM_Zinc(reg) asm volatile ("lpm %0, Z+" : "=r" (reg))

// ### SPM ### 存储程序存储器 (*Z = R1:R0)
#define ASM_SPM() asm volatile ("spm" ::)



/********************
*** 位和位测试指令 ***
********************/

// ### SBI ### 置位I/O寄存器的某一位
#define ASM_SBI(port, pin) asm volatile ("sbi %0, %1" :: "I" (_SFR_IO_ADDR(port)), "I" (pin))

// ### CBI ### 清除I/O寄存器的某一位
#define ASM_CBI(port, pin) asm volatile ("cbi %0, %1" :: "I" (_SFR_IO_ADDR(port)), "I" (pin))

// ### LSL ### 逻辑左移 (reg = reg << 1)
#define ASM_LSL(reg) asm volatile ("lsl %0" : "=r" (reg) : "0" (reg))

// ### LSR ### 逻辑右移 (reg = reg >> 1)
#define ASM_LSR(reg) asm volatile ("lsr %0" : "=r" (reg) : "0" (reg))

// ### ROL ### 通过进位位向左循环
#define ASM_ROL(reg) asm volatile ("rol %0" : "=r" (reg) : "0" (reg))

// ### ROR ### 通过进位位向右循环
#define ASM_ROR(reg) asm volatile ("ror %0" : "=r" (reg) : "0" (reg))

// ### ASR ### 算术右移 (Wie LSR Aber nur mit Bit 6 bis Bit 0)
#define ASM_ASR(reg) asm volatile ("asr %0" : "=r" (reg) : "0" (reg))

// ### SWAP ### 高4位与低4位交换 (reg(0...3) = reg(4...7), reg(4...7) = reg(0...3))
#define ASM_SWAP(reg) asm volatile ("swap %0" : "=r" (reg) : "0" (reg))

// ### BSET ### 置位标志位 (SREG(flagnumber) = 1)
#define ASM_BSET(flagnumber) asm volatile ("bset %0" :: "I" (flagnumber))

// ### BCLR ### 清零标志位 (SREG(flagnumber) = 0)
#define ASM_BCLR(flagnumber) asm volatile ("bclr %0" :: "I" (flagnumber))

// ### BST ### 将寄存器的某一位保存到T (T = reg(bitnumber))
#define ASM_BST(reg, bitnumber) asm volatile ("bst %0, %1" :: "r" (reg), "I" (bitnumber))

// ### BLD ### 将T 加载到寄存器的某一位 (reg(bitnumber) = T)
#define ASM_BLD(reg, bitnumber) asm volatile ("bld %0, %1" : "=r" (reg) : "I" (bitnumber))

// ### SEC ### 置位进位位 (REG.C = 1)
#define ASM_SEC() asm volatile ("sec" :: )

// ### CLC ### 清零进位位 (REG.C = 0)
#define ASM_CLC() asm volatile ("clc" :: )

// ### SEN ### 置位负数标志位 (REG.N = 1)
#define ASM_SEN() asm volatile ("sen"

:: )

// ### CLN ### 清零负数标志位 (REG.N = 0)
#define ASM_CLN() asm volatile ("cln" :: )

// ### SEZ ### 置位0标志位 (REG.Z = 1)
#define ASM_SEZ() asm volatile ("sez" :: )

// ### CLZ ### 清零0标志位 (REG.Z = 0)
#define ASM_CLZ() asm volatile ("clz" :: )

// ### SEI ### 全局中断标志使能 (REG.I = 1)
#define ASM_SEI() asm volatile ("sei" :: )

// ### CLI ### 全局中断标志禁止 (REG.I = 0)
#define ASM_CLI() asm volatile ("cli" :: )

// ### SES ### 置位符号测试标志位 (REG.S = 1)
#define ASM_SES() asm volatile ("ses" :: )

// ### CLS ### 清零符号测试标志位 (REG.S = 0)
#define ASM_CLS() asm volatile ("cls" :: )

// ### SEV ### 置位2的补码溢出标志 (REG.V = 1)
#define ASM_SEV() asm volatile ("sev" :: )

// ### CLV ### 清零2的补码溢出标志 (REG.V = 0)
#define ASM_CLV() asm volatile ("clv" :: )

// ### SET ### 置位位拷贝存储标志 (REG.T = 1)
#define ASM_SET() asm volatile ("set" :: )

// ### CLT ### 清零位拷贝存储标志 (REG.T = 0)
#define ASM_CLT() asm volatile ("clt" :: )

// ### SEH ### 置位半进位标志 (REG.H = 1)
#define ASM_SEH() asm volatile ("seh" :: )

// ### CLH ### 清零半进位标志 (REG.H = 0)
#define ASM_CLH() asm volatile ("clh" :: )



/*****************
*** MCU控制指令 ***
*****************/

// ### BREAK ### 只用于片上调试
#define ASM_BREAK() asm volatile ("break" :: )

// ### NOP ### No 无操作
#define ASM_NOP() asm volatile ("nop" :: )

// ### SLEEP ### 睡眠
#define ASM_SLEEP() asm volatile ("sleep" :: )

// ### WDR ### 看门狗复位
#define ASM_WDR() asm volatile ("wdr" :: )
#endif

相关文档
最新文档