搜索
bottom↓
回复: 80

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

  [复制链接]

出0入30汤圆

发表于 2019-10-6 20:16:35 | 显示全部楼层 |阅读模式
最近浏览一个挺流行的视频 – X天学会单片机。内容确实通俗易懂,制作的比较用心。但其中的有个观点笔者不敢苟同,就是现在 C 语言已经强大到胜任所有任务,大家没有必要再去学习汇编语言了,直接从 C 学起就行了。

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

完整内容见附件

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出50入10汤圆

发表于 2019-10-6 20:19:36 | 显示全部楼层
一直认为很多程序的bug就是用高级语言带入的!

出0入213汤圆

发表于 2019-10-6 20:19:55 来自手机 | 显示全部楼层
汇编不会消失。但程序猿有没有必要学就看情况了。

出0入0汤圆

发表于 2019-10-6 20:24:49 | 显示全部楼层
我觉得,汇编就是,没用到,就不学,非要用到不可了,就用多少学多少,现学现用,然后继续该干嘛干嘛

出0入0汤圆

发表于 2019-10-6 20:33:41 | 显示全部楼层
这个是不可能的,只是如果你纯粹做算法,不考虑效率,用高级语言没啥问题。有很多特有的东西只能汇编做,比如大小端转换,求前导0个数,这些都是用汇编来有专用指令的。编译器是不知道的。

出0入0汤圆

发表于 2019-10-6 20:41:52 | 显示全部楼层
看需求,有需求就去学。
我也就是2812移植ucos的时候深入了解过一段时间的汇编,现在全c了。

出0入0汤圆

发表于 2019-10-6 20:42:11 | 显示全部楼层
最主要的变化就是资源的富足。以前的要一位一位的省资源。现在资源不是问题了。那就可以充分的浪费了。没必要用汇编来节俭资源了。
时代的变化要适应它。该用简单的就用简单的。没必要维持老思路一成不变。

出0入0汤圆

发表于 2019-10-6 20:42:36 | 显示全部楼层
当你debug 的时候,就知道汇编有用了

出0入0汤圆

发表于 2019-10-6 20:42:59 | 显示全部楼层
没有汇编本基础是无法写出高效的程序。
如果你财大气粗,用高主频大容量芯片堆砌硬件的可以无视我说的话

出0入0汤圆

发表于 2019-10-6 20:43:07 | 显示全部楼层
汇编能少用就少用   我用汇编做过很多合泰单片机程序, 除非必要真的不要再用。
没有好的思维逻辑 用汇编写出来的程序也很烂。

出0入0汤圆

发表于 2019-10-6 20:47:00 | 显示全部楼层
由于视频只定位于入门,为了不让初学者有过多的迷惑和纠结,这样讲是可以理解的,但是严格来讲,汇编还是很有用的,尤其是专攻硬件和底层驱动的工程师深有体会,在一些对于时序要求非常严格的场景中,汇编还是最好且唯一的选择,C 语言就搞不来了,也不是完全不能搞,而是非常费劲,需要很长的时间去调试,对代码结构的要求非常高,考虑到综合成本,往往汇编是最好且唯一的选择

出0入0汤圆

发表于 2019-10-6 20:50:00 | 显示全部楼层
一般的工程应用,高级语言足够了。

但如果系统级的编程,比如写OS,自建LIB,汇编就有优势了

出0入8汤圆

发表于 2019-10-6 20:57:13 来自手机 | 显示全部楼层
这有啥,你去看看别人学Java python的,觉得C/C++都应该扫进垃圾堆

出0入0汤圆

发表于 2019-10-6 22:26:11 来自手机 | 显示全部楼层
lingdianhao 发表于 2019-10-6 20:33
这个是不可能的,只是如果你纯粹做算法,不考虑效率,用高级语言没啥问题。有很多特有的东西只能汇编做,比 ...

stm32的大小端转换指令是啥?之前都是笨笨的查表

出0入0汤圆

发表于 2019-10-6 22:35:12 来自手机 | 显示全部楼层
canspider 发表于 2019-10-6 20:57
这有啥,你去看看别人学Java python的,觉得C/C++都应该扫进垃圾堆

是的,今年暑假一亲戚的小孩在读大学,听说我在用C写程序,一脸的迷惑。说某某语言的一条语句的功能,相当于C语言的一大段……

出0入0汤圆

发表于 2019-10-6 22:40:58 来自手机 | 显示全部楼层
汇编还是有用的

出10入284汤圆

发表于 2019-10-6 22:42:51 来自手机 | 显示全部楼层
做信息安全的分析反汇编代码是基本功

出0入0汤圆

发表于 2019-10-6 23:03:34 | 显示全部楼层
作为计算机专业的基础课程还是不错的

出500入109汤圆

发表于 2019-10-6 23:11:16 来自手机 | 显示全部楼层
任何程序,是的,就是任何程序,到最后都是汇编,除非哪天目前的CPU构架完全被颠覆。在被颠覆之前,还是汇编。只是应用层看不到了而已

出10入12汤圆

发表于 2019-10-6 23:19:54 | 显示全部楼层
消失是绝对不可能的。
但是后面出现在应用端基本上见不到了,这个是肯定的。

出0入0汤圆

发表于 2019-10-6 23:31:07 | 显示全部楼层
可以了解计算机/单片机基本原理

出0入59汤圆

发表于 2019-10-6 23:36:46 | 显示全部楼层
破解程序的人就肯定要去研究汇编了;
移植操作系统的也要吧

出0入0汤圆

发表于 2019-10-6 23:41:15 来自手机 | 显示全部楼层
ilawp 发表于 2019-10-6 22:26
stm32的大小端转换指令是啥?之前都是笨笨的查表

看权威指南里面有专用的字节交换指令。

出0入14汤圆

发表于 2019-10-6 23:46:47 | 显示全部楼层
汇编是有用的,但是对于一般的工程师,比如像我一样的那就可以不管,主要是不会!!!!

认识一个朋友,原来是腾讯的,后来去了阿里,他原来就是搞病毒防御的,研究过嵌入式病毒,就要用到汇编

插入病毒,再跳回去,理论上可以攻破任何嵌入式

出115入0汤圆

发表于 2019-10-7 00:52:15 | 显示全部楼层
因为没学过,所以.......

出0入0汤圆

发表于 2019-10-7 01:59:06 | 显示全部楼层
学完了就忘了

出200入657汤圆

发表于 2019-10-7 03:12:22 | 显示全部楼层
这种讨论没什么意义。汇编自有其用途,在最底层的于硬件接口的地方,C无法完全兼容,这时就需要汇编。
只是这些年来,随着硬件cpu运行能力的富余,汇编的作用逐渐退出历史舞台,但是需要用到的地方还是无可避免。

出100入0汤圆

发表于 2019-10-7 06:22:02 | 显示全部楼层
lizg 发表于 2019-10-6 22:35
是的,今年暑假一亲戚的小孩在读大学,听说我在用C写程序,一脸的迷惑。说某某语言的一条语句的功能,相 ...

呵呵,他可能不知道,他调用的那些模块都是C或其他语言编写的。

出0入93汤圆

发表于 2019-10-7 08:15:09 | 显示全部楼层
lingdianhao 发表于 2019-10-6 20:33
这个是不可能的,只是如果你纯粹做算法,不考虑效率,用高级语言没啥问题。有很多特有的东西只能汇编做,比 ...

编译器不知道,但是库函数知道,只是是平台相关罢了。这都不是问题。
截图:Keil的<core_cmInstr.h>文件中的大小端转换的函数:REV、REV16、REVSH、RBIT的都有。计算前导零的内置函数__clz也有。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入93汤圆

发表于 2019-10-7 08:19:19 | 显示全部楼层
ilawp 发表于 2019-10-6 22:26
stm32的大小端转换指令是啥?之前都是笨笨的查表

请看我30楼,Keil内置了这些函数

出0入0汤圆

发表于 2019-10-7 08:23:04 来自手机 | 显示全部楼层
不可能灭绝,otp单片机应用这么广

出0入0汤圆

发表于 2019-10-7 08:27:44 | 显示全部楼层
实际上在keil C51 中C经过编译后会生成汇编,最终生成bin文件。
要真正理解程序的执行,需要懂得ASM程序对各种指令的操作。如果光懂得C而不懂ASM,是不可能真正理解单片机的。
还有某些特殊的程序需要在C中嵌入ASM源程序,比如一些寄存器和延时的处理。

出0入0汤圆

发表于 2019-10-7 08:29:01 | 显示全部楼层
扫进垃圾堆吗?对绝大多数人是的。

出0入0汤圆

发表于 2019-10-7 08:41:38 | 显示全部楼层
takashiki 发表于 2019-10-7 08:19
请看我30楼,Keil内置了这些函数

这个就是所谓的intrinsic函数吧

出0入93汤圆

发表于 2019-10-7 08:43:03 | 显示全部楼层
myxiaonia 发表于 2019-10-7 08:41
这个就是所谓的intrinsic函数吧

是的,只是C51有这个概念,MDK中没有了。

出0入0汤圆

发表于 2019-10-7 08:49:50 | 显示全部楼层
看你干啥了,天天都是应用层编程,确实汇编一点儿都没必要学了。但是天天搞硬件底层,都会多少接触汇编,搞程序破解的别说汇编,可能二进制机器语言也得学学了。

出0入0汤圆

发表于 2019-10-7 08:51:55 | 显示全部楼层
汇编不会消失,因为不管什么高级语言最终都会生成汇编
但用的人越来越少,不用特意学,有需要学也很快
C也会存活很长时间,说不定寿命比我们还长,比C高级的很多底层也是C写出来的,linux内核也是

出0入4汤圆

发表于 2019-10-7 09:13:48 | 显示全部楼层
看做哪个层级,做应用应该是不需要了,但如果做CPU设计可能还要用机器码。

出5入14汤圆

发表于 2019-10-7 09:17:17 来自手机 | 显示全部楼层
我很纳闷,ARM的启动代码现在都没人研究了吗?

出0入0汤圆

发表于 2019-10-7 09:19:43 | 显示全部楼层
怎么可能?即便是老了也会被供在神坛上。

出0入0汤圆

发表于 2019-10-7 09:57:58 | 显示全部楼层
EMC菜鸟 发表于 2019-10-7 09:17
我很纳闷,ARM的启动代码现在都没人研究了吗?

现在很少人研究启动代码吧,特别是用hal库的哪还管启动代码

出0入0汤圆

发表于 2019-10-7 10:03:01 来自手机 | 显示全部楼层
如果你只是为了工作,就用高级语言吧。如果你是专家,相当黑客,汇编是必须的。当然我个人感觉是,只会高级语言而不会汇编,会和温水煮青蛙一样的危险。

出0入0汤圆

发表于 2019-10-7 10:38:16 | 显示全部楼层
takashiki 发表于 2019-10-7 08:43
是的,只是C51有这个概念,MDK中没有了。

其实还是有一些的吧  ,比如开关中断的  enable_irq()

出675入8汤圆

发表于 2019-10-7 11:23:53 来自手机 | 显示全部楼层
hackboymzw 发表于 2019-10-6 20:24
我觉得,汇编就是,没用到,就不学,非要用到不可了,就用多少学多少,现学现用,然后继续该干嘛干嘛 ...

赞同你的观点

出0入0汤圆

发表于 2019-10-7 12:15:39 | 显示全部楼层
目前的架构不改变,汇编不可能消失,汇编是基础,所有的高级语言都是这个基石,除非架构彻底改变。

出0入0汤圆

发表于 2019-10-7 13:56:21 | 显示全部楼层
做嵌入式开发,汇编少不了的,至少要能看的懂。尤其是一些疑难杂症的排查,很多情况下都是需要看懂汇编的。

出0入0汤圆

发表于 2019-10-7 14:13:20 来自手机 | 显示全部楼层
只要造车轮的厂家学会造车轮就行了,大多数汽车生产厂家只要负责把车轮装车上装好就行了。所以我的观点就是大多数情况下不用刻意去学asm了,除非芯片是你厂里生产的,或编译器是你开发的,否则还是省点时间看点sm吧。

出0入0汤圆

发表于 2019-10-7 21:16:17 | 显示全部楼层
看谁用啦!不可能进垃圾堆!

出0入4汤圆

发表于 2019-10-7 21:26:21 | 显示全部楼层
底层代码用下汇编,还是非常方便的

出0入0汤圆

发表于 2019-10-7 22:30:41 | 显示全部楼层
日常写程序汇编基本用不上。需要直接汇编写的地方很少了。

出0入0汤圆

发表于 2019-10-7 22:48:01 来自手机 | 显示全部楼层
刚工作那会学习单片机,用汇编写过几个程序,能很好理解单片机的工作原理,现在基本上就是C了。以完成工作为前提,没时间研究汇编了

出0入0汤圆

发表于 2019-10-7 23:03:20 来自手机 | 显示全部楼层
要用的话就用 不用就不用

出0入0汤圆

发表于 2019-10-7 23:57:14 | 显示全部楼层
汇编是非常有用的,所有高级语言到最后都只能编译成汇编成机器语言。
但不是非常不可,因汇编语言太不友好了,难学不说,用C语言一小时可以写完的代码,用汇编可能要一天。
所以除了特殊情况,一般都不会用汇编写的。
现在很多人连C都不学了,用PYTHON的更快。
总来的说就是,汇编运行最快,效率最高,但编写效率最低

出0入0汤圆

发表于 2019-10-8 00:10:01 | 显示全部楼层
行业不同就不要一锤敲下了。

未来汇编还是很重要的;未来大趋势还是蛮多的
安全研究等高薪行业。

笑话篇如下
比如你们现在用到的 Keil AD等诸多软件补丁均是汇编调试出的和谐
游戏外挂
外挂对抗
漏洞分析
等太多需要汇编只是了

出0入0汤圆

发表于 2019-10-8 08:04:27 | 显示全部楼层
汇编不会消失,但一般的程序猿有没有必要学就看情况了。

出0入0汤圆

发表于 2019-10-8 09:24:55 | 显示全部楼层
汇编语言在写某些模块程序的时候用一下,这个就是可读性不太好,如果大范围使用过一段时间回来看自己都看不明白了,还是高级语言可读性,可维护性好一些

出0入0汤圆

发表于 2019-10-8 09:42:23 | 显示全部楼层
1.44M  3.5寸软盘还有市场呢。

出0入362汤圆

发表于 2019-10-8 10:10:36 | 显示全部楼层
基本很难有用汇编开发整个项目的情况了吧,个别地方用到汇编是常有的,需要的时候现学就行了。

出0入42汤圆

发表于 2019-10-8 10:21:27 | 显示全部楼层
有些行业标准禁止用汇编了。

出0入0汤圆

发表于 2019-10-8 10:22:13 | 显示全部楼层
什么好用,能完成任务就用什么。
看了好多年汇编,现在常帮客户把一些汇编语言转成C语言。

出0入4汤圆

发表于 2019-10-8 10:27:48 | 显示全部楼层
现在还有在用汇编,因为有些单片机就只能用汇编

出0入0汤圆

发表于 2019-10-8 10:30:27 | 显示全部楼层
以前发过一篇帖子,当时印象深刻——

https://www.amobbs.com/thread-5584769-1-1.html

出0入79汤圆

发表于 2019-10-8 12:08:08 来自手机 | 显示全部楼层
很多真正的高手,都有反汇编国外产品的经历,这样才能获得核心技术。

出0入0汤圆

发表于 2019-10-8 12:21:06 | 显示全部楼层
国人只能使用别人的编译器,因为没人学当然造不出来

出15入9汤圆

发表于 2019-10-8 13:20:08 | 显示全部楼层
1. 美国这边的学校的电子系早就不教汇编了,每一种处理器往往都有自己的架构与指令集,加上没法预测学电子的学生以后会接触哪类型的处理器,所以也就从稍微通用一点的C开始教,我觉得完全可以理解,就算是单片机C语言这种课,很多大学也基本上是雇中国的博士生在教,你们没体会过讲一个for循环得讲半个钟头这种坑爹的事情吧,教起来真的非常吃力。
2. 研究汇编的课程会放到CS专业编译(做编译器以及优化的)原理,或者是信息安全相关的课程那块介绍。

3. 这边工业界(航空电子)的一个大Boss告诉我:宁愿多加成本用更强的处理器,更快的做出产品,把省下的时间用到给客户提供更好的技术支持上或研发下一代产品。

出0入0汤圆

发表于 2019-10-8 13:21:04 来自手机 | 显示全部楼层
参考还是有点用

出0入0汤圆

发表于 2019-10-8 13:40:32 | 显示全部楼层
我从汇编学到C然后C++,C#,PHP,最后Python,每种语言都有各自的用处。
这种帖子真的没意义,最终都是各行业的说自己好说别人不好。

单片机工程师:汇编是最好的语言!
Web开发:PHP是最好的语言!

有意思么!?
狭隘的工程师永远成为不了大师

出0入4汤圆

发表于 2019-10-8 13:41:17 | 显示全部楼层
pcwhy 发表于 2019-10-8 13:20
1. 美国这边的学校的电子系早就不教汇编了,每一种处理器往往都有自己的架构与指令集,加上没法预测学电子 ...

其实芯片在一个产品中所占比较很小的,除非量非常大的产品,不然真没有必要纠结这点成本

出0入0汤圆

发表于 2019-10-8 13:51:28 | 显示全部楼层
平常用汇编的时候很少,工作需要时可以学,不会进垃圾堆的

出0入0汤圆

发表于 2019-10-8 16:40:40 | 显示全部楼层
本帖最后由 ilawp 于 2019-10-8 17:10 编辑
takashiki 发表于 2019-10-7 08:15
编译器不知道,但是库函数知道,只是是平台相关罢了。这都不是问题。
截图:Keil的文件中的大小端转换的 ...


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

源自cmsis_armclang.h:
**
  \brief   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
  \return               Reversed value
*/
#define __REV(value)   __builtin_bswap32(value)


/**
  \brief   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
  \return               Reversed value
*/
#define __REV16(value) __ROR(__REV(value), 16)


/**
  \brief   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
  \return               Reversed value
*/
#define __REVSH(value) (int16_t)__builtin_bswap16(value)


/**
  \brief   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
  \return               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));
}


出0入93汤圆

发表于 2019-10-8 18:52:35 | 显示全部楼层
ilawp 发表于 2019-10-8 16:40
我理解错了,按字节或者4b翻转我是知道的,但库里貌似不是硬件指令,cortex m3指令集里有对应指令。
按位 ...

你这是Keil吗,怎么和我的不一样?我的Keil目录\ARM\CMSIS\Include\core_cmInstr.h下面是这样的,直接都是内联汇编,怎么就不是硬件指令了。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2019-10-10 21:35:09 | 显示全部楼层
搞硬件不了解汇编是在搞笑。资源不是用来浪费的

出0入0汤圆

发表于 2019-10-11 14:00:21 | 显示全部楼层
本帖最后由 mmswza 于 2019-10-11 14:02 编辑

个人觉得C确实会优势一些,特别现在随着MCU性能的提升功能需求也不断提升代码量随之增加。而汇编是需要对指令集有一定熟悉程度才会在运行性能上体现出一定优势的。

出0入0汤圆

发表于 2019-10-12 10:47:52 | 显示全部楼层
我们现在连C都很少写了,采用MBD(Model based design)开发,搭建完模型,代码自动生成。

出0入50汤圆

发表于 2019-10-12 11:21:40 | 显示全部楼层
ASM对大部分的攻城狮程序猿而言,会成为历史,但称之为垃圾就有点不妥了,不管怎样,那也是巨人的肩膀,没有ASM,哪有现在的各种高级语言。做技术和做人一样,不能忘本。

出0入0汤圆

发表于 2019-10-12 15:01:48 来自手机 | 显示全部楼层
汇编能不用就不用,况且现在的mcu绝大多数都支持c,用c是主流。

出0入0汤圆

发表于 2019-10-12 18:08:33 | 显示全部楼层
从学习的角度看,应该要学习一下汇编语言,有助于深入理解CPU的原理,不论是X86还是单片机,学一样就好,后面都用C,即使换了CPU,也能很快使用C进行开发。不然连寄存器是什么?程序怎么执行的都不了解,后面用C开发就容易遇到很多问题。

出0入300汤圆

发表于 2019-10-21 06:35:33 来自手机 | 显示全部楼层
都h7了,最近几天开始接触。生不如死啊,编译太特么慢了,除非你关了定位。我从来没有想象过写个破代码也要性能强大的电脑。每当按下编译按钮,mdk就像是一个专门评测cpu的评测软件,分分钟让你直观的评估8核cpu与40核cpu的巨大差距

出0入137汤圆

发表于 2019-10-21 08:04:45 | 显示全部楼层
搞逆向开发的必须懂汇编啊!

出0入0汤圆

发表于 2019-10-21 11:55:32 来自手机 | 显示全部楼层
ibmx311 发表于 2019-10-21 06:35
都h7了,最近几天开始接触。生不如死啊,编译太特么慢了,除非你关了定位。我从来没有想象过写个破代码也要 ...

IAR值得拥有
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-20 14:10

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表