尝试写一个字符串拷贝

1#include <stdio.h> 2#include <stdlib.h> 3 4extern int strlen2(char* str); 5extern void memscp2(char* dest, char* src,unsigned int size); 6extern void memscp3(char* dest, char* src,unsigned int size); 7 8int main() 9{ 10 int a = add(1, 2); 11 printf("%d\n", a); 12 printf("%d\n", strlen2("awd434")); 13 14 char* s = calloc(sizeof(char), 10); 15 memscp2(s, "awdawdawdfawffawf", strlen2("awdawdawdfawffawf")); 16 printf("%s\n", s); 17 18 char* ss = calloc(sizeof(char), 10); 19 memscp3(ss, "awdawdawdfawffawf", strlen2("awdawdawdfawffawf")); 20 printf("%s\n", s); 21 22 return 0; 23} 1SECTION .data 2 3SECTION .text 4 global memscp2 5 global memscp3 6 7; void memscp2(char* dest /* rdi */ , char* src /* rsi */,unsigned int size /* rdx */) 8memscp2: 9 mov rcx, rdx 10 cld 11 rep movsb 12 ret 13 14; void memscp3(char* dest /* rdi */ , char* src /* rsi */,unsigned int size /* rdx */) 15memscp3: 16 mov rcx, rdx 17nextbyte: 18 mov rax, [rsi] 19 mov [rdi], rax 20 add rsi, 8 21 add rdi, 8 22 loop nextbyte 23 xor rax, rax 24 ret 写了两个版本,上面的是movsb,一个专门用来拷贝字符的指令,估计是有特殊优化。 ...

2025年05月06日 · 1 分钟 · 225 字 · sdttttt

C中的指针运算,类型转换以及函数指针

这次依然是从汇编开始分析C语言里的一些语法实现,这次还是Windows平台上为主~ 直接上最简单的: 1int z = 0; 2char s1 = (char)z; 3 4// ASM 5int* z = 0; 6// 这次就直接显示符号名吧,不看内存地址了 7// dword ptr就是数据类型声明 8mov dword ptr [z],0 9char* s1 = (char*)z; 10// movzx这个指令,下面讲解,总之就是把z移动到eax寄存器. 11movzx eax,byte ptr [z] 12// 直接粗暴的进行一个强转,al是AX的第八位,AX是EAX的低16位 13// mov指令要求操作数大小相等,byte ptr只占8个字节,所以这里用AL寄存器 14mov byte ptr [s1],al movzx这个指令简单来说就是把小字节操作数移动到大字节寄存器,同时让大字节的高位补零。 ...

2025年05月04日 · 2 分钟 · 995 字 · sdttttt

尝试写一个strlen

1#include <stdio.h> 2 3extern int strlen2(char *str); 4 5int main() { 6 char a[] = "hello,world"; 7 int len = strlen2(a); 8 9 printf("%s len:%d \n", a, len); 10 11 return 0; 12} 1SECTION .data 2 3SECTION .text 4 global strlen2 5 6strlen2: 7 mov rax, rdi 8next: 9 cmp byte [rax], 0 10 je down 11 inc rax 12 jmp next 13down: 14 sub rax, rdi 15 ret

2025年04月25日 · 1 分钟 · 69 字 · sdttttt

調用約定

感觉没什么营养,懒得写了。

2025年04月24日 · 1 分钟 · 13 字 · sdttttt

看一眼Linux的匯編

繼續上一篇文章,還是那個代碼,這次我們在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 ;最後彈出地址到棧裏返回

2025年04月24日 · 1 分钟 · 410 字 · sdttttt

久违的继续学汇编

上次学汇编都是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平台): ...

2025年04月23日 · 2 分钟 · 902 字 · sdttttt

关于协程的设计目的

最近有人问起我关于Go语言中协程的设计初衷问题,正好说一下我对这个玩意的想法,同时这个也算是面试中可能会问起的问题。 从操作系统的层面上来在,线程是由内核创建和管理,运行在内核态的一种数据结构。协程是由用户创建和管理,运行在用户态的一种数据结构。 ...

2025年04月18日 · 2 分钟 · 644 字 · sdttttt

OSI7层在OS是如何实现以及OS如何处理数据包

这篇文章只是个笔记,大部分都是网上摘的,不过如果后续折腾软路由以及相关协议开发还是相当有用的: 一、硬件层:物理信号的接收与转换 外部流量(如以太网帧)通过物理介质(网线/光纤)传输,最终到达服务器的网络接口卡(NIC,Network Interface Card)。网卡的核心功能是将物理信号(电/光)转换为数字信号,并完成初步的数据封装/校验。 ...

2025年04月10日 · 6 分钟 · 2878 字 · sdttttt

又双叒叕升级了一下显卡

没忍住,还是换了下显卡。 1080ti的槽点有点多,绝区零战斗以及光映广场跑图时候的掉帧相当严重。 看了极客湾的视频感觉是cpu瓶颈偏多,但是我又不能换cpu,因为代价过高了。 5000系Ryzen升级到7000系后,除了cpu的费用还需要更换主板,还有内存条。 ...

2025年01月03日 · 2 分钟 · 903 字 · sdttttt

关于杀毒软件

很长时间没有编写博客了,今天正好写一下。 不知道是什么时候开始的,可能是2018年之后,我电脑上就再也没有安装过杀毒软件。 主要学习软件开发方面的东西之后开始对一些计算机上的东西看法也发生了一些变化。 先说结论吧,正常以及安全的使用电脑的情况下,杀毒软件是没有安装的必要。 ...

2024年11月27日 · 2 分钟 · 865 字 · sdttttt