x64汇编实现的多线程web server

news/2025/3/20 21:21:18/文章来源:https://www.cnblogs.com/godlmkblog/p/18783979

一个web server,使用x64汇编

代码和注释如下,还是比较丑陋的

.intel_syntax noprefix
.globl _start.section .text_start:
socket:mov rax, 0x29mov rdi, 2mov rsi, 1mov rdx, 0syscallmov r14, rax
bind:mov rdi, rax # 将socket 的fd mov到rdimov rax, 0x31lea rsi, [socket_addr]mov rdx, 16syscall
listen:mov rax, 0x32mov rdi, 3mov rsi, 0syscall
conn_loop:
accept:mov rax, 0x2bmov rdi, 3mov rsi, 0mov rdx, 0syscallmov r15, rax
# fork child# 39	-	-	-mov rax, 0x39syscallcmp rax, 0je child_process# 3	unsigned int fd	mov rdi, r15mov rax, 3syscall # close accpet fdjmp acceptchild_process:
mov rdi, r14mov rax, 3syscall # close scock fd
read:mov rdi, r15 # we read from the accepted connection, so we use that file descriptorsub rsp, 0x400 # setting up the stack as the buffer variablemov rsi, rspmov rdx, 0x400 # upto how many bytes can be readxor rax, rax # 0 is the syscall value for read()syscall # read(conn, *buf, 1024)mov r14, rax # 保存长度# 根据第一个单词来判断是否是POST
cmp byte ptr [rsp], 71
jne post
get:
lea rdi, [rsp + 4] # 跳过"Get "
xor rcx, rcx
# find filename
find_filename_get:cmp byte ptr [rdi + rcx], 0x20 # 找到下一个空格je end_filename_getinc rcxjmp find_filename_getend_filename_get:mov byte ptr [rdi + rcx], 0x0 # 将空格转为0# open_file:mov rsi, 0 # O_RDONLYmov rax, 0x2syscallmov r14, rax
# read_file:# unsigned int fd	char *buf	size_t countmov rdi, r14sub rsp, 0x1000mov rsi, rspmov rdx, 0x1000mov rax, 0syscall # readmov r14, rax # 保存长度# closefd:mov rax, 3syscall# write_static_response:mov rax, 1  # write syscallmov rdi, 4lea rsi, [response]mov rdx, 19syscall
# write_file_content:# 1	unsigned int fd	const char *buf	size_t countmov rdi, r15mov rsi, rspmov rdx, r14mov rax, 1syscall # write filejmp close_accept
post:# find filename
lea rdi, [rsp + 4] # 跳过"Get "
xor rcx, rcx
# 找到文件名
lea rdi, [rsp + 5] # 跳过"Post "xor rcx, rcx# find filename
find_filename:cmp byte ptr [rdi + rcx], 0x20 # 找到下一个空格je end_filenameinc rcxjmp find_filenameend_filename:mov byte ptr [rdi + rcx], 0x0 # 将空格转为0# 找到头长度lea rdi, [rsp] # rdixor rdx, rdxfind_header_length:lea rsi, [end_string] # 将\r\n\r\n拷贝到rsimov rcx, 4repe cmpsb              # 重复比较字节直到RCX=0或字节不等jz end_header_lengthinc rdxlea rdi, [rsp]add rdi, rdxjmp find_header_lengthend_header_length:add rdx, 4 # 正文开始的地方mov r8, rsp # 保存开始的地方add r8, rdxmov r9, r14 # 总长度sub r9, rdx # 保存正文的长度# 打开文件# 2	const char *filename	int flags	umode_t mode
open_file:lea rdi, [rsp+5] # 文件名mov rsi, 00000001         # O_WRONLY        xor rsi, 00000100        # O_CREATmov rdx, 0777mov rax, 0x2syscallmov r10, rax# 写回正文内存
write_file_content:# 1	unsigned int fd	const char *buf	size_t countmov rdi, r10mov rsi, r8mov rdx, r9mov rax, 1syscall # write 正文# close file_fdmov rdi, r10mov rax, 3syscall write_static_response:mov rax, 1  # write syscallmov rdi, r15lea rsi, [response]mov rdx, 19syscallclose_accept:mov rdi, r15mov rax, 3syscall # close accept fd
# jmp conn_loop
exit:mov rdi, 0mov rax, 0x3csyscall.section .datasocket_addr:.word 2    # AF_INET.word 0x5000 # htons(80).long 0      #.zero 8response: .ascii "HTTP/1.0 200 OK\r\n\r\n" end_string: .ascii "\r\n\r\n"

编译方式

gcc -nostdlib server.s -o server

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/902219.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SqlServer 中行转列PIVOT函数用法

SqlServer 中行转列PIVOT函数用法 前言 最近在面试的时候,碰到了手写sql的题目,这让我这个面向AI的程序员着实难看。只见我面露难色,绞尽脑汁的情况下,终于还是放弃了。 这道题目不难,但是由于平时几乎没有遇到行转列的情况,导致在手写时忘记了PIVOT函数怎么使用😩。 面…

第五周第四天

所用时间:180分钟 代码量(行):15 博客量(篇):1 了解到的知识点: 1.matplotlib的配置 因为要参加数学建模大赛,今天配置了python和matplotlib环境,尝试运行了程序,代码如下: import matplotlib.pyplot as plt import numpy as np# 生成数据 x = np.linspace(0, 10, …

Vue3中使用TinyMce编辑器

Vue3中使用TinyMce编辑器 - 知乎 一,安装TinyMce富文本vue npm install @tinymce/tinymce-vue -S npm install tinymce -STinyMce本身是英文编辑器,所以还需要下载中文本地化文件:https://www.tiny.cloud/get-tiny/language-packages/下载完成后放入node_modules下的tinymce…

入门Dify平台:如何根据需求选择与创建最合适的应用

今天我们将继续深入讲解Dify,重点介绍如何创建应用。具体来说,我们将探讨如何根据不同的需求来决定选择什么类型的应用最为合适,帮助大家更好地理解在Dify平台上构建应用的最佳实践。 创建空白应用 首先,我们需要进入Dify的首页选择工作室,并创建空白应用。如图所示:点击…

月暗推出音频模型 AudioX:任意内容生成音频和配乐;开源 TTS 模型 Orpheus,可生成叹息、笑声等非文本线索丨日报

开发者朋友们大家好:这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的 技术 」、「有亮点的 产品 」、「有思考的 文章 」、「有态度的 观点 」、「有看点的 活动 」,但内容仅代表编辑…

202110211215 - IT项目管理笔记

IT项目管理中的百慕大 资源 、范围、进度 三角平衡 项目管理 -- 做事 启动、规划、执行、控制、收尾 项目管理 -- 四个层次: 复杂的事情简单化:分解 简单的事情量化:临界值 量化的事情专业化:规律 专业的事情模板化:框架模板 项目: 为创造特定产品或服务的一项有时限的任…

k8s拉取私有镜像的2种方式

k8s 在拉取私有镜像时 ,传递认证信息目录通过secret通过ServiceAccount 通过secret01-image-pull.yamlkind: Pod apiVersion: v1 metadata:name: imagepull-nginxlabels:group: imagepull spec:containers:- name: nginximage: registry.cn-beijing.aliyuncs.com/hkui_dev/ngi…

202110111235 - 软件工程笔记

1. 概述 1.1 开发只占冰山一角 1.2 计算机科学、数学,工程,管理 1.3 软件开发的本质:实现问题域中的概念和处理逻辑 到 运行平台的概念和处理逻辑的映射。系统建模 需求 -> 设计 -> 实现1.4 软件工程的目标:生产具有正确性、可用性、以及开销合宜的产品。 1.5 软件工…

202109060657 - hadoop架构和读写流程

1. 整体架构 hdfs架构zkmonode高可用。HA的工作原理?是否需要每个datanode监听zk?namenodeNameNode(nn):Hdfs集群的管理者,Master 管理Hdfs的名称空间(NameSpace) 维护副本策略 记录文件块(Block)的映射信息 负责处理客户端读写请求datanodeDataNode:NameNode下达命令,…

基于风险的完整性和检查建模(RBIIM)MATLAB仿真

1.程序功能描述 基于风险的完整性和检查建模(Risk-Based Integrity and Inspection Modeling ,RBIIM)MATLAB仿真,对比prior density,posterior perfect inspection,posterior imp inpection,cummulative posterior imperfect inspection四个指标。 2.测试软件版本以及…

202108151156 - kafka消费积压案例

0. 背景 上游厂家生产信令数据,我方消费kafka数据,过滤后插入HBase。 上游生产的信令数据分了4个主题,每个主题有若干分区,这4个主题的数据消费后都插入同一张HBase表。 问题:kafka消息积压达到百亿。 以下以topic1为例,有6个分区。 1. 查看消费滞后情况 kafka-consumer-…

mysql 多表怎么连接的

前言 简单描述一下多表怎么连接的。 正文 首先,我们得抛开我们一些自以为是的想法。 我想过这个问题,就是为什么我们背乘法口诀的时候,我们总是背: 22 = 4, 99=81 这样背下去,似乎这是口诀。然而这是缓存,不是计算,既然不是计算那么就不是逻辑学。 我们理所当然的想9*9…