编写程序调用元神操作系统的API

news2024/11/15 11:15:21

1. 背景

本文介绍了元神操作系统API的调用,并详细介绍了“调用元神系统API读取磁盘扇区”程序的编写以及测试结果。

2. 方法

(1)元神操作系统API的调用方法

元神操作系统0.4版beta4开始提供了对OS功能的调用,调用相关的定义如下:

OS_API equ 0x00030C16
API_PARAM equ 0x03000000

其中,OS_API定义的是API调用的入口,设置好要调用的API类型及其参数之后,直接call该入口即可实现系统API调用。而要调用的API类型及参数则由API_PARAM指定,其指定的格式如下:

PARAM_1: 要调用的API类型
PARAM_2:传给API的参数个数
PARAM_3:传给API的第一个参数
PARAM_4:传给API的第二个参数(如果有的话),依次类推

其中,每个PARAM都是4字节大小。例如,要读取优盘的第一个扇区,其API_PARAM设置如下:

PARAM_1 = API_READ_USB_SECTOR
PARAM_2 = 2
PARAM_3 = 0
PARAM_4 = 扇区数据存放地址

由此可知,要调用的API是“读取优盘扇区”,传递2个参数给该API,第一个参数为0(表示读取第一个扇区,即0号扇区),第二个参数是接收扇区数据的内存地址。

(2)编写程序读取优盘的0号扇区

本例使用汇编语言编写,代码如下所示:

use32

START:
	pusha
	
	
	call demo_read_usb
	
	popa
	iret

include 'api_def.inc'

cursor_x equ 0x02004B10
cursor_y equ 0x02004B12
OS_API equ 0x00030C16
API_PARAM equ 0x03000000

sector_buff: times 512 db 0
demo_read_usb:
	pusha
	mov edi, API_PARAM
	mov dword [fs:edi], API_READ_USB_SECTOR
	mov dword [fs:edi+4], 2		;2 parameters
	mov dword [fs:edi+8], 0		;param_1: sector no.
	xor eax, eax
	mov ax, ds
	shl eax, 4
	add eax, sector_buff
	mov dword [fs:edi+12], eax	;param_2: start address of buffer to store result

	call pword [fs:OS_API]
	
	mov eax, 512
	movzx ebx, word [fs:cursor_y]
	movzx ecx, word [fs:cursor_x]
	mov esi, [fs:edi+12]
	call print_bytes_hex
	
	add word [fs:cursor_y], 20

	popa
	ret


;print hex bytes
;input:
;	eax: byte count to print
;	ebx: y coordinate to print (from 0)
;	ecx: x coordinate to print (from 0)
;	esi: buffer storing data to print
print_bytes_hex:
	pusha
	imul edi,ebx,80*2
	add edi,ecx
	add edi,ecx
	
	mov ecx,eax
	mov ah,0x0F		;should use edx in stack
 .next_char:
	mov bl,byte [fs:esi]
 .hex_char:
	mov al,bl
	and al,0x0F
	add al,0x30
	cmp al,0x39
	jbe .num_char
	add al,'A'-0x30-10
 .num_char:
	mov [gs:edi+2],ax
	shr ebx,4
	mov al,bl
	and al,0x0F
	add al,0x30
	cmp al,0x39
	jbe .num_char2
	add al,'A'-0x30-10
 .num_char2:
	mov [gs:edi],ax
	mov al,' '
	mov [gs:edi+4],ax
	add edi,6
	inc esi
	loop .next_char
	
	popa
	ret

将以上代码保存为DEMO.ASM,编译生成DEMO.BIN,并将该可执行文件复制到装有元神操作系统的U盘中,之后用该U盘开机进入元神系统并输入命令“ZX  DEMO.BIN”执行该程序如下:

这里以二进制显示的就是U盘0号扇区的数据,对应到示例程序,语句“call pword [fs:OS_API]”完成的就是系统API调用,该语句之前的部分是对调用参数的设置,之后的部分是对调用结果的输出显示。参数设置部分在本章开头部分已经进行介绍,需要补充的是数据存储地址,该地址需要是全局地址,而非本应用程序的地址,所以将其和数据段寄存器DS的值结合在一起,之后再传给参数。

至于最后的输出显示函数print_bytes_hex,其以十六进制字节序列的形式完成输出,每两个字节之间以空格分隔。要输出的字节数通过EAX寄存器传递,本例指明要输出512字节,因为一个扇区的大小为512字节。将显示结果向下滚动查看完整的扇区数据如下:

从该图能看出,读出的的确是0号扇区的数据,其最后两个字节“55 AA”是该扇区的结束标志。

另外,本例中涉及到的文件api_def.inc是用于定义元神操作系统API类型的,目前为止数据较少,如下所示:

API_READ_USB_SECTOR	    equ	0x00000003
API_READ_DISK_SECTOR	equ	0x00000004

第一句表示读取优盘的扇区,第二句表示读取硬盘/磁盘的扇区。

(3)编写程序读取磁盘的0号扇区

本例展示读取硬盘/磁盘的第一个扇区的API调用,其大部分和上例相同,含有差异的主要部分如下所示:

use32


START:
	pusha
	
	call demo_read_disk
	
	popa
	iret

include 'api_def.inc'

cursor_x equ 0x02004B10
cursor_y equ 0x02004B12
OS_API equ 0x00030C16
API_PARAM equ 0x03000000

sector_buff: times 512 db 0

demo_read_disk:
	pusha
	mov edi, API_PARAM
	mov dword [fs:edi], API_READ_DISK_SECTOR
	mov dword [fs:edi+4], 2		;2 parameters
	mov dword [fs:edi+8], 0		;param_1: sector no.
	xor eax, eax
	mov ax, ds
	shl eax, 4
	add eax, sector_buff
	mov dword [fs:edi+12], eax	;param_2: start address of buffer to store result

	call pword [fs:OS_API]
	
	mov eax, 512
	movzx ebx, word [fs:cursor_y]
	movzx ecx, word [fs:cursor_x]
	mov esi, [fs:edi+12]
	call print_bytes_hex
	
	add word [fs:cursor_y], 20

	popa
	ret

由于本例和上例都是读取磁盘扇区,区别仅在于一个读的是U盘、另一个读的是硬盘,所以仅改变API类型即可,本例将类型设置为API_READ_DISK_SECTOR。

如上例那般编译运行程序,结果如下图所示:

和上例一样,本例扇区数据的最后两个字节仍然是“55 AA”。两例都是读取磁盘的第一个扇区,但U盘是没有分区的,而硬盘是经过分区的,所以可以看到本例含有两个分区表项,具体内容可以查阅MBR、DBR、分区表等的详细文章阅览。

3. 总结

元神操作系统API的调用方式比较统一,调用接口设计为唯一的,将API及其参数都作为数据进行传递,改动起来比较灵活,而且不会因为过量的参数导致堆栈溢出。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

整形提升

有任何不懂的问题可以评论区留言,能力范围内都会一一回答 整型提升 (Integral Promotion)是指在计算机编程中,当不同类型的整数类型进行运算时,较小类型的整数会被自动转换为更大类型的整数,以确保运算的正确进行。这种类型转换主…

【生日视频制作】公司前台接待文化形象墙字写字楼办公室AE模板修改文字软件生成器教程特效素材【AE模板】

公司前台形象墙写字楼办公室生日视频制作教程AE模板修改文字素 怎么如何做的【生日视频制作】公司前台接待文化形象墙字写字楼办公室AE模板修改文字软件生成器教程特效素材【AE模板】 生日视频制作步骤: 安装AE软件下载AE模板把AE模板导入AE软件修改图片或文字渲染…

STM32寄存器操作、模板构建

目录 外设寄存器查找 ① 名称② 偏移地址③ 寄存器位表④ 位功能说明寄存器基本操作 C语言的置位和清零 具体方法设置GPIO流程给寄存器赋值带参数宏STM32F1xx 芯片识别存储器映射寄存器映射让GPIOB端口的16个引脚输出高电平,要怎么实现?STM32寄存器映射…

探索大语言模型在DNA 分析到表达预测以及生物信息学应用

概述 论文地址:https://arxiv.org/abs/2401.04155 随着 OpenAI 的 GPT-X 和谷歌的 BERT 等大规模语言模型的出现,自然语言处理领域得到了飞速发展。这些先进的模型将理解和生成人类语言的能力发挥到了极致,彻底改变了日常交流和业务流程。 …

premiere2023暴力压缩视频

目录 1. 需求说明2. 压缩流程 1. 需求说明 要将三段视频拼接起来,时长超过了1h,然后压缩到200M以内的视频。 这是三段视频的信息: 合并三个视频文件意味着总时长增加了。较长的视频文件通常也会更大,即使比特率相同。 当我把三段…

分治算法的介绍与原理解析

文章目录 1.分治算法1.1 如何判断分治问题1.2 为什么通过分治可以提升效率1.2.1 操作数量的优化1.2.2 并行计算优化 1.3 分治常见应用 1.分治算法 分治(divide and conquer),全称是分而治之,是一种非常重要且非常常见的算法。分治…

【SQL基础】【牛客网】子查询、联表查询

子查询 基本语法 子查询,也称为嵌套查询,是在另一个 SQL 语句中嵌套的查询。子查询的结果可以被主查询(外部查询)使用,用于满足更复杂的数据检索需求。 例如: SELECT employee_name FROM employees WHE…

优化的热点分析与异常值分析:让数据分析更加便捷高效

热点分析作为一种常用的空间统计方法,能够帮助我们识别地理空间中的热点和冷点区域,即那些高值或低值集中出现的地方。而优化的热点分析进一步简化了这一过程,使用户无需手动调整参数即可获得可靠的结果。此外,异常值分析则专注于…

学习记录——day35 数据库 sqlite3

目录 一、安装sqlite3数据库以及sqlite3函数库 二、数据库的结构 三、常用数据库类型 1、sqlite3 2、mysql 四、sqlite3数据库的使用 1、打开数据库 2、sqlite3数据库中指令的使用 1)界面指令 2)操作指令 3)大小写敏感性 3、创建表…

基于STM32开发的智能家居灯光控制系统

目录 引言环境准备工作 硬件准备软件安装与配置系统设计 系统架构硬件连接代码实现 系统初始化灯光控制逻辑传感器数据采集Wi-Fi通信与远程控制应用场景 家庭智能灯光管理办公室与商业环境的智能照明常见问题及解决方案 常见问题解决方案结论 1. 引言 随着智能家居技术的普及…

尚品汇-购物车列表、临时用户购物车与登录用户购物车合并实现(三十七)

目录: (1)功能—展示购物车列表 (2)在web-all添加前端实现 (3)功能--合并购物车 (1)功能—展示购物车列表 购物车列表接口:CartService /*** 通过用户Id …

Ps:高速缓存机制

Photoshop 的高速缓存 Cache技术利用缓存和分块的方法处理图像数据,通过合理设置高速缓存级别和拼贴大小,可以有效地提升软件在处理图像时的性能。 Ps菜单:编辑/首选项 Edit/Preferences “首选项”中提供了 8 种高速缓存级别。 增加高速缓存…

一文带你读懂反向代理服务器

文章目录 一、什么是反向代理?二、反向代理的主要特点2.1 负载均衡2.2 隐藏IP2.3 响应加速2.4 过滤非法请求 三、反向代理的应用场景3.1 负载均衡3.2 SSL/TLS终止3.3 日志记录3.4 URL重写3.5 API网关3.6 CDN服务 四、区分反向代理和正向代理4.1 从工作原理上4.2 从安…

Memcached:单节点、集群案例;概念、工作原理

目录 案例前置知识点 Memcached 概念 部署场景 Memcached常用架构 流程 Memcached Memcached API 数据存储方式 数据过期方式 LRU Lazy Expiration Memcached缓存机制 Memcached路由算法 求余数hash算法 一致性hash算法 Memcached分布式 案例 单节点Memcach…

2024电工杯B题完整论文

大学生平衡膳食食谱的优化设计及评价 摘要 大学阶段是学生获取知识和身体发育的关键时期,也是形成良好饮食习惯的重要阶段。然而,当前大学生中存在饮食结构不合理和不良饮食习惯的问题,主要表现为不吃早餐或早餐吃得马虎,经常食…

如果这10道关于数据库的测试题你都会,面试必过!

一、什么是数据库测试? 数据库测试也称为后端测试。数据库测试分为四个不同的类别。 [if !supportLists] [endif]数据完整性测试 [if !supportLists] [endif]数据有效性测试 [if !supportLists] [endif]数据库相关的性能 [if !supportLists] [endif]测试功能&a…

【数据结构】二叉树顺序结构之堆的实现

1. 前言 普通的二叉树是不适合用数组来存储的,因为可能会存在大量的空间浪费。而完全二叉树更适合使用顺序结构存储。现实中我们通常把堆 ( 一种二叉树 ) 使用顺序结构的数组来存储,需要注意的是这里的堆和操作系统 虚拟进程地址空间中的堆是两回事&…

【Python机器学习】NLP分词——利用分词器构建词汇表(二)——点积

在自然语言处理中将会有多处用到点积,点积也被称为内积,这是因为两个向量(每个向量中的元素个数)或矩阵(第一个矩阵的行数和第二个矩阵的列数)的“内部”维度必须一样,这种情况下才能相乘。这个…

【Docker】以思源笔记为例,谈谈什么是端到端加密

本文首发于 ❄️慕雪的寒舍。 链滴(思源笔记社区)里面有不少老哥似乎不太了解思源使用的端到端加密功能,以及云同步功能背后的机制。本文将以思源笔记为例,谈谈什么是端到端加密,以及思源的同步功能中用到了什么计算机…

JavaSE基础(12)——文件、递归、IO流

1、IO流 Input:输入,写数据,数据从磁盘加载到内存(程序)中。 Output:输出,读数据,数据从内存(程序)存储到磁盘中。 流:不管是读还是写&#xf…