臂虚拟寄存器数
公开「整数」
文言:此层备寄存器降级所需之臂原语,寄存器号皆物理号。汉语:ARM64 原语。通用条件码零至九依次是 相等 不等 有符号小于 有符号大等 有符号大于 有符号小等 无符号小于 无符号大等 无符号大于 无符号小等,奇偶相邻互为取反。物理寄存器约定:x19 至 x24、x26、x27 保存虚拟操作数栈,由被调用者保存;x25 是全局基址,x28 是线性内存基址,x15 是线性内存当前字节数(苹果与视窗的 ARM64 保留 x18,故不用之),三者由入口设置后不再保存;x9 至 x13 是临时寄存器;x0 至 x7 传参,x0 返回。
臂虚拟寄存器
公开化「整数」而「整数」
暂无说明。
臂条件
公开化「整数」而「整数」
暂无说明。
臂条件类
公开化「整数」而「整数」
暂无说明。
臂原移
公开化「整数」而化「整数」而(「列」于「机器片」)
暂无说明。
臂原立即
公开化「整数」而化「整数」而(「列」于「机器片」)
暂无说明。
臂原载局部
公开化「整数」而化「整数」而(「列」于「机器片」)
暂无说明。
臂原存局部
公开化「整数」而化「整数」而(「列」于「机器片」)
暂无说明。
臂原载全局
公开化「整数」而化「整数」而(「列」于「机器片」)
暂无说明。
臂原存全局
公开化「整数」而化「整数」而(「列」于「机器片」)
暂无说明。
臂原二元
公开化「整数」而化「整数」而化「整数」而(「列」于「机器片」)
文言:二元之算,甲为被改者。汉语:操作零加、一减、二与、三或、四异或、五乘,形如 甲 = 甲 op 乙。
臂原二元立
公开化「整数」而化「整数」而化「整数」而化「整数」而(「列」于「机器片」)
文言:立即数可入码者一令而毕,否则借备用寄存器。汉语:加减用十二位立即数(负值改用另一种运算),与或异或用逻辑立即数,乘总是借备用寄存器。
臂原移位
公开化「整数」而化「整数」而化「整数」而化「整数」而(「列」于「机器片」)
文言:移位者,位数在寄存器或立即。汉语:操作零左移、一逻辑右移、二算术右移、三循环左移、四循环右移。寄存器形式的循环左移借备用寄存器求补。
臂原移位立
公开化「整数」而化「整数」而化「整数」而(「列」于「机器片」)
暂无说明。
臂原除
公开化「整数」而化「整数」而化「整数」而化「字符串」而化「字符串」而化「整数」而(「列」于「机器片」)
文言:除与余,零则陷,有符号除逢最小负数除负一亦陷。汉语:种零有符号除、一无符号除、二有符号余、三无符号余。除数为零先跳陷阱;有符号除若被除数为最小负数且除数为负一也跳陷阱;余数用商乘除数再由被除数减去求得。序标是本次展开内独一的标号。
臂原比较
公开化「整数」而化「整数」而(「列」于「机器片」)
暂无说明。
臂原比较立
公开化「整数」而化「整数」而化「整数」而(「列」于「机器片」)
文言:与立即数比较,可入十二位者一令,负一至负四零九五用相加比较,余借备用寄存器。汉语:cmn 与 cmp 对无符号与有符号比较的标志位结果相同,见文档。
臂原置
公开化「整数」而化「整数」而(「列」于「机器片」)
暂无说明。
臂原跳条件
公开化「整数」而化「字符串」而(「列」于「机器片」)
暂无说明。
臂原跳条件远
公开化「整数」而化「字符串」而(「列」于「机器片」)
文言:远之条件跳:条件之分支唯及一兆字节,巨函之中或不及,则以反条件跳过一无条件之跳(及一二八兆字节)。汉语:远距离条件跳转:ARM64 条件分支(b.cond、cbz、cbnz)只能跨 ±1 MiB,很大的函数里可能够不到,改成“反条件跳过下一条(b.!cond +8 / cbnz / cbz)+ 无条件 b 目标(±128 MiB)”。
臂原零跳远
公开化「整数」而化「字符串」而(「列」于「机器片」)
暂无说明。
臂原非零跳远
公开化「整数」而化「字符串」而(「列」于「机器片」)
暂无说明。
臂原跳
公开化「字符串」而(「列」于「机器片」)
暂无说明。
臂原零跳
公开化「整数」而化「字符串」而(「列」于「机器片」)
暂无说明。
臂原非零跳
公开化「整数」而化「字符串」而(「列」于「机器片」)
暂无说明。
臂原选择
公开化「整数」而化「整数」而化「整数」而(「列」于「机器片」)
暂无说明。
臂原有效地址
公开化「整数」而化「整数」而化「整数」而化「整数」而(「整数」合(「列」于「机器片」))
文言:客存之访,先验其终不逾今界,而后取之。汉语:线性内存读写。地址寄存器 址 中是零扩展的三十二位偏移;有效地址等于它加上静态偏移;访问末端不得超过 x15 中的当前字节数,越界跳转到陷标。种:载入零 i32、一 i8 有符号、二 i8 无符号、三 i16 有符号、四 i16 无符号;存储零 i32、一 i8、二 i16。
臂原边界
公开化「整数」而化「整数」而化「字符串」而化「整数」而(「列」于「机器片」)
暂无说明。
臂原载内存
公开化「整数」而化「整数」而化「整数」而化「整数」而化「整数」而化「字符串」而化「整数」而化「整数」而(「列」于「机器片」)
暂无说明。
臂原存内存
公开化「整数」而化「整数」而化「整数」而化「整数」而化「整数」而化「字符串」而化「整数」而化「整数」而(「列」于「机器片」)
暂无说明。
臂原调用
公开化「字符串」而(「列」于「机器片」)
暂无说明。
臂原陷阱
公开化「有」而(「列」于「机器片」)
暂无说明。
臂参数寄数
公开「整数」
文言:传参逾八者,置于共用之暂存。汉语:前八个参数用 x0 至 x7,其余放在 0x40380000 起的四字节槽,调用者写、被调用者在入口立即取走。
臂装址
公开化「址式」而化「整数」而化「整数」而(「列」于「机器片」)
文言:装址:绝对者径置常数;相对者置偏移而加全局基址 x25。汉语:把名义地址装入寄存器:绝对模式直接装常数;相对模式装“地址 − 锚”,再加上全局基址 x25(六十四位加法)。
臂原存参
公开化「址式」而化「整数」而化「整数」而化「整数」而(「列」于「机器片」)
暂无说明。
臂原页数
公开化「整数」而(「列」于「机器片」)
暂无说明。
臂向上取整
公开化「整数」而化「整数」而「整数」
暂无说明。
臂局部基
公开「整数」
文言:帧者,链寄、保存、局部与溢出之区。汉语:帧布局自 sp 向上依次是:x30(占十六字节)、被调用者保存寄存器对(固定预留六十四字节,使局部偏移不随所用寄存器数而变)、局部槽(每个四字节)、操作数栈溢出槽;总大小对齐十六字节。
臂帧大小
公开化「整数」而化「整数」而「整数」
暂无说明。
臂原调整栈
公开化「爻」而化「整数」而(「列」于「机器片」)
暂无说明。
臂原保存
公开化「爻」而化(「列」于「整数」)而化「整数」而(「列」于「机器片」)
暂无说明。
臂原清零局部
公开化「整数」而化「整数」而(「列」于「机器片」)
暂无说明。
臂原取参
公开化「址式」而化「整数」而化「整数」而化「整数」而(「列」于「机器片」)
暂无说明。
臂原序言
公开化「址式」而化「整数」而化「整数」而化「整数」而化(「列」于「整数」)而化「字符串」而(「列」于「机器片」)
文言:序言者,减栈、验界、存链寄与被保存之寄、收参而清余局。汉语:函数入口:sp 减去帧大小;把 sp 与 0x403D0000 比较,低于则陷阱;保存 x30 与被调用者保存寄存器(自 sp+16 起);把参数寄存器和暂存槽中的参数写入局部槽;其余局部清零。守标是本函数内独一的标号。
臂原尾声不返
公开化「整数」而化(「列」于「整数」)而(「列」于「机器片」)
暂无说明。
臂原尾声
公开化「整数」而化(「列」于「整数」)而(「列」于「机器片」)
暂无说明。
臂原入口
公开化「整数」而化「爻」而化「字符串」而化「字符串」而(「列」于「机器片」)
文言:入口者,立诸基寄,呼其始函,毕而报完成。汉语:程序入口:设置线性内存基址 x28、全局基址 x25、当前内存字节数 x15;调用启动函数;探测模式下再读一处内核私有地址(必然缺页,以证隔离);然后以退出码零请求完成服务并自旋。入口标是启动函数的标号。
臂原导入桩
公开化「整数」而(「列」于「机器片」)
暂无说明。
臂助手们
公开化「址式」而化「整数」而化「整数」而化「整数」而化「机器片」而(「列」于「机器片」)
文言:线性内存之整批诸术,聚于助手,以共用之码行之;增长逾八页则迁入内核所颁之动态块。汉语:助手函数从 w0、w1、w2(以及 w3)接收参数,只使用 x0 至 x13(增长助手另改线性内存基址 x28 与字节数 x15),不动被调用者保存寄存器。越界一律跳到本助手的陷阱。标号:助手复制、助手填充、助手初始化、助手增长。增长助手:新页数不超过八页仍在静态线性区内增长;超过时请求内核服务二二保证足够的两兆字节块,首次越界时把旧内容复制到动态基址 0x60000000 并改 x28,之后在动态区继续增长;失败返回负一。
臂原助手们
公开化「整数」而化「整数」而(「列」于「机器片」)
文言:裸机之助手:动态之块求诸内核服务二二。汉语:裸机助手:动态内存块由内核服务二二(内存块)保证。
臂Linux助手们
公开化「整数」而化「整数」而(「列」于「机器片」)
文言:Linux 之助手:动态之区于入口已映射,故求块恒成,置 w0 为零。汉语:Linux 助手:动态区已在入口用 mmap 映射,求块一律成功,以 movz w0, #0 代替服务调用。
臂Linux入口
公开化「整数」而化「整数」而化「整数」而化「整数」而化「整数」而化「整数」而化「字符串」而(「列」于「机器片」)
文言:Linux 之入口:栈移于用户之域之顶;线性内存逾八页者,先以 mmap 映动态之区,不成则以码一二五退;次立诸基寄,呼启动之函,毕以 exit_group 零退。汉语:Linux 程序入口:把 sp 设为用户区栈顶(0x40400000,函数序言的栈界检查照旧有效);若线性内存容量超过八页,先用 mmap(MAP_PRIVATE|MAP_ANONYMOUS|MAP_FIXED|MAP_NORESERVE,可读写)映射动态区,返回地址不符则以退出码 125 结束;然后设置 x28、x25、x15,调用启动函数,最后 exit_group(0)。
臂Linux导入桩
公开化「整数」而化(「列」于「整数」)而(「列」于「机器片」)
文言:Linux 之导入桩:诸参先零扩为六十四位,址类者加线性基址;x8 置调用之号,svc 零,返。汉语:Linux 导入桩:每个参数先零扩展(mov wN, wN),地址类参数再加上线性内存基址 x28;x8 设为系统调用号,svc #0,返回。系统调用的返回值在 x0,其低三十二位即导入的结果。
臂原存零
公开化「址式」而化「整数」而化「整数」而(「列」于「机器片」)
暂无说明。
臂苹果助手们
公开化「址式」而化「整数」而化「整数」而化「整数」而(「列」于「机器片」)
文言:苹果之助手:动态之区在数据段内,已随映像而映,求块恒成;诸址皆以全局基址为锚。汉语:macOS 助手:动态区是数据段里预留的零填充区,随映像一起映射,求块一律成功(movz w0, #0);页数地址与动态基址都按相对址式以全局基址 x25 为锚。
臂苹果入口
公开化「址式」而化「整数」而化「整数」而化「整数」而化「整数」而化「字符串」而(「列」于「机器片」)
文言:苹果之入口:dyld 以常法呼之,故先存被保存之寄与链寄于原栈;以 adr 取代码之始,加锚距得全局基址;移栈于数据段内之用户栈,立诸基寄,呼启动之函;毕则复原栈与诸寄,返零于 dyld。汉语:macOS 程序入口(LC_MAIN,由 dyld 按标准调用约定调用):第一条指令 adr x9, #0 取得代码起址;先在原栈保存 x19 至 x30(x19 另记原栈指针);x25 = 代码起址 + 锚距(锚距由目标描述算出,映像滑动不影响它);sp 移到数据段里的用户栈顶,x28、x15 按相对址式装入;调用启动函数;返回后恢复原栈与各寄存器,返回 0,由 dyld 调用 exit。
臂苹果参准备
公开化「整数」而化「整数」而(「列」于「机器片」)
文言:苹果之参:零整数、一线性之址、二有符号之整数、三可变之整数、四可变之址。可变者依苹果 ARM64 之约置于栈,每参八字节。汉语:macOS 导入参数的类别:0 整数(零扩展)、1 线性内存地址(加 x28)、2 有符号整数(sxtw)、3 可变参数中的整数、4 可变参数中的地址。按 Apple ARM64 的约定,可变参数不走寄存器而放在调用时的栈顶,每个占 8 字节(如 openat 与 fcntl 的第三参、ioctl 的地址参数)。
臂苹果可变序们
公开化(「列」于「整数」)而(「列」于「整数」)
暂无说明。
臂苹果可变区
公开化(「列」于「整数」)而「整数」
暂无说明。
臂苹果可变入栈
公开化(「列」于「整数」)而(「列」于「机器片」)
文言:可变之参入栈:减栈而逐一存之。汉语:可变参数入栈:sp 减去对齐到 16 的区域,再把第 j 个可变参数存到 [sp + 8j];没有可变参数时不生成指令。
臂苹果可变出栈
公开化(「列」于「整数」)而(「列」于「机器片」)
暂无说明。
臂苹果导入桩
公开化「址式」而化「整数」而化(「列」于「整数」)而化「整数」而化「字符串」而(「列」于「机器片」)
文言:苹果之导入桩:先存 x15 与链寄;诸参零扩,址类者加线性基址;自导入槽取 libSystem 函数之址而呼之;返负一者,呼 ___error 取 errno,返其负;毕复 x15 与链寄。汉语:macOS 导入桩:先保存 x15(线性内存字节数,libSystem 函数可能改写)与 x30;每个参数零扩展,地址类再加线性内存基址 x28;从导入槽(dyld 按绑定信息写入的指针,地址按相对址式求得)取函数地址,blr 调用;若需转错且返回 -1,再经 ___error 的槽取 errno 并返回其相反数(与 Linux 的 -errno 一致);最后恢复 x15 与 x30 并返回。毕标是本桩内独一的标号。