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

在元神操作系统中获取动态内存

1. 背景

很多应用程序中都会动态申请内存用于存储中间数据、文件数据等。在元神操作系统中可以通过API调用来申请动态内存,获取可用的内存起始地址和内存大小。

2. 方法

(1)编写程序

本例通过调用API_ALLOC_MEMORY这个API来获取可用内存的起始地址和内存大小,代码如下所示:

use32

START:
	pusha
	
	call demo_mem_alloc
	
	popa
	iret

include 'api_def.inc'

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

demo_mem_alloc:
	pusha
	
	mov edi, API_PARAM
	mov dword [fs:edi], API_ALLOC_MEMORY
	mov dword [fs:edi+4], 0
	call pword [fs:OS_API]
	
	mov eax, [fs:edi+8]
	movzx ebx, word [fs:cursor_y]
	movzx ecx, word [fs:cursor_x]
	call print_dword		;print start address of memory for allocation
	
	mov eax, [fs:edi+12]
	add ecx, 10
	call print_dword		;print memory size for allocation
	
	add word [fs:cursor_y], 1
	
	popa
	ret
	
;print dword value
;input:
;	eax: value to print
;	ebx: y position to print
;	ecx: x position to print
print_dword:
	pusha
	
	imul edi, ebx, 80*2
	add edi, ecx
	add edi, ecx
	add edi, 14
	mov ecx, 8
	mov edx, eax
	mov ah, 0x0F
 .next_char:
	mov al, dl
	shr edx, 4
	and al, 0x0F
	cmp al, 10
	jb .num
	add al, 'A'-10
	jmp .out
 .num:
	add al, 0x30
 .out:
	mov word [gs:edi], ax
	sub edi, 2
	loop .next_char
	
 .end:
	popa
	ret

代码中先设置系统调用参数:将API类型设置为API_ALLOC_MEMORY,API输入参数个数设置为0。然后用call指令调用API获取动态内存,并将内存起始地址和可用字节数打印到屏幕上。代码中对API类型的定义如下所示:

API_ALLOC_MEMORY	equ	0x00000100

(2)运行程序

将上述代码保存为demo.asm,然后用FASM进行编译生成demo.bin文件,之后将其复制到装有元神操作系统的U盘的根目录,用该U盘开机进入元神操作系统,使用命令ZX执行demo.bin,如下图所示:

由图可见,获取的内存起始地址为0x10202000,可用内存大小为0x0F47D000,即256364544字节,大约256MB的内存空间。之后,在自己的程序中可以自行管理这块内存,不必再次动态申请内存。

3. 总结

本文示例通过元神操作系统的API调用来从元神操作系统中动态申请内存块,获取可用内存块的起始地址和大小(以字节为单位),之后可以在自己的程序中自行组织、维护、管理这块内存,无需多次反复申请内存。


http://www.kler.cn/a/292015.html

相关文章:

  • 魔方和群论
  • 机器学习-36-对ML的思考之机器学习研究的初衷及科学研究的期望
  • 【大数据学习 | HBASE高级】hive操作hbase
  • 实用且免费的 IP 地域查询 API 接口推荐
  • 从北美火到中国,大数据洞察品牌“STANLEY”的突围之路
  • 【大数据测试 Hive数据库--保姆级教程】
  • HarmonyOS开发实战( Beta5版)AOT编译使用指南
  • 电脑知识:如何恢复 Word、媒体和存档文件?
  • 在线演示文稿应用PPTist本地化部署并实现无公网IP远程编辑PPT
  • 客户端时间和服务器时间的区别
  • GO环境安装
  • AIoTedge IoT平台替代网关、PLC和HMI,实现智慧农业大棚控制
  • opencv 实现两个图片的拼接去重功能
  • 【软件设计】常用设计模式--策略模式
  • linux中vim常用命令大全
  • IDEA Maven 源修改为国内阿里云镜像的正确方式
  • 如何衡量一个算法的好坏
  • netty-socketio和Socket.IO实现网页在线聊天功能
  • html 页面引入 vue 组件之 http-vue-loader.js
  • 2024 年高教社杯全国大学生数学建模竞赛题目-A 题 “板凳龙” 闹元宵
  • leetcode:3174 清除数字
  • OpenGL/GLUT实践:实现反弹运动的三角形动画与键盘控制(电子科技大学信软图形与动画Ⅱ实验)
  • Golang | Leetcode Golang题解之第389题找不同
  • 华三防火墙第-安全策略02
  • AI+RuoYi
  • Ubuntu环境的MySql下载安装