当前位置: 首页 > 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_RDONLY0) 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 - 内存中搜索内存 ; 输入rdihaystack, rsineedle, rdxneedle_len, rcxhaystack_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.rkmt.cn/news/1397911.html

相关文章:

  • 神经形态计算:生物启发的下一代AI硬件架构
  • 上班族必备:2026年PDF转Word免费分享,告别手动打字 - 时时资讯
  • 鸿蒙智慧停车页面构建:深色主题与车位数据可视化详解
  • C51编译器DPTR寄存器优化技巧与实战应用
  • 保姆级教程:在Ubuntu 20.04上用Qt5调用海康威视SDK(附Demo适配避坑指南)
  • 2026年至今,四川地区实力办公家具定制服务商深度推荐 - 2026年企业资讯
  • Lovable媒体管理系统权限体系设计(企业级RBAC落地全图谱):金融/广电/教育三大行业合规验证版
  • 高效用项集挖掘:从酒店评论中解码评分背后的体验组合密码
  • 优思学院|为什么同样的设备、同样的材料,产品质量却总是不稳定?
  • 从Maya到Unity:动画师与程序员的BlendShape协作避坑指南(含模型导入设置)
  • 多Agent虚拟开发:智能体驱动开发与程序员的下一个十年(二)
  • Ironman-NMP:隐私保护AI的近内存加速技术解析
  • 湖南好课优选《Python软件开发》教材正式出版 | 匠心筑教,赋能未来 !
  • 25道Prompt/Skill核心面试题深度解析:从基础到工程化落地,助你拿下AI高薪Offer!
  • 2026年耐火材料供应厂家技术解析:耐火砖哪家好、耐火砖批发、耐火砖报价、四川耐火材料、四川耐火砖、成都耐火材料选择指南 - 优质品牌商家
  • Apache Flink核心原理与实战:流批一体赋能实时大数据
  • 从Wider Face到模型训练:一份超详细的数据集预处理与格式转换指南(附XML转换脚本)
  • 告别龟速搜索!用Everything搞定局域网共享文件,保姆级配置指南(含开机自启与快捷键设置)
  • 485mJ雪崩能量+低噪声特性:FMH16N50E的感性负载开关与EMI优化设计
  • 昇腾CANN集合通信库HCCL:分布式训练的数据并行通信原理与性能调优
  • 从“能用”到“好用”:全域智能时代,AI如何渗透每一个场景?
  • 架构先行 ReAct 推理基座重构,让企业 Agent 落地
  • 量子点光子源在容错量子计算中的关键技术解析
  • 拉电流和灌电流
  • 多评价器强化学习在机器人控制中的应用与优化
  • Gibbs采样实战:如何用它搞定LDA主题模型中的参数估计?
  • Unity新手避坑指南:NavMesh烘焙失败?这5个常见问题我帮你解决了
  • 想0基础入行网络安全|超清晰的3个阶段学习路线
  • 【企业出海必读】PlayAI多语种翻译如何替代传统MT+PE流程?实测节省67%本地化成本?
  • PostgreSQL性能优化实战:从查询慢如蜗牛到飞一般的体验