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

汇编教程 最终:文件管理与内存管理

目录

文件管理

打开一个现有文件

从文件读取

写入文件

关闭文件

更新文件

内存管理


文件管理

实际上我们已经做过了文件管理了。标准输出标准输入以及标准错误的文件描述符实际上就是文件管理的特殊文件描述符。我们现在只需要强调的是获取文件描述符使用的是open系统调用!返回的文件描述符号会放在寄存器eax里。使用结束文件需要做的是关闭文件。提供关闭的文件描述符即可。

与文件处理相关的系统调用:

%eax名称%ebx%ecx%edx
3sys_readunsigned intchar *size_t
4sys_writeunsigned intconst char *size_t
5sys_openconst char *intint
6sys_closeunsigned int--
8sys_creatconst char *int-
19sys_lseekunsigned intoff_tunsigned in

相应的,一些标准的打开流程:

打开一个现有文件

要打开现有文件,请执行以下任务-

  • 将系统调用sys_open()5放入EAX寄存器中。

  • 将文件名放在EBX寄存器中。

  • 将文件访问模式放入ECX寄存器。

  • 将文件权限放入EDX寄存器中。

  • 系统调用在EAX寄存器中返回已创建文件的文件描述符,如果发生错误,则错误代码在EAX寄存器中。

在文件访问模式中,最常用的是:只读(0),仅写(1)和读写(2)。

从文件读取

要从文件读取,请执行以下任务-

  • 将系统调用sys_read()3放入EAX寄存器中。

  • 将文件描述符放入EBX寄存器。

  • 将指针放到ECX寄存器中的输入缓冲区。

  • 将缓冲区大小(即要读取的字节数)放入EDX寄存器中。

  • 系统调用返回在EAX寄存器中读取的字节数,如果发生错误,则错误代码在EAX寄存器中。

写入文件

要写入文件,请执行以下任务-

  • 将系统调用sys_write()编号4放入EAX寄存器中。

  • 将文件描述符放入EBX寄存器。

  • 将指针放到ECX寄存器中的输出缓冲区。

  • 将缓冲区大小(即要写入的字节数)放入EDX寄存器中。

  • 系统调用返回写入EAX寄存器的实际字节数,如果发生错误,则错误代码位于EAX寄存器中。

关闭文件

要关闭文件,请执行以下任务-

  • 将系统调用sys_close()编号6放入EAX寄存器中。

  • 将文件描述符放入EBX寄存器。

  • 发生错误时,系统调用将返回EAX寄存器中的错误代码。

更新文件

要更新文件,请执行以下任务-

  • 将系统调用sys_lseek()编号19放入EAX寄存器中。

  • 将文件描述符放入EBX寄存器。

  • 将偏移值放入ECX寄存器中。

  • 将偏移量的参考位置放入EDX寄存器中。

参考位置可以是:

  • 文件开头-值0

  • 当前位置-值1

  • 文件结尾-值2

发生错误时,系统调用将返回EAX寄存器中的错误代码。

; --------------------------------------------------
;   Program written in 10.25 2024
;   Author:             Charlie chen
;   Functionality:      using files
; --------------------------------------------------
​
; fast use of common value
%define MY_SYS_OPEN     5
%define MY_SYS_CLOSE    6
%define MY_SYS_WRITE    4
%define MY_SYS_READ     3
%define MY_STDOUT       1
​
; print string in a simple way
%macro PRINT_STRING 2mov edx, %2mov ecx, %1mov ebx, MY_STDOUTmov eax, MY_SYS_WRITEint 0x80
%endmacro
​
section .datafile_name db "demo.txt"file_name_new db "copy.txt"
​
section .bssshow_msg_from_file resb 20
​
section .textglobal _start
_start:; open file with read only and all access for usmov eax, MY_SYS_OPENmov ebx, file_namemov ecx, 0mov edx, 0777int  0x80
​; readmov ebx, eaxmov eax, MY_SYS_READmov ecx, show_msg_from_filemov edx, 20int 0x80
​PRINT_STRING show_msg_from_file, 20
​mov ebx, 0mov eax, 1int 0x80
​
​

内存管理

sys_brk的调用号是45,我们返回的地址放在了ebx当中!而后使用即可!

section .bssbuffer resb 256   ; 预留256字节的空间
​
section .textglobal _start
​
_start:; 获取当前程序段的末尾地址mov eax, 45       ; sys_brkxor ebx, ebx     ; 传递NULL以获取当前地址int 0x80         ; 调用系统
​; 保存当前地址mov ebx, eax
​; 分配256字节add ebx, 256mov eax, 45       ; sys_brkint 0x80         ; 调用系统
​; 这里可以使用ebx地址进行操作
​; 释放内存mov eax, 45       ; sys_brkmov ebx, eax      ; 传递当前地址int 0x80         ; 调用系统
​; 退出程序mov eax, 1        ; sys_exitxor ebx, ebx      ; 返回值0int 0x80


http://www.mrgr.cn/news/58355.html

相关文章:

  • 一家生物技术企业终止,科创属性可能不足,报告期内专利数猛增
  • jQuery快速填充非form数据
  • 序列的定义与使用
  • 提升数据管理效率:ETLCloud与达梦数据库的完美集成
  • 【最全基础知识2】机器视觉系统硬件组成之工业相机镜头篇--51camera
  • 线性可分支持向量机的原理推导 线性分隔超平面关于任意样本点 (x_i,y_i)的函数间隔 公式解析
  • Jvm中的堆和栈
  • Docker容器的基础镜像:构建现代应用程序的基石
  • 讲一讲AOP的原理,AOP在哪些场景下会失效?
  • openresty安装
  • Ubuntu 下安装 Nginx
  • NativeCrash 率从万分位降到十万分位,我做了这几件事...
  • 对比两个el-table,差异数据突显标记
  • springboot仓库管理系统-计算机毕业设计源码19585
  • 集群分发脚本
  • WUP-MY-POS-PRINTER 旻佑热敏打印机票据打印uniapp插件使用说明
  • 被面试官怼了,对nacos的原理都不理解,还多年的微服务工作经验?
  • CTF-RE 从0到N 1-1-1 开始之前-c函数手册
  • 一年四起供应链投毒事件的幕后黑手
  • 储能蓝海:技术革新与成本骤降引爆市场
  • python_删除二维列表的制定列
  • 商汤科技裁员动真格,战略转型组织大变革
  • 基于STM32设计的智能鱼缸(蓝牙版)
  • Vue Router 如何配置 404 页面?
  • GFF: Gated Fully Fusion for Semantic Segmentation门控融合语义分割-论文阅读笔记
  • 华为OD机试 - 字符串最后一个单词的长度(Java 2024 E卷 100分)