Assembly “在”中编码的最佳实践是什么;“真实世界”;情况?

Assembly “在”中编码的最佳实践是什么;“真实世界”;情况?,assembly,comments,Assembly,Comments,我刚从一所大学转到一所大学,似乎我所知道的关于正确编码技术的一切都是错误的。我学会让代码可读的方法是 条件语句和循环体中的缩进代码 喜欢创建一个新函数而不是拥有一大块代码 注释掉用于调试或将来可能再次使用的代码 在运算符和参数之间放置空格,例如,如果(a您的规则(注释代码除外)通常仍被视为良好实践。但是,它们可能不会像适用于其他语言那样适用于汇编。汇编编程是一种特殊的beast,因此它可能具有不同的样式规则/最佳实践 尽管如此,您最初的规则仍然适用于几乎所有其他编程语言 另外,关于注释掉代码。

我刚从一所大学转到一所大学,似乎我所知道的关于正确编码技术的一切都是错误的。我学会让代码可读的方法是

  • 条件语句和循环体中的缩进代码
  • 喜欢创建一个新函数而不是拥有一大块代码
  • 注释掉用于调试或将来可能再次使用的代码
  • 在运算符和参数之间放置空格,例如,如果(a您的规则(注释代码除外)通常仍被视为良好实践。但是,它们可能不会像适用于其他语言那样适用于汇编。汇编编程是一种特殊的beast,因此它可能具有不同的样式规则/最佳实践

    尽管如此,您最初的规则仍然适用于几乎所有其他编程语言


    另外,关于注释掉代码。这通常被认为是一种不好的做法,因为注释掉的代码经常会被落在后面,并使下一代开发人员感到困惑。一般来说,您的源代码管理系统可以很容易地恢复删除代码,所以您不应该注释掉它来保存它。

    听起来像是您第一次被教导良好的pr用高级语言写作的活动


    你的新学校希望你使用低级语言编程。两者的最佳实践完全不同。你只需要知道哪些实践适用于哪种语言。

    人们对高级语言和汇编语言的规则差别很大

    (当我提到一些显而易见的东西时,我指的是另一个程序员,他和你一样有丰富的经验,对一个随机的新闻专业学生来说并不明显,或者其他一些东西)

    一般而言,任何情况下的良好做法:

  • 当变量/寄存器的用途不明显时,给出简短的注释
  • 避免明显的评论(即说计数器计数有点多余)
  • 在提交的作品中,删除所有不必要的评论
  • 将行长度限制为80个字符(保持代码整洁且易于阅读)
  • 就特定语言而言,您现在似乎对正确的标准有了相当不错的掌握。基本上,您的第一个列表适用于除汇编和类似汇编的语言之外的所有语言,第二个列表适用于汇编


    此外,您不需要初始化寄存器,因为它们在启动时具有默认的已知值。教师通常强制使用高级语言进行初始化,因为有些情况需要,有些情况不需要,而且更容易(更安全)编辑:我假设你在最后一段中使用的是ARM或AVR板。我认为其他人也是这样,但我不肯定……

    正如许多人迄今为止指出的那样,区分高级语言和低级语言是非常重要的

    高级语言实现了许多结构,使我们这些弱小的人能够尽可能地将我们的想法翻译成原始想法。我们有面向对象的设计、面向数据的设计、面向原型的设计……所有这些都是为了让人类在以可读和可维护的方式描述事物方面占据上风

    在几乎所有情况下,这都会降低性能(与汇编语言相比,汇编语言只是远离机器代码的一层抽象)。甚至一些被认为是面向对象设计的良好实践也会迫使计算机做一些不必要的工作,这些工作只会影响性能。这可能是不必要的加载存储、缓存丢失(指令和数据)通过程序员糟糕的数据建模。getter和setter成为常规OO设计的头号杀手。紧随其后的是程序员,他们不考虑自己写的东西

    在较低的层次上,你的工作是安抚计算机,而不是安抚你的美感。你在处理寄存器、内存地址、加载和数据写入。这必须是给定硬件架构喜欢的方式

    我不同意你们老师关于良好实践的一些观点,特别是如果这些实践是用高级语言实施的。正如我所说,如果它不妨碍表现,看起来很好,可读性强,那么它就成了你做事的风格。在我看来,惩罚个性是……好吧,让我们说不好吧

    最重要的是,你必须安抚老师们。他们可能是一帮很难对付的人。即使他们错了,你也必须接受他们的观点,玩他们的游戏。试着说服你的一方,问他们想从你那里得到什么,你会没事的


    祝你好运!

    我认为你对高级代码的风格指导与通常教授的类似。不过,正如其他人所指出的,汇编是一种不同的编程类型。例如,编写特定的子例程(比如)通常更好相乘6比使用一个通用子例程来相乘任意数要好。这是因为汇编程序通常用于时间或空间关键型应用程序,其中通用函数调用固有的开销会造成阻碍。这也会导致代码重复,只需稍加修改(例如,乘以6、乘以10等),甚至重复指令(将寄存器增加3倍通常比向其添加3快,因为加法必须在累加器中完成,其当前值可能需要保留、进位清除等)

    更奇怪的是:有时一个子例程将直接跳到另一个子例程而不返回(“尾部调用”);有时程序将在堆栈上推送一个地址,然后从一个子例程返回(即执行RET或RTS指令)无需首先调用子例程:这使您无需首先执行一系列比较,就可以分支到大量不同的例程