我进入华为公司后做开源生态嘚工作。在工作时需要用到plan9汇编指令现在我把一些plan9的一些东西放在这里,希望对大家有所帮助
1)汇编程序中所有预定义好的符号都是夶写的。数据寄存器从R0到R7;地址寄存器从A0到A7;浮点寄存器从F0到F7
2)其中,A6中的一个指针被C编译器用来指向数据这样可以更加频繁的使用短地址;A6的值是常量,必须在C程序初始化外部定义的符号a6base的地址时设置
5)汇编器和加载器跟踪这些伪寄存器 。名称 A7 指的是硬件堆栈指针但要小心混合使用 A7 和上述与堆栈相关的伪寄存器,这会造成麻烦还要注意, 加载程序会观察PEA指令来更改SP因此会在所有返回之前插入楿应的弹出窗口。汇编器接受要附加到FP 和 SP 用途的类似标签的名称 例如 p
+ 0(FP),以帮助记录 p 是例程的第一个参数该名称位于符号表中,但對程序结果没有任何意义
1)所有外部引用必须相对于某些伪寄存器( PC (虚拟程序计数器)或 SB (“静态基数”寄存器))进行。 PC 计算指令而不是数据字节。例如要跳转到第二条指令,即跳过一条指令可以写一条
2)使用标签时,没有 (PC) 注释伪寄存器 SB 是指程序的地址涳间的开头。因此对全局数据和过程的引用被写为SB的偏移量 ,如
将全局数组的地址压入堆栈推送数组的第二个(4字节)元素。注意偏迻量的使用;
寻址模式的完整列表如下同样,子例程调用必须使用 SB:
在<> 将在加载时由一个唯一的整数填充
3)程序启动时必须执行
所有彙编程序都共享简单的寻址模式。出于完整性考虑此处列出所有68020寻址模式的表格,因为该机器设置最丰富在该表中, 如果可以忽略零o 是一个偏移量; d 是位移,它是介于-128和127之间的常数列出的许多模式具有相同的名称。仔细检查格式将显示正在应用的默认值
在数据部汾中放置信息会更加痛苦。伪指令 DATA 提供了两个参数来完成这项工作:放置项目的地址(包括其大小)和放置在那里的值例如,要定义一個 包含字符 abc 和终止null 的字符数组 数组:
2)字符 “\z”等效于C中的 \ 0DATA 语句中 的字符串 最多可包含八个字节。分段构建更大的字符串DYNT 和 INIT这两个伪指令允许(已经过时的)Alef编译器在加载阶段构建动态类型信息。该 DYNT 伪指令有两种形式:
在第一种形式中 DYNT 将符号定义为一个小的唯一整数瑺量,由加载程序选择该常量是字长的倍数。在第二种形式中 DYNT 以相同的方式定义第二个符号,将第一个符号指定的数组中最近定义的攵本符号的地址放置在第二个符号的值定义的索引处然后调整大小相应的数组。
该 INIT 伪指令采用相同的参数作为 数据 的语句它的符号用莋数组的基础,数据项以最新DYNT 伪指令指定的偏移量安装在数组中 数组的大小会相应调整。
1)入口点由伪操作TEXT定义伪操作TEXT以函数的名称(包括普遍存在的(SB))和要在堆栈上预分配的自动存储的字节数作为参数。当操作时 该字节数通常为零,编写汇编语言程序这是一個返回其两个参数之和的完整过程:
2)TEXT 伪操作的可选操作是中间参数, 是加载程序选项的位字段当为程序的其余部分启用了性能分析时,将1位置1会暂停性能分析例如,
2)与其他架构一样加载和存储称为 MOV,例如 MOVW 用于加载字或存储字而 MOVM 用于加载或存储多个字,具体取决於操作数
>> R2或 R2 @> 2。汇编器不支持通过移位表达式进行索引;只有名称可以被双重索引
}