编程规范

差異處

這裏顯示兩個版本的差異處。

連向這個比對檢視

兩邊的前次修訂版前次修改
下次修改
前次修改
wiki:自动化与科技指导:minecoprocessors:编程规范 [2023/12/08 15:32] – [注释] nikoqwwiki:自动化与科技指导:minecoprocessors:编程规范 [2023/12/08 16:04] (目前版本) – [CDecl] nikoqw
行 2: 行 2:
 为了能够重复利用现有代码,在代码与代码之间调用,所有程序必须遵守本编程规范。 为了能够重复利用现有代码,在代码与代码之间调用,所有程序必须遵守本编程规范。
  
-===== 汇编语言风格 =====+<wrap cjk-em>约定</wrap>是必须遵守的规定,是程序之间沟通的桥梁,不遵守会导致程序不能与现有的程序库交互。 
 + 
 +<wrap cjk-em>规范</wrap>是强烈建议遵守的规定,是为了方便开发者理解代码,使代码易于维护,方便不同开发者使用相同的方法理解不同人编写的代码。 
 + 
 +===== 用户程序约定 ===== 
 +  * 用户程序代码必须在所有库函数代码之后。 
 +  * 用户程序必须包含一个 ''_start'' 函数,在其中编写用户代码。 
 + 
 +===== 汇编语言风格规范 =====
 ==== 指令 ==== ==== 指令 ====
 每个指令与其操作数使用一个空格隔开。操作数之间使用一个逗号 + 空格('', '')隔开。 每个指令与其操作数使用一个空格隔开。操作数之间使用一个逗号 + 空格('', '')隔开。
行 9: 行 17:
 </code> </code>
 ==== 标签 ==== ==== 标签 ====
-所有标签使用下划线分词。除[[#Calling convention|编程规范]]所规定的特殊前后缀外,一律使用小写字母。+所有标签使用下划线分词。除 [[#Calling convention|Calling convention]] 所规定的特殊前后缀外,一律使用小写字母。
 <code ASM> <code ASM>
 nimshab_miga: nimshab_miga:
行 32: 行 40:
   * 0 1 2 3 分别代表前、后、左、右四个 I/O 口。   * 0 1 2 3 分别代表前、后、左、右四个 I/O 口。
  
-===== 函数 =====+===== 函数规范 =====
 ==== 结构 ==== ==== 结构 ====
 若函数所遵循的调用约定规定要在函数中通过压栈的方式暂存寄存器状态,则分三块结构编写: 若函数所遵循的调用约定规定要在函数中通过压栈的方式暂存寄存器状态,则分三块结构编写:
行 165: 行 173:
  
 StdCall, StdCallR, QCall, CDecl StdCall, StdCallR, QCall, CDecl
 +
 +''_start'' 函数是例外的,它不遵守任何调用约定。''_start'' 函数不需要做任何额外的事情(如 PUSH 内部用到的寄存器)。
  
 ==== StdCall ==== ==== StdCall ====
行 171: 行 181:
 使用寄存器传参,没有返回值。 使用寄存器传参,没有返回值。
  
-采用 StdCall 的函数必须使用 d c b a 的顺序用寄存器保存参数。+采用 StdCall 的函数最好使用 d c b a 的顺序用寄存器保存参数。
  
 采用 StdCall 的函数不加任何后缀。 采用 StdCall 的函数不加任何后缀。
行 200: 行 210:
  
 无论调用方使用是否使用了被调用函数内部使用的寄存器,调用方在 CALL 函数前都必须将<wrap cjk-em>被调用函数内部使用的寄存器</wrap>通过压栈的方式暂存状态,CALL 结束后自行择机复原寄存器状态。 无论调用方使用是否使用了被调用函数内部使用的寄存器,调用方在 CALL 函数前都必须将<wrap cjk-em>被调用函数内部使用的寄存器</wrap>通过压栈的方式暂存状态,CALL 结束后自行择机复原寄存器状态。
 +
 +被调用的函数在退出前不复原自身使用的寄存器的状态。
  
 ==== CDecl ====  ==== CDecl ==== 
-“C Declaration”,C 语言的调用约定。本调用约定是为了应对数量较多的参数。+“C declaration”,C 语言的调用约定。本调用约定是为了应对数量较多的参数。
  
 使用栈传参,使用寄存器返回值。 使用栈传参,使用寄存器返回值。
wiki/自动化与科技指导/minecoprocessors/编程规范.1702020753.txt.gz · 上一次變更: 2023/12/08 15:32 由 nikoqw
GNU Free Documentation License 1.3 若無特別註明,本 wiki 上的內容都是採用以下授權方式: GNU Free Documentation License 1.3