ASM(汇编语言)真要被扫进历史的垃圾堆了吗?

2019-12-10 18:08发布

最近浏览一个挺流行的视频 – X天学会单片机。内容确实通俗易懂,制作的比较用心。但其中的有个观点笔者不敢苟同,就是现在 C 语言已经强大到胜任所有任务,大家没有必要再去学习汇编语言了,直接从 C 学起就行了。

这种观点似乎有一定道理,我甚至怀疑现在是不是真的有很多同学不再学习汇编了。特别是现在大多数厂商都提供了完备的驱动代码的情况下,我们做项目基本上用不到写 ASM 代码了。...

完整内容见附件
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
80条回答
ilawp
2019-12-19 13:58
本帖最后由 ilawp 于 2019-10-8 17:10 编辑
takashiki 发表于 2019-10-7 08:15
编译器不知道,但是库函数知道,只是是平台相关罢了。这都不是问题。
截图:Keil的文件中的大小端转换的 ...


我理解错了,按字节或者4b翻转我是知道的,但库里貌似不是硬件指令,cortex m3指令集里有对应指令。
按位翻转没有库,也不知道用啥指令
我说的按位翻转是指:
0b10000000 变成0b00000001

源自cmsis_armclang.h:
**
  rief   Reverse byte order (32 bit)
  details Reverses the byte order in unsigned integer value. For example, 0x12345678 becomes 0x78563412.
  param [in]    value  Value to reverse
   eturn               Reversed value
*/
#define __REV(value)   __builtin_bswap32(value)


/**
  rief   Reverse byte order (16 bit)
  details Reverses the byte order within each halfword of a word. For example, 0x12345678 becomes 0x34127856.
  param [in]    value  Value to reverse
   eturn               Reversed value
*/
#define __REV16(value) __ROR(__REV(value), 16)


/**
  rief   Reverse byte order (16 bit)
  details Reverses the byte order in a 16-bit value and returns the signed 16-bit result. For example, 0x0080 becomes 0x8000.
  param [in]    value  Value to reverse
   eturn               Reversed value
*/
#define __REVSH(value) (int16_t)__builtin_bswap16(value)


/**
  rief   Rotate Right in unsigned value (32 bit)
  details Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits.
  param [in]    op1  Value to rotate
  param [in]    op2  Number of Bits to rotate
   eturn               Rotated value
*/
__STATIC_FORCEINLINE uint32_t __ROR(uint32_t op1, uint32_t op2)
{
  op2 %= 32U;
  if (op2 == 0U)
  {
    return op1;
  }
  return (op1 >> op2) | (op1 << (32U - op2));
}


一周热门 更多>