当前位置: 首页 > 科技观察

汇编语言入门的五个技巧

时间:2023-03-20 23:33:35 科技观察

编程是一门艺术。大多数开发人员只是在实际工作中开发应用程序。通常,他们不会接触汇编语言。主要有两个原因。首先,编译语言不好学。二是日常生活中很少使用。汇编语言是最古老的编程语言,在所有语言中,它是最接近本地机器语言的。它提供对计算机硬件的直接访问,要求用户了解计算机体系结构和操作系统。学习汇编最大的用处就是帮助我们更好的理解高级语言,所以还是很有必要的。本文以RISC-V为例,向大家展示如何使用编程语言设计程序逻辑,最后将程序逻辑程序转换为汇编语言程序。用合适的语言设计逻辑是最难的一步,很多同学想直接写一个完整的功能模块软件包。但是如果你不喜欢汇编那么这是一种注定要失败的方法,而不是将逻辑与我们必须用我们理解的语言编写它的语言分开。如果学生不懂C或某种低级语言,那么我建议他们用伪代码编写。太高级的语言很难编译,太低级的语言很难设计逻辑。因此,推荐使用C/C++或其他类似的语言。翻译的时候,有的编辑可以把它们并排放在一起,很有帮助。因为很难在脑海中记住指令列表,尤其是在编译复杂程序时。一次一个步骤许多学生试图从头到尾编写一个完整的程序,中间不进行任何测试。如果你是初学者,我推荐增量编程,关键是在一部分逻辑完成的时候进行测试。这可以在for循环完成后立即进行测试。一种测试方法是将C/C++程序与汇编程序链接起来,您可以通过在C++中对函数汇编进行原型设计并在两者之间切换来实现此目的。您需要确保两者不同,否则链接会出错。按照一般惯例,通常在C函数前加一个“c”以示区别。我们可以调用Show来运行用汇编语言编写的函数:extern"C"{//Turnoffnamemanglingvoidshow(int*x);}extern"C"将告诉C++函数遵循C的“调用约定”。我们真正关心的是about正在关闭名称修改,因此我们可以创建一个名为“show”的标签并具有我们的功能。知道汇编语言的功能定位就像道恩·强森曾经说过的:“Knowyourrole”。重要的是要了解C/C++为我们做了什么以及汇编没有做什么。.例如,4+3*4会自动安排运算在加法之前执行乘法。但是,在汇编中,我们必须先选择乘法指令,然后再选择加法指令。了解如何调用函数大多数ISA架构都带有调用约定手册,例如ARM和RISC-V。这些只是为在所有语言中调用函数制定了一些基本规则。幸运的是,RISC-V寄存器的“ABI”命名约定有助于程序员理解它们的含义。例如:整型参数在寄存器A0-A7中,浮点型参数在寄存器FA0-FA7中。函数栈是通过栈指针的子操作来分配的。调用后使用add操作销毁。堆栈大小必须以8的倍数分配。所有参数和临时寄存器必须在函数调用后被视为已销毁。函数调用后,可以显式保存保存的寄存器。如果使用了任何保存的寄存器,在函数返回前必须恢复它们的原始值,通过a0寄存器将数据作为返回值返回给调用者。.globalmainmain:addisp,sp,-8sdra,0(sp)laa0,test_solvecallsolvemva0,zerodra,0(sp)addisp,sp,8ret从上面的代码可以看出,我们首先分配我们的栈帧,保存所有的寄存器保存、执行,然后在返回之前撤消所有寄存器。文档WritingAssemblyCodeinCorOtherLanguages会让你为每一行C代码编写多行汇编代码。如果您正在尝试调试程序,这对您来说可能有点困难,因此,我总是将C代码编写为汇编注释,然后将其拆开并向我展示执行此操作的每一步。从上面的代码可以看出,我有原始的C代码(第一个注释),然后内联注释每个片段。这种方法使我们能够确保程序正确执行每个步骤。