30天自制操作系统(第23天)
23.1 编写malloc
| memman 初始化 | malloc | free |
| EDX=8 EBX=memman 的地址 EAX=memman 所管理的内存空间的起始地址 ECX=memman 所管理的内存空间的字节数 | EDX=9 EBX=memman 的地址 ECX= 需要请求的字节数 EAX= 分配到的内存空间地址 | EDX=10 EBX=memman 的地址 EAX= 需要释放的内存空间地址 ECX= 需要释放的字节数 |
_api_initmalloc: ; void api_initmalloc(void);PUSH EBXMOV EDX,8MOV EBX,[CS:0x0020] ; 初始化地址 P494页 0x0020 (DWORD) ……malloc空间的起始地址MOV EAX,EBX ADD EAX,32*1024 ;分配了32k内存MOV ECX,[CS:0x0000]SUB ECX,EAX ;包括前32位数据(文件信息)以及32k内存INT 0x40POP EBXRET_api_malloc: ;char *api_malloc(int size)PUSH EBXMOV EDX,9MOV EBX,[CS:0x0020]MOV ECX,[ESP+8] ;sizeINT 0x40POP EBXRET_api_free: ;void api_free(char *addr, int size)PUSH EBXMOV EDX,10MOV EBX,[CS:0x0020]MOV EAX,[ESP+8] ;addrMOV ECX,[ESP+12] ;sizeINT 0x40POP EBXRET
23.2 画点
/* a_nask.nas */
_api_point: ;void api_point(int win, int x, int y, int col);PUSH EDIPUSH ESIPUSH EBXMOV EDX,11MOV EBX,[ESP+16] ;winMOV ESI,[ESP+20] ;xMOV EDI,[ESP+24] ;yMOV EAX,[ESP+28] ;colINT 0X40POP EBXPOP ESIPOP EDIRET/* console.c */
if(edx == 11){//api_pointsht = (struct SHEET *) ebx;sht->buf[sht->bxsize * edi + esi] = eax;//修改某个点的颜色sheet_refresh(sht, esi, edi, esi + 1, edi + 1);
} 23.3 刷新窗口
/* a_nask.nas */
_api_refreshwin: ;void api_refreshwin(int win, int x0, int y0, int x1, int y1);PUSH EDIPUSH ESIPUSH EBXMOV EDX,12MOV EBX,[ESP+16] ;winMOV EAX,[ESP+20] ;x0MOV ECX,[ESP+24] ;y0MOV ESI,[ESP+28] ;x1MOV EDI,[ESP+32] ;y1INT 0X40POP EBXPOP ESIPOP EDIRET/* console.c */
int *hrb_api(int edi, int esi, int ebp, int esp, int ebx, int edx, int ecx, int eax){(中略)if(edx == 1)cons_putchar(cons, eax&0xff, 1);else if(edx == 2)cons_putstr0(cons, (char*)ebx+ds_base);else if(edx == 3)cons_putstr1(cons, (char*)ebx+ds_base, ecx);else if(edx == 4) return &(task->tss.esp0); else if(edx == 5){(中略)}else if(edx == 6){
/*这里*/sht = (struct SHEET *) (ebx&0xfffffffe);(中略)
/*这里*/if(ebx&1 == 0)
/*这里*/ sheet_refresh(sht, eax, ecx, esi + 1, edi + 1);}else if(edx == 8){//memman初始化(中略)}else if(edx == 9){//malloc(中略)}else if(edx == 10){//freeecx = (ecx+0x0f)&0xfffffff0;//所释放的内存空间的字节数memman_free((struct MEMMAN *) (ebx + ds_base), eax, ecx);}else if(edx == 11){//api_point
/*这里*/ sht = (struct SHEET *) (ebx&0xfffffffe);sht->buf[sht->bxsize * edi + esi] = eax;
/*这里*/ if(ebx&1 == 0)//当ebx的最低位为0,也就是没有字符串需要打印时,刷新图层
/*这里*/ sheet_refresh(sht, esi, edi, esi + 1, edi + 1);}else if(edx == 12){
/*这里*/ sht = (struct SHEET *) ebx;
/*这里*/ sheet_refresh(sht, eax, ecx, esi, edi);}return 0;
} 23.4 画直线
/* a_nash.nas */
_api_linewin: ;void api_linewin(int win, int x0, int y0, int x1, int y1, int col);PUSH EDIPUSH ESIPUSH EBPPUSH EBXMOV EDX,13MOV EBX,[ESP+20] ;winMOV EAX,[ESP+24] ;x0MOV ECX,[ESP+28] ;y0MOV ESI,[ESP+32] ;x1MOV EDI,[ESP+36] ;y1MOV EBP,[ESP+40] ;colINT 0X40POP EBXPOP EBPPOP ESIPOP EDIRET/* console.c */
if(edx == 13){sht = (struct SHEET *) (ebx&0xfffffffe);hrb_api_linewin(sht, eax, ecx, esi, edi, ebp);if(ebx&1 == 0)//当ebx的最低位为0,也就是没有字符串需要打印时,刷新图层sheet_refresh(sht, eax, ecx, esi, edi);
}void hrb_api_linewin(struct SHEET *sht, int x0, int y0, int x1, int y1,int col){int i, x, y, len, dx, dy;dx = x1-x0;dy = y1-y0;x = x0<<10;y = y0<<10;if(dx < 0)dx = -dx;if(dy < 0)dy = -dy;if(dx >= dy){len = dx+1;if(x0 > x1)dx = -1024;else dx = 1024;if(y0 <= y1)dy = ((y1-y0+1)<<10)/len;else dy = ((y1-y0-1)<<10)/len;//-(y0-y1+1) = y1-y0-1}else{len = dy+1;if(y0 > y1)dy = -1024;else dy = 1024;if(x0 <= x1)dx = ((x1-x0+1)<<10)/len;else dx = ((x1-x0-1)<<10)/len;}for(i = 0; i < len; i++){sht->buf[(y>>10)*sht->bxsize+(x>>10)] = col;x += dx;y += dy;}return;
}
23.5 关闭窗口
/* a_nask.nas */
_api_closewin: ;void api_closewin(int win);PUSH EBXMOV EDX,14MOV EBX,[ESP+8] ;winINT 0X40POP EBXRET/* console.c */
if(edx == 14){//关闭窗口sheet_free((struct SHEET *) ebx);
} 23.6 键盘输入API
/* a_nask.nas */
_api_getkey: ;int api_getkey(int mode);MOV EDX,15MOV EAX,[ESP+4]INT 0X40RET/* console.c */
if(edx == 15){for(;;){io_cli();if(fifo32_status(&task->fifo) == 0){if(eax != 0)task_sleep(task);//休眠else{//没有键盘输入时返回-1,不休眠io_sti();reg[7] = -1;return 0;}}i = fifo32_get(&task->fifo);if(i <= 1){//光标/*应用程序运行时不需要显示光标,因此总是将下次显示用的值置为1*/timer_init(cons->timer, &task->fifo, 1);timer_settime(cons->timer, 50);}if(i == 2)cons->cur_c = COL8_FFFFFF;/*光标ON */if(i == 3)cons->cur_c = -1;/*光标OFF */if(256 <= i && i <= 511){reg[7] = i-256;return 0;}}
} 23.7 强制结束并关闭窗口
int cmd_app(struct CONSOLE *cons, int *fat, char *cmdline){int segsiz, datsiz, esp, dathrb;
/*这里*/struct SHEET *sht;
/*这里*/struct SHTCTL *shtctl;(中略)if (finfo != 0) {/* 找到了与字符串相同的文件 */p = (char *) memman_alloc_4k(memman, finfo->size);file_loadfile(finfo->clustno, finfo->size, p, fat, (char *) (ADR_DISKIMG + 0x003e00));if (finfo->size >= 36 && strncmp(p + 4, "Hari", 4) == 0 && *p == 0x00){(中略)start_app(0x1b, 1003 * 8, esp, 1004*8, &(task->tss.esp0));
/*从这里开始*/shtctl = (struct SHTCTL *) *((int *) 0x0fe4);/*从这里开始*/for(i = 0; i < MAX_SHEETS; i++){sht = &(shtctl->sheets0[i]);if(sht->flags != 0 && sht->task == task)sheet_free(sht);
/*到这里结束*/}memman_free_4k(memman, (int) q, segsiz);}elsecons_putstr0(cons, ".hrb file format error.\n");memman_free_4k(memman, (int) p, finfo->size);cons_newline(cons);return 1;}return 0;
} 相关文章:
30天自制操作系统(第23天)
23.1 编写malloc 参考第22天的内容,在绘制窗口前先分配了150*50个字节大小的内存,所以导致该文件经编译后有7.6k左右,能否在其中使用指针呢?当需要开辟空间时,移动指针即可。在之前的章节中也有函数memman_alloc函数可…...
基于Rust语言,和WebAssembly技术,与JavaScript结合,的具体应用场景
基于Rust语言与WebAssembly(Wasm)技术并与JavaScript结合,可以应用于多个场景,特别是在需要高性能和/或低级系统访问的情况下。下面是一些具体的应用场景: 性能密集型任务: Rust加上Wasm适合执行计算密集型任务&#x…...
【MATLAB源码-第154期】基于matlab的OFDM系统多径信道下块状和梳妆两种导频插入方式误码率对比仿真。
操作环境: MATLAB 2022a 1、算法描述 OFDM(Orthogonal Frequency Division Multiplexing,正交频分复用)是一种高效的无线信号传输技术,广泛应用于现代通信系统,如Wi-Fi、LTE和5G。OFDM通过将宽带信道划分…...
Linux 下 socket 编程介绍及 TCP 客户端与服务端创建示例
目录 socket 编程接口TCP 服务端TCP 客户端更多内容 本文介绍了 Linux 下的 socket 编程,及总结了使用 socket 接口实现 TCP 服务端和客户端的示例代码。 socket 编程接口 socket() 函数:用于创建一个新的 socket 描述符: int socket(int …...
JetBrains Gateway Github Copilot 客户端插件和主机插件
JetBrains Gateway可以通过插件支持Github Copilot(需另行注册)。 需要安装插件 客户端,而非插件 主机,如图所示: 大概是因为代码显示在客户端(运行在本地的IDE)?...
【web APIs】3、(学习笔记)有案例!
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、概念其他事件页面加载事件元素滚动事件页面尺寸事件 元素尺寸与位置 二、案例举例电梯导航 前言 掌握阻止事件冒泡的方法理解事件委托的实现原理 一、概念…...
使用css reset 还是使用Normalize.css
文章目录 使用css reset 还是使用Normalize.cssCSS Reset:Normalize.css:总结Normalize.css 的使用(例如Vue 3.0 和 Vue CLI 4.x 项目)1.安装2.main.js 中导入3.测试引用是否成功。 使用css reset 还是使用Normalize.css 使用 CSS Reset 还是 Normalize…...
英语中的提问方式(问法)(bug提问、bug描述)
文章目录 英语提问方式一、单词、短语、句子的意思1.1 提问单词的意思1.2 提问短语的意思1.3 提问句子的意思 二、在编程中提问2.1 提问bug2.2 请求代码帮助 如何提出反问句1. 构建反问句的基本结构2. 提问反问句的方法3. 理解反问句的意图 在口语中提问:确保清晰度…...
xss.haozi.me靶机练习
目录 第零关: 第一关: 第二关: 第三关: 第四关: 第五关: 第六关: 第七关: 第八关: 第九关: 第十关: 第十一关: 第十二关…...
2.1 mov、add和sub加减指令实操体验
汇编语言 1. mov操作 1.1 mov移动值 mov指令把右边的值移动到左边 mount c d:masm c: debug r ax 0034 r 073f:0100 mov ax,7t1.2 mov移动寄存器的值 把右边寄存器的值赋值给左边的寄存器 a 073f:0105 mov bx,axt1.3 mov高八位(high)和低八位&am…...
计算机设计大赛 深度学习机器视觉车道线识别与检测 -自动驾驶
文章目录 1 前言2 先上成果3 车道线4 问题抽象(建立模型)5 帧掩码(Frame Mask)6 车道检测的图像预处理7 图像阈值化8 霍夫线变换9 实现车道检测9.1 帧掩码创建9.2 图像预处理9.2.1 图像阈值化9.2.2 霍夫线变换 最后 1 前言 🔥 优质竞赛项目系列,今天要分…...
中间件安全(概述)有中间件的各类链接和官网信息和漏洞库以及配置问题和开源工具
分类主要包括Apache、IIS、Tomcat、weblogic、websphere、Jboss等相关的技术知识和实践。 以Apache为例讲一讲如何保证中间件安全 中间件安全是指保护中间件软件和服务的安全性,防止被恶意攻击或者滥用。中间件软件是指在操作系统和应用程序之间提供通信和集成功能…...
Unity铰链四杆机构设计和运动仿真
一、效果图 设定好各边长度和转速后,点击【设置并启动】,自动生成一个机构模型,并按照原理进行运转 二、铰链四杆机构介绍 机架:A和D是固定位置,叫做机架。 曲柄:B点绕A点旋转,构成曲柄。 连…...
Python爬虫——解析常用三大方式之Xpath
目录 Xpath 安装xpath 安装lxml库 导入lxml库 解析本地文件 etree.parse() 解析服务器响应文件 etree.HTML() xpath基本语法 小案例:获取百度首页的百度一下 大案例:爬取站长素材图片 总结 Xpath 安装xpath 首先要学会安…...
C#判断DataTable1 A列的集合是否为DataTable2 B列的集合的子集
DataSet ds2 (DataSet)res2.Anything; // 检查 集合B是否为集合A的子集 var table1MaterialCodes ds.Tables[2].AsEnumerable().Select(row > row["Code"]).ToList(); //DataSet1 表Code列集合A var table2MaterialCodes ds2.Tables[0].AsEnumerable().Selec…...
VirtualBox 桥接网卡 未指定 “未能启动虚拟电脑Ubuntu,由于下述物理网卡未找到:”
解决办法,安装虚拟网卡,win11查找方式:控制面板→网络和共享中心→更改适配器设置 此时出现下面情况就算安装成功 但是如果报错:找不到指定的模块 则按下面步骤删除干净垃圾重新上面操作 先安装CCleaner, 链接:CCleaner Makes Y…...
基于yolov5的电瓶车和自行车检测系统,可进行图像目标检测,也可进行视屏和摄像检测(pytorch框架)【python源码+UI界面+功能源码详解】
功能演示: 基于yolov5的电瓶车和自行车检测系统_哔哩哔哩_bilibili (一)简介 基于yolov5的电瓶车和自行车检测系统是在pytorch框架下实现的,这是一个完整的项目,包括代码,数据集,训练好的模型…...
vscode如何远程到linux python venv虚拟环境开发?(python虚拟环境、vscode远程开发、vscode远程连接)
文章目录 1. 安装VSCode2. 安装扩展插件3. 配置SSH连接4. 输入用户名和密码5. 打开远程文件夹6. 创建/选择Python虚拟环境7. 安装Python插件 Visual Studio Code (VSCode) 提供了一种称为 Remote Development 的功能,允许用户在远程系统、容器或甚至 Windows 子系统…...
蓝桥杯第十二届电子类单片机组程序设计
目录 前言 蓝桥杯大赛历届真题_蓝桥杯 - 蓝桥云课(点击查看) 单片机资源数据包_2023(点击下载) 一、第十二届比赛原题 1.比赛题目 2.题目解读 蓝桥杯第十四届电子类单片机组程序设计_蓝桥杯单片机哪一届最难-CSDN博客 二、…...
基于springboot+vue的工作流程管理系统
博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战,欢迎高校老师\讲师\同行交流合作 主要内容:毕业设计(Javaweb项目|小程序|Pyt…...
NVIDIA Profile Inspector导入导出功能:3分钟掌握游戏配置备份与分享
NVIDIA Profile Inspector导入导出功能:3分钟掌握游戏配置备份与分享 【免费下载链接】nvidiaProfileInspector 项目地址: https://gitcode.com/gh_mirrors/nv/nvidiaProfileInspector 还在为每次重装系统后需要重新配置显卡游戏设置而烦恼吗?NV…...
告别Dummy Output!Ubuntu 22.04声音与蓝牙问题一站式修复指南(PipeWire/PulseAudio实战)
Ubuntu 22.04音频与蓝牙问题终极解决方案:从诊断到修复全流程 当你兴奋地打开Ubuntu 22.04准备享受音乐或进行视频会议时,"Dummy Output"这个令人沮丧的提示突然出现,或者蓝牙耳机频繁断连——这种体验确实令人抓狂。作为长期使用L…...
OpenClaw多模型切换:Qwen3-14b_int4_awq与其他本地模型的协同使用
OpenClaw多模型切换:Qwen3-14b_int4_awq与其他本地模型的协同使用 1. 为什么需要多模型协同 在我的自动化工作流实践中,单一模型往往难以满足所有场景需求。比如处理代码生成任务时,我需要模型具备较强的逻辑推理能力;而在撰写自…...
AXI基础知识学习
1、AXI通道主从之间5个通信通道:写操作使用如下通道:(1)主——>从,主使用AW通道发送写地址,主使用W通道发送数据;(2)从——>主,写操作完成之后…...
电容是什么?一个“快充快放”的微型充电宝卣
一、前言:什么是 OFA VQA 模型? OFA(One For All)是字节跳动提出的多模态预训练模型,支持视觉问答、图像描述、图像编辑等多种任务,其中视觉问答(VQA)是最常用的功能之一——输入一张…...
如何快速上手cxmooc-tools:5分钟搞定三大网课平台自动刷课
如何快速上手cxmooc-tools:5分钟搞定三大网课平台自动刷课 【免费下载链接】cxmooc-tools 一个 超星(学习通)/智慧树(知到)/中国大学mooc 学习工具,火狐,谷歌,油猴支持.全自动任务,视频倍速秒过,作业考试题库,验证码自动打码(੧ᐛ੭挂科模式,启动) 项目地址: http…...
FireRedASR Pro学习笔记整理实战:录音转文字,复习效率翻倍
FireRedASR Pro学习笔记整理实战:录音转文字,复习效率翻倍 1. 为什么你需要这个语音转文字工具 作为一名经常需要听课、参加会议的学习者和职场人士,我一直在寻找能够提升笔记效率的工具。直到遇到FireRedASR Pro,这个基于工业级…...
告别卡顿与延迟:ET框架帧同步核心技术解密
告别卡顿与延迟:ET框架帧同步核心技术解密 【免费下载链接】ET Unity3D Client And C# Server Framework 项目地址: https://gitcode.com/GitHub_Trending/et/ET 你是否还在为多人对战游戏中的角色瞬移、技能不同步而烦恼?作为Unity3D客户端和C#服…...
DDT4All汽车诊断工具:从零开始掌握专业级ECU调参与故障诊断
DDT4All汽车诊断工具:从零开始掌握专业级ECU调参与故障诊断 【免费下载链接】ddt4all OBD tool 项目地址: https://gitcode.com/gh_mirrors/dd/ddt4all 想要深入了解汽车电子系统却不知从何入手?面对复杂的OBD-II诊断工具感到困惑?DDT…...
Qt桌面应用开发:构建跨平台MogFace-large模型测试工具
Qt桌面应用开发:构建跨平台MogFace-large模型测试工具 最近在做人脸检测相关的项目,经常需要在不同环境下测试MogFace-large模型的效果。每次都要写脚本、调参数、看结果,过程挺繁琐的。我就想,能不能做个简单好用的桌面工具&…...
