duangsuse::Echo
583 subscribers
4.12K photos
118 videos
579 files
6.13K links
import this:
美而不丑、明而不暗、短而不凡、长而不乱,扁平不宽,读而后码,行之天下,勿托地上天国。
异常勿吞,难过勿过,叹一真理。效率是很重要,盲目最是低效。
简明是可靠的先验,不是可靠的祭品。
知其变,守其恒,为天下式;穷其变,知不穷,得地上势。知变守恒却穷变知新,我认真理,我不认真。

技术相干订阅~
另外有 throws 闲杂频道 @dsuset
转载频道 @dsusep
极小可能会有批评zf的消息 如有不适可退出
suse小站(面向运气编程): https://WOJS.org/#/
Download Telegram
x86_nasm_helloworld.tar
20 KB
#code #backend #dev #asm 整理了一下构建工具什么的
#C :

#include <stdio.h>
void main(int argc, char** argv) {
for (int i=0; i<0xFF; i++) printf("%c%d", i, i);
}

也可以用 fputc:

void put(int i) {
fputc(stdout, (char) i);
int acc=i; while (acc!=0) {
fputc(stdout, '0'+acc%0xF);
acc /= 0xF;
}
}

这是横向的,当然也可以纵向:

void putTable(int nmax_col) {
int n=0xFF/nmax_col, m=nmax_col;
char ascii[n][m];
for (int j=0; j<m; j++) for (int i=0, i<n, i++) {
ascii[i][j] = (char)j*m+i;
}
for (int i=0, i<n, i++) for (int j=0; j<m; j++) {
char v=ascii[i][j]; printf("%c%d", v,v);
}
}

#asm
.db fmt "%c%d\00"

_main:
push rbp
mov rbp, rsp
sub rsp, 4
mov [rbp-4], 0xFF

for:
mov rax, [rbp-4]
push rax
push rax
push fmt
call printf
dec rax
mov [rbp-4], rax
jnz for

for_out:
add rsp, 4
pop rbp
ret
#functional #Scala https://github.com/Ray-Eldath/whatever/blob/master/main/src/main/scala/cats/Show.sc 范畴论实践,有 Boolean, Number 等

https://github.com/Ray-Eldath/whatever/blob/master/main/src/main/kotlin/ray/eldath/whatever/dsl/MeetingDSL.kt #Kotlin 新特性回顾,初入 Embed DSL

https://github.com/Ray-Eldath/whatever/blob/master/main/src/main/java/ray/eldath/whatever/LambdaBytecodeExampleJava.java#L26 #Java annotation 语法于数组的小细节 #PLT ,话说作者写好多 bytecode example... 编译看字节码的么

https://github.com/Ray-Eldath/whatever/blob/master/x86/protected_bubble_sort.asm#L52 #asm x86 冒泡排序, :internal 和 :external 是指 while {} 内外,后方可见 inc eax, cmp, jle 指令。

https://github.com/Ray-Eldath/whatever/blob/master/mips/fib.a#L40 #asm MIPS fib(n) 计算,话说 fib(n) = (n>0)? fib(n-1)+fib(n-2) : 0; 这种方法我之前都没用过,一直是 (n<=2)? n : recur(n) 的,思维定势

不过说起来也只有会写 C 的人能看汇编😋 GC 和 libc 用惯了会不知道栈空间 jal&j $ax、segment/mmap、interrupt/ivt 是干什么的说。
不过这么看 C 也解决了很严重的 sizeof 整数长度问题啊,这样代码就可移植了,虽然不能像 Java Python 去 Run Anywhere 。

作者在 test/kotlin 下也有写评测
测了 IntRef+ parallelStream() forEach, reduce 的正确性🤔
当然也有 reflect MethodHandle 的测试代码
他真的对语言 Intrinsic 很了解啊
#asm #backend #js 🌝👍
duangsuse::Echo
#learn #ts #kt 子类型 vs 组合, in/out参数 https://tttttt.me/dsuses/5194 总之,trait类型的交集 还是需要in/out,这不是子类型带来的麻烦。 a=append(a,x) 与 copy(a,src) 类型上是一样的,前者也并不能“把a修正为更窄接口”。 Go必须把list+=单项 写出来, 因为缺少型变 func main() { var src []interface{} = []any{1, 2, 3, 4, 5} var dst []int =…
#bing #asm 废了,连个VGA黑框框都不会写 https://tttttt.me/dsuses/5206

这题也莫名其妙, 前面的 when(分数) { 40,60,70段,. } 到底是要不要汇编?
我只理解为 bar("A","60%", 6); bar("B","40%", 4) ,结果bing竟然不太会画

其实我倒不喜欢汇编涉及loop , int sign width, stack变量 的部分
那纯属没事找麻烦,难度完全是信息差来的

我是觉得把VGA BIOS的API拿出来用就算了,算式不要手动管寄存器😅。 DOSBOX里应该也支持吧

可惜ai不会 我就懒得写了 ,js的接口生态比这有用不少呢

#statement
以后怕是手撸代码都变成当今汇编的地位。。
时代的眼泪而已 ,汇编大神的梗一直都在 ,它是文化价值> 工程意义

这么说有点实用主义 ,我觉得asm 只配做一种 FFI ,毕竟二进制数据结构都有办法mmap了 。最好是能用py builtins 那样体系化的技术基建实现linux 的设备内存进程等算法 ,这样会有点纪念意义

最重要的是一定要好调试好test,不能让代码的可行性 总是看起来模棱两可 ,敲一堆重复的gdb指令
duangsuse::Echo
执行时是怎么样的呢? 🤔(当然这里可能不严谨,不过也够了,反正大家很多人连 CDEF 系统栈是怎么维护的都不知道,也算是科普一下) 我们的 caller 叫做 main,它执行如下代码以调用我们的子程序 bd: sub esp, (2*4) <sp> [....] [....] |***** mov ecx, ; buffer ; ecx = (char *) buffer mov [esp+4], "SGVsbG8K" <sp> [....] [*"SGV....] |***** mov [esp]…
#backend #asm 原来yt上也有这么多人在做CS科普
好怀念以前什么都不了解,没有地方拿到「原始资料」的时候啊..
那时候就是靠猜、靠一些中文资料碎片,也不熟悉「内存布局和跳转」的C语言指针模型,更不会把 struct;union; subtype; weak type;trait; 这些放在一个心智模型里去diff

现在看来是走太多弯路,实现了貌似「科班」轻松就懂的、无意义的东西,但在我看来,用x86 写算法明明就是容易搞懂的事,错误在于最简例、可视化和复用的缺失

说起来,频道的 #tag 太多,成了失去归类能力的野草..😓 对我而言「流行编程语言」就像这样吧;为了摆架子,搞丢了问题的本源

又说了奇怪的话了..😶‍🌫️ 知乎上也会被PL人喷是民科
幸而最近有点时间编程, 不知道能整出啥

#dalao #blog #inm 野兽的链表里技!
#asm 😅 https://www.youtube.com/watch?v=aD7rOQSrXl8
#learn #PLT #recommend
编程范式,是组合程序的手法,是软件设计的哲学。 Fortran的作者Backus, C的精神领袖Dijkstra 都颠覆过现有的范式
下文不止是种浪漫或讲故事,React 也是对HTML模板范式的改良而爆火
asm:
世界上第一门编程语言,是各种机器语言的文本形式:汇编
没有嵌套结构,以至于许多bot和cli命令使用它的格式接受参数、实现功能
是自由度最高的"系统编程"语言,但机器的自由,反会奴役程序员的想象力

算法范式: asm procedural(imperative) declarative(markups)
数据范式: structured/SP OOP FP
从易解析、VM实现<50行的角度看,汇编是种标记语言。拿txt写需求够用,写业务流当然很累。

下表是这些范式的原神
算法范式: LLVM/WASM C++/Scratch SQL/YAML/PyTorch
数据范式: Rust Java/JSPy TS/React

结构式Rust有比过程式C++更准确更美的类型系统,以此区分。它与Go没有构造器和继承,不算OOP,尽管它混入了精髓(self 参数的链式调用)
从原神到远古。
procedural:
67年前,Fortran 随Backus的新ACM诞生: Can Programming Be Liberated from the "Von Neumann-style"?
F90是一门基于goto行号、支持矩阵malloc和中缀算式、前置类型的语言,这些特性都是x86未提供的。汇编新函数都要手写CDEF样板代码,而那时给游戏机编程的团队也没在乎复用的概念
F90的缩进风格类似SQL,调用风格比Ruby更混乱。PRINT(*) "hi" 是向内置函数提供默认+标准2种参数,自定义函数只能用CALL f,x 模仿。这种内外不平等在PHP,VBA也很常见,Py2to3 就为此修正

structured:
随后3年 ALGOL60.org 诞生。Dijkstra创立的这种结构化编程范式,是 Pascal,Ada 风格的老祖宗
Algol 否定了汇编式的goto,引入了struct定义,划清了四则等运算栈和调用栈。反观最初的F77语言并不能定义具名元组(ADT)
因此用它能学习算法和(同年诞生的Lisp包含的)递归

OOP:
随后2年,Simula67引入了OOP的class等概念: class就是共享构造参数的多函数,函数就是隐藏this等参数的单方法接口,对象和闭包都是代码+数据 是双指针。 闭包序列化可实现RPC和printf!宏
OOP的生硬对不习惯简洁明确DSL的人更友好,因为"method"闭包可以是getsetter、 final/abstract 确定性、 public/private 可见性..
之后以 C++(39年前),Py(32),Rb(29),Java,JS(28),C#(24) 的顺序出现几门主流语言,而 Alan Kay 以启发了Scratch的Smalltalk获图灵奖,成为了OOP届的领军人物

FP:
49年前的Scheme支持了(retAddr的)闭包 以将栈vars转为堆对象(才能作为值),且默认将函数存为(全局/原型链)变量。这比Lua协程早了十年
34年前的Haskell最终让 State,Monad IO, Effect,异步Flow 等术语“组合拳”火遍JS界。 FP界相对零碎,丘奇和图灵可谓两大师
Lisp系的圆括号SEXP直观统一了运算栈和调用栈,一切流控与数学都是函数,这启发了WASM 且等效于VPL拖拽编程/flow编程

综上,老旧的语言未必是落后的
Py,Lisp(WASM,LINQ DSL),Haskell(React) 就对现在的前后端和Excel影响很大
#code #asm on x86-64, Diane's silk dress costs $89
>which registers are used for passing arguments in a Linux x86-64 system? make a tool in js, replaceTo arg{0-5}
ASMR="
subs=(kv,re=RegExp(Object.keys(kv).join('|'),'g'))=>s=>s.replace(re, key => kv[key])

subs(Object.fromEntries(
'rdi rsi rdx rcx r8 r9'.split(' ').map((register, index) => [register, 'arg'+index])
))(fs.readFileSync(0, 'utf-8'))
"


从中可以看到源码调用printf() 的汇编

>find regular file in /usr/bin/* , sort size |xargs file
find `ls -d /usr/bin/* --sort=size` -type f,d|tail -n 1000|xargs file|grep ELF

>radare2 cmd to find string "usage", and show xref in code
r2 <<<'aa;`iz~usage|awk "{print $1}"`;`axtq`' /bin/db_verify

>objdump -d, intel-syntax, no address or bytes, .text only from 0x0000113f
objdump -d -M intel --no-show-raw-insn --no-addresses --start-address=0x0000113f /bin/db_verify|node -p "$ASMR"



x86_64-CDEF/cdecl 科普:
The first six integer or pointer arguments are passed in registers rdi, rsi, rdx, rcx, r8, and r9.
Floating-point arguments are passed in the vector registers xmm0 through xmm7.
其他参数溢出到 rsp-.. 栈上,rsp+用于局部分配(right-to-left order)
<16 bytes 自动传值,也就是可int vec4
Integer and pointer return values are in rax. caller is responsible for cleaning up the stack(rsp-=.. SYSV/win32 STDCALL/包括C++ thiscall 是callee负责,这是唯一的区别)
Floating-point return values are in xmm0.


C语言可以说是汇编的附庸了,在编译后各种类型都会变成+8 +16 的偏移量,struct不能作为值自由地传递或返回,就连数组长度也记不住!
#cs #asm 一个极小的2byte指令和数据RISC(int=i8)
GP寄存器: R0~RE
mov RF, setInterval
smem 0x800, 输出
lmem 0x802, 输入
地址总线u16 通过RD:RE访问

#book Computer Science: An Overview http://v8cpu.qinyue.world/instruction-set.html
https://github.com/chyyuu/v8-cpu/tree/master/examples
https://github.com/vsergeev/v8cpu/blob/master/v8cpu_isa.txt

汇编期计算:
brElse: fn ;if{}else{fn} then..
addI R0,0xFA,R0 ;+=250
jumpL R0,'A' ;if(ch==0x41)
rodata_XX: db "Hello" ;常量池指针

ALU(fn Ra Rb Rw):
addi .+
addf d+
and .&
or .|
xor .^

MCU(fn Ra lit):
jumpl b.lt
jump b.eq
move .= Ra Rw
halt b.thread
rot .>>

ldst内存读写指令,在x86上从来都是mov多写法
loadm lconst "wtf"
loadb lconst_0
loadp larg, aload 0
1
#dalao https://www.kxxt.dev/blog/programming-thoughts/2022-04-16/
https://lutaonan.com/blog/code-artists/ #ai #dev 第二次提及了,不符合刻板印象的 #js👍
把 AI 当作是你的员工,就像某一天你突然只需要 $20 一个月就能招无数多愿意帮你打工的人,你很快就会发现,你最终会面临两种局面:

局面1:你将手足无措,你突然发现如果你不是实现函数的那个人,你就不知道你应该做什么了。从前你沾沾自喜的手写快排,手写红黑树突然变得一文不值,无处施展。
局面2:你将如虎添翼,你突然发现你曾经有很多想法没有精力和时间去实现,现在突然有这么多廉价劳动力将不厌其烦地帮你写代码

在这里我要申明,这篇文章我是写给有一定经验的程序员看的。对于没有什么经验的程序员,多写点代码总是好的
就像下面这个例子,我只要说一句 add tanstack query provider 就能让 AI 帮我把 @tanstack/query 加到我的程序里,但如果你没有任何代码经验,你连 query 是什么都不知道

#sql
https://github.com/duckdb/pg_duckdb
https://github.com/asg017/sqlite-vec
#asm C语言的变量符号
https://tttttt.me/kaedeharakazuha17/3548?comment=26435
https://evian-zhang.github.io/learn-assembly-on-Apple-Silicon-Mac/1-底层的整数.html
https://nan-archive.vercel.app/debugger
#bash
https://github.com/kxxt/tracexec?tab=readme-ov-file#origin
可是 stra execve 也可以
alias stra='strace --quiet=attach,exit -f -e "signal=!chld" -e'