代码之家  ›  专栏  ›  技术社区  ›  Roman A. Taycher

你怎么用汇编语言编程?

  •  1
  • Roman A. Taycher  · 技术社区  · 15 年前

    所以我从来没有做过任何汇编编程(尽管我在CS类中读了一些x86和arm汇编的小片段的结果)。

    High-level assembler ?

    每行都有评论?

    人们是否按照团队商定的惯例进行调用堆栈?

    还有其他有趣的东西。

    另外,您如何处理字符串(可能只是ascii)和结构/联合(复合数据类型)(即如何简化编写代码来创建和操作它们)?

    人们经常从汇编中调用OS提供的c库函数吗?

    8 回复  |  直到 15 年前
        1
  •  4
  •   Jens Björnhager    15 年前

    对于“如何在汇编程序中编程”这个问题,最简单也是最重要的答案是:

    随你的便。这是进行装配的主要原因。控制。可以这么说,按你的方式去做。

    • HLA已经过时了。
    • 宏可以帮助处理繁琐和/或冗长的任务,例如调用函数和定义导入节。不过,要小心使用。如果你用得太多,会让别人看不懂你的代码。
    • “文本编辑器”和“ide”之间的界限很模糊,因为许多文本编辑器都具有ide功能。根据我的定义,主要区别在于ide有一个内置的调试器。
    • 由于您没有任何标准库来帮助您进行字符串操作,因此您必须创建自己的函数库,或者使用某种函数库,如果有的话,可能是操作系统的函数库。
    • 在装配中使用结构没有什么不同。

    编辑:

    • 是的,例如,有些人喜欢通过msvcrt.dll使用Windows中的C函数。我相信在Unix世界也是如此:)
        2
  •  8
  •   old_timer    15 年前

    我通常用汇编语言来补充C编译器不能做的事情,或者当我需要的时候它不能或者不会实现的汇编语言的特性。或者在需要性能的地方,通过对数据和指令集的了解,或者通过对编译器不知道的硬件的了解。将某物与缓存线对齐,或了解数据总线的宽度或性质,写缓冲区等。引导代码为嵌入式,代码主体为C,但汇编程序中的某些部分出于上述原因。有时,汇编程序是嵌入式系统的抽象层,为了在操作系统上重新编译应用程序,需要使用其他抽象层。

    有些人(今天)为一个完整的项目用汇编语言编写,在我看来,这更具政治性而非实用性。证明它是可以做到的,或是个人的目标或是需要搔痒的抓痕。就像爬山,因为它就在那里,有些人这样做是为了个人内在的精神或身体上的利益,并为他们好,其他人这样做是严格的吹嘘和炫耀,为他们感到羞耻。对于大型应用程序来说,编译器(今天的)在平均生成代码方面要比人工生成代码做得更好,最终,RTO或任何你制作的东西都可以在许多机器上编译和运行,而不仅仅是你选择的一个处理器的汇编程序。

    当C从Pascal接管的那一天,我也在场,有人问了同样的问题,可以证明有些人可以在汇编程序中编写和调试应用程序,而另一些人可以在大约相同的时间内用C编写和调试应用程序。当时的情况比较简单。在这两个世界里,你并不是从零开始创造一切,就像你开车上下班时,你的脚、手和手臂都有这种记忆,在自动驾驶仪中驾驶,日复一日,同样无聊的道路,你的大部分编程都是在自动驾驶仪中完成的,你剪切粘贴或重新打印或链接到你一直在打磨你的整个职业生涯相同的例程。在汇编语言中,您重复使用相同的常用指令,而从不使用其他指令;在C语言中,您使用相同的常用变量或语言特性,而从不使用其他指令。它是个人而不是语言。

    所以来回答你的问题。宏和函数以及重用以前开发的代码或库,就像今天在高级语言中使用宏和函数或以前开发的代码或库一样。你对一个程序员比较细心,不管是高级还是低级,资源(内存、磁盘等)都不是现在的样子,寄存器/变量的选择是谨慎而谨慎的。C编译器远没有那么好,它们几乎没有编译得那么优化。就像任何语言、汽车、键盘或鼠标一样,你用得越多,你的使用效率就越高。一个有经验的汇编程序员可以培养出初学者,正如一个有经验的C程序员可以培养出初学者一样。有经验的汇编程序设计人员能否输出C程序设计人员同样取决于个人和应用程序,而不是语言本身。

    对于某些语言,结构是一种节省键入时间的解决方案,汇编程序允许您执行相同的基址+(索引*结构大小)+偏移量计算以及更多操作。有些指令集使之更容易,有些程序员可能会将乘法换成移位或移位加加法。或者使用乘法累加。

    字符串是汇编器真正闪耀的地方。最酷的汇编技巧可以在C库的string和copy函数中找到。如果你是所有的汇编程序,你可以选择使用帕斯卡长度加上数据或C去,直到你击中一个零或混合和匹配或弥补自己的。在这方面,您可以改进C库,也可以不改进,但在C和assembler中,非优化的字符串代码同样微不足道。

    从汇编程序调用os/C调用。启动代码通常为.data调用memcpy,为.bss调用memset。如果你愿意调用一个C库,你可能是在“我用C来处理整个应用程序,用汇编来处理一些罕见的实例”阵营里。“我在汇编阵营写这整件事”不会走这条捷径,如果是这样的话,他们就不会在汇编程序中编程了。必须进行的操作系统调用在这两种情况下都是进行的,除了在汇编程序中编写操作系统并执行您想要的操作之外,没有其他方法可以绕过它。

    文本编辑器或ide与语言、个人和他们的习惯/偏好没有很大关系。有时,项目或公司强制使用一种工具,也就是你使用的工具,或者得到另一份工作,或者升职到足以改变公司政策的程度。文字编辑、工具、标签、空间、论文在专业环境中都是非常敏感的话题,就像强迫每个人开同一品牌、同一型号的车或穿同一品牌、同一型号的鞋一样。这与语言无关。另一方面,偶尔会有处理器,它在一个环境中只有一个工具,如果您选择使用该处理器,它就是您所使用的处理器。

    如果你想回到过去,你谈论的是时间共享或更旧的,硬件要么几乎不工作,在机器备份之前,你有大量的时间手工编写机器语言代码。你没有终端或键盘。或者更新一点,你有一个时间共享,你可能需要每天运行一次程序,或者每隔几天运行一次程序,这样你就有大量的时间来创建更多的穿孔卡片,而且你没有终端、键盘或文本编辑器。你的高级语言可能是fortran。你很高兴你的程序在崩溃前运行了一段时间,你还没有想到一周能产生几千行经过调试的代码。

        3
  •  3
  •   sarnold    15 年前

    上一次我在汇编中编程时,它是在我的HP-48计算器上 Jazz 计算器的开发环境。它提供了一个汇编程序、反汇编程序、分步调试器、“入口点”浏览器(用于调用惠普工程师使用的函数库)、文本编辑器、字体库和几十个小的编程实用程序,所有这些都是72kb。

    A = B 复制 B 注册到 A

    RPL 类似名字的功能,调用惯例都很容易记忆(它不太记得它们,而只是使用你已经熟悉的高级语言。)

    但我的程序从来没有像Jazz工具集那样雄心勃勃——我很想知道Jazz本身是在计算器上还是在主机上开发的。

        4
  •  1
  •   Marco Mariani    15 年前

    上次我在ASM中做了一些事情,我使用了以下工具:

    DevPac

    ReSource

        5
  •  1
  •   Paul Nathan    15 年前

    我的硕士论文代码的核心是汇编。

    我通常看一下生成的ASM( gcc -S )以确保我没有完全破坏编译器的期望。

        6
  •  0
  •   mP.    15 年前

    我相信MASM是免费的,请在microsoft.com上搜索下载

        7
  •  0
  •   Alexandre C.    15 年前

        8
  •  0
  •   Cheery    15 年前

    那时的程序要简单得多。他们没想到我们今天把这样的数据集当作商品。汇编指令比较简单,是用来手工编写程序的。

    推荐文章