調用約定
感觉没什么营养,懒得写了。
感觉没什么营养,懒得写了。
繼續上一篇文章,還是那個代碼,這次我們在Linux上編譯試試,看看和windows有什麽不同。 1int add(int a, int b) { 2 return a + b; 3} 4 5int main() 6{ 7 int a = add(1, 2); 8 return 0; 9} 匯編來咯: 1 0x000055555555460e <+0>: push rbp 2 0x000055555555460f <+1>: mov rbp,rsp 3 0x0000555555554612 <+4>: sub rsp,0x10 4 0x0000555555554616 <+8>: mov esi,0x2 5 0x000055555555461b <+13>: mov edi,0x1 6 0x0000555555554620 <+18>: call 0x5555555545fa <add> 7 0x0000555555554625 <+23>: mov DWORD PTR [rbp-0x4],eax 8 0x0000555555554628 <+26>: mov eax,0x0 9 0x000055555555462d <+31>: leave 10 0x000055555555462e <+32>: ret 11 12 ;其實大差不差,前三句是保存上下文和開闢棧幀 13 ;後面把參數放進去,調用add,然後吧eax裏的返回值取出到rbp-4這個地址裏,清零 14 ;leave的看起來像是linux平臺下獨有的指令 15 ;這個指令其實基本等同于 mov rsp, rbp; pop rbp 16 ;實際上就是回復上下文 17 18 19 0x00005555555545fa <+0>: push rbp 20 0x00005555555545fb <+1>: mov rbp,rsp 21 0x00005555555545fe <+4>: mov DWORD PTR [rbp-0x4],edi 22 0x0000555555554601 <+7>: mov DWORD PTR [rbp-0x8],esi 23 0x0000555555554604 <+10>: mov edx,DWORD PTR [rbp-0x4] 24 0x0000555555554607 <+13>: mov eax,DWORD PTR [rbp-0x8] 25 0x000055555555460a <+16>: add eax,edx 26 0x000055555555460c <+18>: pop rbp 27 0x000055555555460d <+19>: ret 28 29 ;這裏也很簡單,前兩句還是保存上下文,不過這次沒有開闢棧幀 30 ;直接把兩個寄存器的值移動到内存地址裏再放在寄存器裏再計算? 31 ;這樣寫有點逆天,不過估計是debug模式完全沒有優化 32 ;最後彈出地址到棧裏返回
上次学汇编都是2年前了好像,学了一些基本的指令用法。 这次像重新捡起来了,同时想要自己写点新的玩意,目前的知识不太够呢 慢慢学吧… 这次开始读汇编和画栈结构吧~ 先从简单的开始: 1int add(int a, int b) { 2 return a + b; 3} 4 5int main() 6{ 7 int a = add(1, 2); 8 return 0; 9} 汇编如下(Windows平台): ...
最近有人问起我关于Go语言中协程的设计初衷问题,正好说一下我对这个玩意的想法,同时这个也算是面试中可能会问起的问题。 从操作系统的层面上来在,线程是由内核创建和管理,运行在内核态的一种数据结构。协程是由用户创建和管理,运行在用户态的一种数据结构。 ...
这篇文章只是个笔记,大部分都是网上摘的,不过如果后续折腾软路由以及相关协议开发还是相当有用的: 一、硬件层:物理信号的接收与转换 外部流量(如以太网帧)通过物理介质(网线/光纤)传输,最终到达服务器的网络接口卡(NIC,Network Interface Card)。网卡的核心功能是将物理信号(电/光)转换为数字信号,并完成初步的数据封装/校验。 ...
没忍住,还是换了下显卡。 1080ti的槽点有点多,绝区零战斗以及光映广场跑图时候的掉帧相当严重。 看了极客湾的视频感觉是cpu瓶颈偏多,但是我又不能换cpu,因为代价过高了。 5000系Ryzen升级到7000系后,除了cpu的费用还需要更换主板,还有内存条。 ...
很长时间没有编写博客了,今天正好写一下。 不知道是什么时候开始的,可能是2018年之后,我电脑上就再也没有安装过杀毒软件。 主要学习软件开发方面的东西之后开始对一些计算机上的东西看法也发生了一些变化。 先说结论吧,正常以及安全的使用电脑的情况下,杀毒软件是没有安装的必要。 ...
这篇文章会经常更新。 我主要在路由器上使用DAE来进行网络流量处理。 所以必须在系统编译上开启一些BPF的相关构建。 以下是一些我遇到过的报错。 ERROR: package/kernel/bpf-headers failed to build. 这个问题最后抛出的关键信息是 /workdir/openwrt/include/bpf.mk:71: *** ERROR: LLVM/clang version too old. Minimum required: 12, found: . Stop. 只要安装LLVM/clang 12以上的版本就可以。 ...
好长时间没写blog了,这段时间暂时没有写代码,一直在倒腾软路由的事情。 不过多亏了软路由,我对网络知识的储备又增加了一些。 这篇文章是想好好讲一下关于Linux上的网络数据包的路由处理. 据我现在所了解到的知识,Linux上决定数据包路由流向的关键模块有两个, 第一个是RPDB(Routing Policy DataBase 路由策略数据库),第二个是netfilter/iptables,很多人会把netfilter/iptables直接称之为iptables,也没有问题,但是严格上来说还是分开为好,netfilter是内核中的一部分,提供了一组数据包的hook. iptables则是实现了这些hook,并且提供了在用户空间操作这些hook的办法. ...
前几天重新把家里的板子重装了系统,这次打算不使用云盘之类的软件来保存文件了,就用简单的samba之类系统级的文件分享。 samba每次保存大量的漫画说实话速度有点慢。所以这次我想用NFS试试。看很多文章分析NFS处理小文件的速度极快。 ...