当前位置: 首页 > news >正文

最简单的汇编语言 grep - x86_64 Linux

; 最简单的 grep - x86_64 Linux ; 用法:nasm -f elf64 grep.asm && ld -o grep_asm grep.o && ./grep_asm <pattern> <file> section .data usage db "Usage: grep <pattern> <file>", 10 usage_len equ $ - usage err_open db "Error: cannot open file", 10 err_open_len equ $ - err_open section .bss pattern resb 256 pattern_len resq 1 line resb 4096 fd resq 1 section .text global _start _start: ; 检查参数数量 (argc) pop rdi ; argc cmp rdi, 3 jl print_usage pop rsi ; argv[0] = program name pop rsi ; argv[1] = pattern pop rdi ; argv[2] = filename mov r8, rdi ; 保存 filename 到 r8 ; 计算 pattern 长度并复制 xor rcx, rcx copy_pattern: mov al, [rsi + rcx] test al, al jz pattern_done mov [pattern + rcx], al inc rcx jmp copy_pattern pattern_done: mov [pattern_len], rcx ; 打开文件 open(filename, O_RDONLY=0) mov rax, 2 ; sys_open mov rdi, r8 ; filename mov rsi, 0 ; O_RDONLY syscall test rax, rax js error_open mov [fd], rax read_loop: ; read(fd, line, 4096) mov rax, 0 ; sys_read mov rdi, [fd] lea rsi, [line] mov rdx, 4096 syscall test rax, rax jle exit_success mov r12, rax ; 读取的字节数 xor r13, r13 ; 当前行起始偏移 process_lines: cmp r13, r12 jge read_loop ; 找下一个换行符 mov r14, r13 ; 从当前位置开始找 find_newline: cmp r14, r12 jge process_last_line mov al, [line + r14] cmp al, 10 je found_newline inc r14 jmp find_newline found_newline: ; 检查并打印该行:r13=行起始,r14=换行符位置 mov rdi, r13 ; 行起始 mov rsi, r14 ; 换行符位置 call check_and_print mov r13, r14 inc r13 ; 跳过换行符 jmp process_lines process_last_line: ; 处理最后一行(没有换行符) cmp r13, r12 jge read_loop mov rdi, r13 ; 行起始 mov rsi, r12 ; 缓冲区末尾 call check_and_print jmp read_loop ; ----------------------------------------------------------- ; check_and_print - 检查并打印匹配的行 ; 输入:rdi=行起始偏移,rsi=行尾偏移 ; ----------------------------------------------------------- check_and_print: push rbx push r12 push r13 push r14 push r15 mov r13, rdi ; 行起始 mov r14, rsi ; 行尾 ; 计算行长度 mov r15, r14 sub r15, r13 ; 行长度 ; 调用字符串搜索 lea rdi, [line + r13] ; haystack = 行起始 lea rsi, [pattern] ; needle mov rdx, [pattern_len] ; needle 长度 mov rcx, r15 ; haystack 长度 call memmem_simple test rax, rax jz .no_match ; 找到匹配,打印该行(包含换行符) mov rax, 1 ; sys_write mov rdi, 1 ; stdout lea rsi, [line + r13] mov rdx, r14 sub rdx, r13 inc rdx ; 包含换行符 syscall .no_match: pop r15 pop r14 pop r13 pop r12 pop rbx ret ; ----------------------------------------------------------- ; memmem_simple - 内存中搜索内存 ; 输入:rdi=haystack, rsi=needle, rdx=needle_len, rcx=haystack_len ; 返回:rax=匹配位置指针,0=未找到 ; ----------------------------------------------------------- memmem_simple: push rbx push r12 push r13 push r14 push r8 push r9 mov r12, rdi ; haystack mov r13, rsi ; needle mov r14, rdx ; needle_len xor rbx, rbx ; 当前位置索引 ; 如果 needle 长度为 0,返回 haystack test r14, r14 jz found_at_start search_loop: ; 检查剩余长度 mov rax, rcx sub rax, rbx cmp rax, r14 jl not_found ; 逐字符比较 xor rdx, rdx ; 比较索引 compare_loop: cmp rdx, r14 jge found_match mov r8, r12 add r8, rbx add r8, rdx mov al, [r8] mov r9b, [r13 + rdx] ; 用 r9b 而不是 cl,避免破坏 rcx cmp al, r9b jne no_match_inc inc rdx jmp compare_loop no_match_inc: inc rbx xor rdx, rdx ; 重置 needle 索引 jmp search_loop found_match: mov rax, r12 add rax, rbx jmp done_memmem found_at_start: mov rax, r12 jmp done_memmem not_found: xor rax, rax done_memmem: pop r9 pop r8 pop r14 pop r13 pop r12 pop rbx ret print_usage: mov rax, 1 mov rdi, 2 ; stderr lea rsi, [usage] mov rdx, usage_len syscall jmp exit_error error_open: mov rax, 1 mov rdi, 2 lea rsi, [err_open] mov rdx, err_open_len syscall exit_error: mov rax, 60 mov rdi, 1 ; 错误退出 syscall exit_success: mov rax, 60 xor rdi, 0 ; 成功退出 syscall
http://www.jsqmd.com/news/893847/

相关文章:

  • 多IMU扩展卡尔曼滤波在足式机器人状态估计中的应用
  • 知识图谱与BERT融合:基于深度Inception网络的网页分类实践
  • 超声波雷达:智能驾驶的“贴身护卫”,技术内幕与未来战局
  • 你的模型F1分数真的‘最佳’吗?避开阈值选择中的3个常见误区(Python示例)
  • 从“能用”到“好用”:全域智能时代,AI如何渗透每一个场景?
  • Unity新手避坑指南:NavMesh烘焙失败?这5个常见问题我帮你解决了
  • Python内置函数从入门到实战:list、open等核心用法全解析
  • 二十、自定义类型:结构体
  • buildroot的overlay文件拷贝机制BR2_ROOTFS_OVERLAY
  • 模块化太空巡检机器人设计与在轨维护技术解析
  • 告别WebGL!用Unity Embedded Browser插件在PC游戏里无缝嵌入你的数据可视化大屏(ECharts实战)
  • C166中断向量重定向技术及双镜像系统实现
  • 智能驾驶的“眼睛”与“大脑”:环境感知系统深度解析与实战指南
  • 从运维视角看字体管理:如何用脚本在CentOS/Windows服务器上批量部署企业字体库
  • 写学术论文时,文献综述应该怎么写才出彩?
  • 神泣纷争|5 月 26 日三服连开 S231 巨蛇环世 / S232 寒熊巡原 / S233 渡鸦寻野
  • 别再为批次效应头疼了!手把手教你用scVI整合10x Genomics单细胞数据(附完整Python代码)
  • C语言goto语句的正确使用与替代方案
  • Lovable招聘系统搭建资源包限时开放:含Terraform部署脚本、候选人漏斗埋点规范、HR SSO集成文档(仅限前200名技术负责人领取)
  • 从比特币到以太坊:手把手教你用Python实现Merkle树验证交易
  • 如何快速优化鸣潮游戏体验:免费开源工具箱的完整指南
  • 观察taotoken在多模型聚合调用时的自动路由与故障转移效果
  • 计算机视觉技术驱动的马铃薯病害识别【附代码】
  • 嵌入式C语言中断函数静态化设计与优化实践
  • 别再死记硬背了!用Python(NumPy/SciPy)可视化理解离散与连续概率分布
  • 从理论到实战:用Python复现一篇边缘计算顶会论文的完整流程(以任务卸载为例)
  • Lovable写作助手开发实战:3天快速集成LLM+RAG+用户反馈闭环的5个关键步骤
  • 最好用的开源问卷系统:调问DWSurvey二次开发自由,一站式搞定调研与系统集成
  • 别再傻傻重装系统了!Win10下eNSP AR启动报错40的保姆级清理修复指南
  • 2026婚宴定制玻璃酒瓶:泸州玻璃酒瓶公司、泸州玻璃酒瓶厂、泸州玻璃酒瓶定制、玻璃酒瓶公司哪家好、玻璃酒瓶公司哪里有选择指南 - 优质品牌商家