马赫格式写出。测试。豫
yuyan · 256 行 · 16963 字节 · UTF-8
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256
寻观「标准库」之书。
寻观「标准库」之「数据结构」之「字节串」之书。
寻观「编译器核心」之「网页汇编核心」之「二进制生成」之书。
寻观「裸机后端」之「机器编码」之书。
寻观「裸机后端」之「马赫格式写出」之书。
「:文言:验头与诸命令之字段,并成样例:书“豫言操作系统”一行,以退出码七终。书写与退出皆由 libSystem 之 _write、_exit,其址由 dyld 填于数据段。汉语:核对 Mach-O 文件头与加载命令的字段;另生成样例可执行文件,在 macOS 上实际运行:调用 libSystem 的 _write 写一行“豫言操作系统”,再以 _exit(7) 结束。两个函数的地址由 dyld 按绑定信息填进数据段的指针槽。:」
「读小端」乃化「字节串」而化「整数」而化「整数」而「整数」也。
「读小端」者会「字」而会「始」而会「宽」而
若「等于」于「宽」于「零」则
「零」
否则
「加」
于(「字节串取字节」于「字」于「始」)
于(「乘」于「二五六」于(「读小端」于「字」于(「加」于「始」于「一」)于(「减」于「宽」于「一」)))
也。
「马赫验数」乃
化「字符串」而
化「字节串」而
化「整数」而
化「整数」而
化「整数」而
「有」
也。
「马赫验数」者会「名」而会「字」而会「始」而会「宽」而会「期」而
虑「实」者「读小端」于「字」于「始」于「宽」而
若「等于」于「实」于「期」则
「元」
否则
「发生事故」于(『马赫格式字段不符:』附「名」附『,得 』附(「整数操作」之「表示」于「实」))
也。
「四字节们」乃化(「列」于「整数」)而「字节串」也。
「四字节们」者会「码们」而
「网页拼字节」于(「态射」授以「整数」授以「字节串」于「码们」于(会「码」而「小端字节」于「四」于「码」))
也。
「样例消息」乃「字节串」也。
「样例消息」者「字符串转字节串」于『豫言操作系统
』也。
「零页四吉」乃「整数」也。
「零页四吉」者「四二九四九六七二九六」也。
「:文言:取址之令:ldr x16,以相对之偏读数据段之槽。汉语:LDR x16, [PC + 偏移](字面量寻址),读取数据段中的导入指针槽。:」
「读槽指令」乃化「整数」而化「整数」而「整数」也。
「读槽指令」者会「指令址」而会「槽址」而
「加」
于「一四七六三九五零零八」
于(「加」于(「乘」于(「除以」于(「减」于「槽址」于「指令址」)于「四」)于「三二」)于「一六」)
也。
「:文言:臂之相对样:x0 一,adr x1 消息,x2 长,经槽调 _write;x0 七,经槽调 _exit。汉语:arm64 位置无关样例:mov x0,#1;adr x1,消息;mov x2,#长;ldr x16,[_write 槽];blr x16;mov x0,#7;ldr x16,[_exit 槽];blr x16;其后是消息。:」
「臂相对样例代码」乃化「整数」而「字节串」也。
「臂相对样例代码」者会「零页」而
虑「码址」者「马赫代码虚址」于「零页」而
虑「据址」者
「马赫数据虚址」于「零页」于(「加」于「三二」于(「字节串长度」于「样例消息」))
而
「拼接字节串」
于(「四字节们」
于(「列」【
「三五三一六零四零零零」,
「二六八四三五六八一」,
「加」于「三五三一六零三九七零」于(「乘」于(「字节串长度」于「样例消息」)于「三二」),
「读槽指令」于(「加」于「码址」于「一二」)于「据址」,
「三五九四四五三五零四」,
「三五三一六零四一九二」,
「读槽指令」于(「加」于「码址」于「二四」)于(「加」于「据址」于「八」),
「三五九四四五三五零四」
】))
于「样例消息」
也。
「:文言:以 movz、movk 四令置六十四位之数于 x1。汉语:用 movz 与三条 movk 把 64 位立即数装入 x1。:」
「臂装址」乃化「整数」而(「列」于「整数」)也。
「臂装址」者会「数」而
虑「零段」者「整数余数」于「数」于「六五五三六」而
虑「一段」者
「整数余数」于(「除以」于「数」于「六五五三六」)于「六五五三六」而
虑「二段」者
「整数余数」于(「除以」于「数」于「四二九四九六七二九六」)于「六五五三六」而
虑「三段」者「除以」于「数」于「二八一四七四九七六七一零六五六」而
「列」【
「加」于「三五三一六零三九六九」于(「乘」于「零段」于「三二」),
「加」于「四零七零五七二零三三」于(「乘」于「一段」于「三二」),
「加」于「四零七二六六九一八五」于(「乘」于「二段」于「三二」),
「加」于「四零七四七六六三三七」于(「乘」于「三段」于「三二」)
】
也。
「:文言:臂之绝对样:消息之址以绝对之数置之。若映像不在所定之址,则书不成而退出码犹七。汉语:arm64 绝对地址样例:消息地址用 movz/movk 以绝对值装入 x1。若内核未按文件中的虚址装载(映像被滑动),_write 得到无效地址而不输出,退出码仍为 7;据此判断固定地址是否生效。:」
「臂绝对样例代码」乃化「整数」而「字节串」也。
「臂绝对样例代码」者会「零页」而
虑「码址」者「马赫代码虚址」于「零页」而
虑「据址」者
「马赫数据虚址」于「零页」于(「加」于「四四」于(「字节串长度」于「样例消息」))
而
「拼接字节串」
于(「四字节们」
于(「列」【
「三五三一六零四零零零」,
「第N个」授以「整数」
于「零」
于(「臂装址」于(「加」于「码址」于「四四」)),
「第N个」授以「整数」
于「一」
于(「臂装址」于(「加」于「码址」于「四四」)),
「第N个」授以「整数」
于「二」
于(「臂装址」于(「加」于「码址」于「四四」)),
「第N个」授以「整数」
于「三」
于(「臂装址」于(「加」于「码址」于「四四」)),
「加」
于「三五三一六零三九七零」
于(「乘」于(「字节串长度」于「样例消息」)于「三二」),
「读槽指令」于(「加」于「码址」于「二四」)于「据址」,
「三五九四四五三五零四」,
「三五三一六零四一九二」,
「读槽指令」
于(「加」于「码址」于「三六」)
于(「加」于「据址」于「八」),
「三五九四四五三五零四」
】))
于「样例消息」
也。
「:文言:兼之样:先推 rbp 以齐栈,edi 一,lea rsi 消息,edx 长,经槽调 _write;edi 七,经槽调 _exit。汉语:x86-64 样例:push rbp(使栈 16 字节对齐);mov edi,1;lea rsi,[rip+消息];mov edx,长;call [rip+_write 槽];mov edi,7;call [rip+_exit 槽];其后是消息。:」
「兼样例代码」乃化「整数」而「字节串」也。
「兼样例代码」者会「零页」而
虑「码址」者「马赫代码虚址」于「零页」而
虑「据址」者
「马赫数据虚址」于「零页」于(「加」于「三五」于(「字节串长度」于「样例消息」))
而
「网页拼字节」于(「列」【
「单字节串」于「八五」,
「单字节串」于「一九一」,
「小端字节」于「四」于「一」,
「单字节串」于「七二」,
「单字节串」于「一四一」,
「单字节串」于「五三」,
「小端字节」于「四」于「二二」,
「单字节串」于「一八六」,
「小端字节」于「四」于(「字节串长度」于「样例消息」),
「单字节串」于「二五五」,
「单字节串」于「二一」,
「小端字节」于「四」于(「减」于「据址」于(「加」于「码址」于「二四」)),
「单字节串」于「一九一」,
「小端字节」于「四」于「七」,
「单字节串」于「二五五」,
「单字节串」于「二一」,
「小端字节」于「四」于(「减」于(「加」于「据址」于「八」)于(「加」于「码址」于「三五」)),
「样例消息」
】)
也。
「样例导入」乃(「列」于(「字符串」合「整数」))也。
「样例导入」者「列」【『_write』与「零」,『_exit』与「八」】也。
「样例可执行」乃化「爻」而化「爻」而化「整数」而化「字节串」而「字节串」也。
「样例可执行」者会「臂」而会「位置无关」而会「零页」而会「代码」而
「生成马赫可执行」
于「臂」
于「位置无关」
于「零页」
于「代码」
于「零」
于(「零字节」于「一六」)
于「一六」
于「样例导入」
于『yuyan.sample』
也。
「臂样」乃「字节串」也。
「臂样」者「样例可执行」于「阳」于「阳」于「零页四吉」于(「臂相对样例代码」于「零页四吉」)也。
「:文言:非位置无关,零页四吉。汉语:非位置无关(无 MH_PIE),零页 4 GiB:检验内核是否按文件虚址装载。:」
「臂固定样」乃「字节串」也。
「臂固定样」者「样例可执行」于「阳」于「阴」于「零页四吉」于(「臂绝对样例代码」于「零页四吉」)也。
「:文言:非位置无关,零页一吉,文本起于 0x40000000。汉语:非位置无关,零页 1 GiB,__TEXT 从 0x40000000 开始:检验能否使用低于 4 GiB 的固定地址。:」
「臂低址样」乃「字节串」也。
「臂低址样」者
「样例可执行」于「阳」于「阴」于「一零七三七四一八二四」于(「臂绝对样例代码」于「一零七三七四一八二四」)
也。
「兼样」乃「字节串」也。
「兼样」者「样例可执行」于「阴」于「阳」于「零页四吉」于(「兼样例代码」于「零页四吉」)也。
「:文言:头:魔数、臂之机器类、可执行之类、命令十三、命令之长七百七十六、标。汉语:文件头:魔数 0xFEEDFACF、CPU 类型(arm64 为 0x0100000C,x86-64 为 0x01000007)、MH_EXECUTE、13 条命令、命令总长 776、标志(位置无关为 0x200085,否则 0x85)。:」
「马赫验数」于『魔数』于「臂样」于「零」于「四」于「四二七七零零九一零三」。
「马赫验数」于『臂类型』于「臂样」于「四」于「四」于「一六七七七二二八」。
「马赫验数」于『兼类型』于「兼样」于「四」于「四」于「一六七七七二二三」。
「马赫验数」于『兼子类型』于「兼样」于「八」于「四」于「三」。
「马赫验数」于『文件类型』于「臂样」于「一二」于「四」于「二」。
「马赫验数」于『命令数』于「臂样」于「一六」于「四」于「一三」。
「马赫验数」于『命令长』于「臂样」于「二零」于「四」于「七七六」。
「马赫验数」于『位置无关标志』于「臂样」于「二四」于「四」于「二零九七二八五」。
「马赫验数」于『固定标志』于「臂固定样」于「二四」于「四」于「一三三」。
「:文言:零页之段:虚址零,长四吉。汉语:__PAGEZERO:命令 0x19,虚址 0,内存长 4 GiB,无文件内容,无权限。:」
「马赫验数」于『零页命令』于「臂样」于「三二」于「四」于「二五」。
「马赫验数」于『零页长』于「臂样」于「六四」于「八」于「四二九四九六七二九六」。
「马赫验数」于『零页权限』于「臂样」于「八八」于「四」于「零」。
「马赫验数」于『低址零页长』于「臂低址样」于「六四」于「八」于「一零七三七四一八二四」。
「:文言:文本之段:起于四吉,长一万六千三百八十四,可读可执行;其节起于一千二十四。汉语:__TEXT:命令长 152(含一节),虚址 4 GiB,文件偏移 0,长 16384,权限读+执行;__text 节地址为 4 GiB + 1024,文件偏移 1024。:」
「马赫验数」于『文本命令长』于「臂样」于「一零八」于「四」于「一五二」。
「马赫验数」于『文本虚址』于「臂样」于「一二八」于「八」于「四二九四九六七二九六」。
「马赫验数」于『文本长』于「臂样」于「一三六」于「八」于「一六三八四」。
「马赫验数」于『文本文件偏移』于「臂样」于「一四四」于「八」于「零」。
「马赫验数」于『文本权限』于「臂样」于「一六零」于「四」于「五」。
「马赫验数」于『代码节址』于「臂样」于「二零八」于「八」于「四二九四九六八三二零」。
「马赫验数」于『代码节长』于「臂样」于「二一六」于「八」于「五一」。
「马赫验数」于『代码节偏移』于「臂样」于「二二四」于「四」于「一零二四」。
「:文言:数据之段:续于文本之后,偏移一万六千三百八十四。汉语:__DATA:虚址 4 GiB + 16384,文件偏移 16384,权限读+写。:」
「马赫验数」于『数据虚址』于「臂样」于「二八零」于「八」于「四二九四九八三六八零」。
「马赫验数」于『数据文件偏移』于「臂样」于「二九六」于「八」于「一六三八四」。
「马赫验数」于『数据权限』于「臂样」于「三一二」于「四」于「三」。
「:文言:诸命令之末为签名,其偏之后即文件之尾。汉语:最后一条命令是 LC_CODE_SIGNATURE(命令长共 776,终于偏移 808);签名偏移加签名长等于文件总长。:」
「马赫验数」于『签名命令』于「臂样」于「七九二」于「四」于「二九」。
「马赫验数」
于『文件总长』
于(「小端字节」于「八」于(「字节串长度」于「臂样」))
于「零」
于「八」
于(「加」于(「读小端」于「臂样」于「八零零」于「四」)于(「读小端」于「臂样」于「八零四」于「四」))。
「:文言:签名之首为超块之魔数,大端。汉语:签名以 SuperBlob 魔数 0xFADE0CC0(大端)开头,其后第 20 字节起为 CodeDirectory 魔数 0xFADE0C02。:」
「马赫验数」
于『超块魔数』
于「臂样」
于(「读小端」于「臂样」于「八零零」于「四」)
于「四」
于「三二二二零六八九八六」。
「马赫验数」
于『代码目录魔数』
于「臂样」
于(「加」于(「读小端」于「臂样」于「八零零」于「四」)于「二零」)
于「四」
于「三四三九七九四六」。
「:文言:代码居其偏。汉语:代码的第一条指令位于文件偏移 1024。:」
「马赫验数」于『代码首字』于「臂样」于「一零二四」于「四」于「三五三一六零四零零零」。
「:文言:书诸样例于工作目录。汉语:写出样例文件,供 macOS 上运行验证(x86-64 样例需在 Intel Mac 上运行)。:」
「写臂样」乃「有」也。
「写臂样」者「文件系统」之「写文件字节串」于『yy马赫样例臂』于「臂样」也。
「写臂固定样」乃「有」也。
「写臂固定样」者「文件系统」之「写文件字节串」于『yy马赫样例臂固定』于「臂固定样」也。
「写臂低址样」乃「有」也。
「写臂低址样」者「文件系统」之「写文件字节串」于『yy马赫样例臂低址』于「臂低址样」也。
「写兼样」乃「有」也。
「写兼样」者「文件系统」之「写文件字节串」于『yy马赫样例兼』于「兼样」也。