首页 > 编程语言 >汇编语言简易教程(12):系统服务

汇编语言简易教程(12):系统服务

时间:2024-04-13 17:56:21浏览次数:26  
标签:文件 教程 12 rbx 汇编语言 equ mov SYS rdi

汇编语言简易教程(12):系统服务

应用程序必须使用操作系统执行许多操作。 此类操作包括控制台输出、键盘输入、文件服务(打开、读取、写入、关闭等)、获取时间或日期、请求内存分配等

访问系统服务是应用程序请求操作系统执行某些特定操作(代表进程)的方式。 更具体地说,系统调用是执行进程和操作系统之间的接口

本节介绍如何使用一些基本的系统服务调用。

系统调用

系统服务调用在逻辑上类似于调用函数,其中函数代码位于操作系统中。 该功能可能需要权限才能操作,这就是为什么必须将控制权转移到操作系统的原因

调用系统服务时,参数放置在标准参数寄存器中。系统服务通常不使用基于堆栈的参数。 这将系统服务的参数限制为六 (6) 个, 一般来说这不是一个严重的限制.

如果需要任何参数,则系统服务的参数将放在 RDI、RSI、RDX、R10、R8 和 R9 寄存器中(按此顺序)。 下表显示了与标准调用约定一致的参数位置

image

设置调用代码和任何参数后,将执行 syscall 指令。 系统调用指令将暂停当前进程并将控制权转移到操作系统,操作系统将尝试执行 rax 寄存器中指定的服务。 当系统服务返回时,该过程将恢复.

控制台输出

将字符输出到控制台的系统服务是系统写入 (SYS_write)。与高级语言一样,字符被写入标准输出(STDOUT),即控制台。 STDOUT 是控制台的默认文件描述符。 filedescriptor 已打开,可用于程序(汇编语言和高级语言)

image

参考代码

这部分的代码可以参考注释来阅读, 基本上没有什么难度

section .data
    LF equ 10
    NULL equ 0
    True equ 1
    FALSE equ 0

    EXIT_SUCCESS equ 0

    STDIN equ 0
    STDOUT equ 1
    STDERR equ 2

    SYS_read equ 0
    SYS_write equ 1
    SYS_open equ 2
    SYS_close equ 3
    SYS_fork equ 57
    SYS_exit equ 60
    SYS_create equ 85
    SYS_time equ 201


    message1 db "hello world.", LF, NULL
    message2 db "Enter Answer: ", NULL
    newLine  db LF, NULL


section .text
global _start
_start:
    mov rdi, message1 ; 设置string头地址, 使用rdi存储
    call printString  ; 调用printString 函数


exampleDone: 
    mov rax, SYS_exit 
    mov rdi, EXIT_SUCCESS
    syscall


global printString
printString:
    push rbx       ;因为使用到了rbx的地址, 所以需要压栈, 为后续做准备
    mov rbx, rdi   ;复制rdi到rbx
    mov rdx, 0	   ;将rdx设为0

strCountLoop:
    cmp byte [rbx], NULL 
    je strCountDone		 ; 如果字符为NULL,表示结束, 则直接跳转到结果.
    inc rdx				 ; 增加rdx, 表示的字符串长度
    inc rbx				 ; 增加rbx, 这里表示的是string的位置
    jmp strCountLoop     ; 继续统计

strCountDone:
    cmp rdx, 0           ; 如果rdx == 0, 表示字符串长度为0, 不需要系统调用
    je prtDone	         ; 输出结束

    mov rax, SYS_write   ; 调用sys_write
    mov rsi, rdi	  
    mov rdi, STDOUT

    syscall

prtDone:
    pop rbx
    ret

控制台输入

将字符输出到控制台的系统服务是系统写入 (SYS_write)。与高级语言一样,字符被写入标准输出(STDOUT),即控制台。 STDOUT 是控制台的默认文件描述符。 filedescriptor 已打开,可用于程序(汇编语言和高级语言)。

image

示例代码

section .data
    LF equ 10
    NULL equ 0
    True equ 1
    FALSE equ 0

    EXIT_SUCCESS equ 0

    STDIN equ 0
    STDOUT equ 1
    STDERR equ 2

    SYS_read equ 0
    SYS_write equ 1
    SYS_open equ 2
    SYS_close equ 3
    SYS_fork equ 57
    SYS_exit equ 60
    SYS_create equ 85
    SYS_time equ 201


    STRLEN equ 50
    pmpt db "Enter Text:  ", NULL
    newLine  db LF, NULL

section .bss
    chr resb 1
    inLine resb STRLEN+2



section .text
global _start
_start:
    mov rdi, pmpt
    call printString   ; 打印提示内容

    mov rbx, inLine    ; 将buffer地址计入rbx
    mov r12, 0		   ; 计数r12

readCharacters:
    mov rax, SYS_read  ; 调用sys_read
    mov rdi, STDIN
    lea rsi, byte [chr]; 读取的结果写入chr
    mov rdx, 1		   ; 每次只读取一个字符
    syscall

    mov al, byte [chr] ; 将chr复制到 A 寄存器
    cmp al, LF         ; 判断是否是 \n, 如果是则直接结束.
    je readDone

    inc r12           	; 增加字符统计数
    cmp r12, STRLEN     ; 如果超过最大长度, 则直接结束, 反之继续
    jae readCharacters

    mov byte [rbx], al  
    inc rbx				; 将结果写入 inLine, 同时 ptr = ptr + 1

    jmp readCharacters

readDone:
    mov byte [rbx], NULL
    mov rdi, inLine
    call printString

exampleDone:
    mov rax, SYS_exit
    mov rdi, EXIT_SUCCESS
    syscall


global printString
printString:
    push rbx; -----;  Count characters in string.
    mov rbx, rdi
    mov rdx, 0

strCountLoop:
    cmp byte [rbx], NULL
    je strCountDone
    inc rdx
    inc rbx
    jmp strCountLoop

strCountDone:
    cmp rdx, 0
    je prtDone

    mov rax, SYS_write
    mov rsi, rdi
    mov rdi, STDOUT

    syscall

prtDone:
    pop rbx
    ret

文件打开操作符

为了进行文件操作,如读取和写入,必须首先打开文件。有两种文件打开操作,打开和打开/创建。这两种打开操作在以下章节中有所解释。文件打开后,为了执行文件读取或写入操作,操作系统需要关于文件的详细信息,包括完整状态和当前的读/写位置。这是必要的,以确保读取或写入操作能够从上一次结束的地方继续。

如果文件打开操作失败,将返回一个错误代码。如果文件打开操作成功,将返回一个文件描述符。这适用于高级语言和汇编代码。

操作系统使用文件描述符来访问关于文件的完整信息。关于一个打开文件的完整信息集合存储在一个名为文件控制块(FCB)的操作系统数据结构中。本质上,文件描述符被操作系统用来引用正确的FCB。程序员的责任是确保文件描述符被存储和正确使用。

打开文件

文件打开操作要求文件必须存在才能被打开。如果文件不存在,那就是一个错误。文件打开操作还需要参数标志来指定访问模式。访问模式必须包括以下之一:

  • 只读访问 → O_RDONLY
  • 只写访问 → O_WRONLY
  • 读/写访问 → O_RDWR

必须使用这些访问模式之一。通过与这些模式中的一个进行逻辑或(OR)操作,可以使用额外的访问模式。这可能包括如追加模式(本文未提及)。参见附录C,系统服务以获取关于文件访问模式的附加信息。

文件打开系统服务的参数如下:

  • 寄存器 SYS_open
  • rax 调用代码 = SYS_open (2)
  • rdi 空终止文件名字符串的地址
  • rsi 文件访问模式标志

假设以下声明:

  • SYS_open equ 2;文件打开
  • O_RDONLY equ 000000q;只读
  • O_WRONLY equ 000001q;只写
  • O_RDWR equ 000002q;读写

应当注意,常量是以八进制或基数8定义的(如q后缀所指定)。这与Linux文件权限有时指定的方式相匹配。

系统调用之后,rax寄存器将包含返回值。如果文件打开操作失败,rax将包含一个负值(即<0)。具体的负值提供了遇到错误类型的指示。参见附录C,系统服务以获取关于错误代码的附加信息。典型的错误可能包括无效的文件描述符、文件未找到或文件权限错误。

如果文件打开操作成功,rax包含文件描述符。文件描述符将需要用于进一步的文件操作,并应当被保存。参见关于示例文件读取的部分以获取一个完整的打开文件的例子。

文件打开/创建

文件打开/创建操作将创建一个文件。如果文件不存在,将创建一个新文件。如果文件已经存在,它将被擦除并创建一个新文件。因此,文件以前的内容将丢失。

必须指定一个文件访问模式。由于文件正在被创建,访问模式必须包括在创建文件时将设置的文件权限。这将包括为用户、组或全世界指定读、写和/或执行权限,这是Linux文件权限的典型做法。本例中仅涉及到的权限是对文件用户或所有者的权限。因此,其他用户(即使用其他帐户的用户)将无法访问我们程序创建的文件。参见附录C,系统服务以获取关于文件访问模式的附加信息。

文件打开/创建系统服务的参数如下:

  • 寄存器 SYS_create
  • rax 调用代码 = SYS_create (85)
  • rdi 空终止文件名字符串的地址
  • rsi 文件访问模式标志

假设以下声明:

  • SYS_create qu 85;文件打开
  • O_CREAT equ 0x40
  • O_TRUNC equ 0x200
  • O_APPEND equ 0x400
  • S_IRUSR equ 00400q;所有者,读权限
  • S_IWUSR equ 00200q;所有者,写权限
  • S_IXUSR equ 00100q;所有者,执行权限

文件状态标志“S_IRUSR | S_IWUSR”将允许同时读写,这是典型的。"|" 是逻辑或(OR)操作,因此组合了选择。

如果文件打开/创建操作没有成功,rax寄存器中将返回一个负值。如果文件打开/创建操作成功,将返回一个文件描述符。文件描述符用于所有后续的文件操作。参见关于示例文件写入的部分以获取一个完整的文件打开/创建的示例。

文件读取

image
这个和IO Read是几乎一致的, 不再重复了

文件写入

image

示例

示例的内容太长了, 请看原文吧.

标签:文件,教程,12,rbx,汇编语言,equ,mov,SYS,rdi
From: https://www.cnblogs.com/pDJJq/p/18133135/simple-tutorial-of-assembly-language-12-system-se

相关文章

  • 20211128李杰—— MD5哈希长度延展攻击
    任务描述:在一个使用MD5哈希算法的系统中,管理员使用了一个密钥k和命令cmd的组合来生成每个命令的签名:hash(k||cmd)。你已经获得了一个允许查看文件的命令cmd=viewfile和对应的签名h,但你希望通过哈希长度延展攻击,生成一个新的签名,该签名能够让你执行删除文件的命令(删除文件的命令为......
  • Win11&Win10重装系统教程
    随着时间的推移,我们的电脑系统可能会变得缓慢、不稳定或出现其他问题,这时候重装系统就成为了解决方案之一。但是,对于许多新手小白来说,重装系统可能是一项令人望而生畏的任务。不过,别担心!本文将为您提供一份通俗易懂、内容详实、图文并茂的重装系统指南,让您轻松掌握重装系统的技巧......
  • Python教程:return和yield的区别
    return一直中,每中语言中其没没有很大差别,就不多说了。(shell语言return的是退出状态,可能差别是比较大的)最早看到yield应该是哪们语言用来调整什么线程优先级的,记不清了,不过那里的yield和python中的yield应该功能有区别。一、return和yield的异同共同点:return和yield都用来返回值......
  • 12、web 中间件加固-apache 加固
    1.账号设置1.1.防止webshell越权使用修改httpd.conf:/etc/httpd/conf/httpd.conf或编译路径下/conf/httpd.conf检查程序启动账号和用户组userapache或nobodygroupapache或nobody一般情况下默认用户符合安全要求1.2.非超级用户权限禁止修改apache主目录......
  • Visual Studio Code & Python教程3顶级扩展
    3简介扩展功能非常宝贵。它们有助于提高代码质量,加快开发工作。我们将介绍一些必备的通用扩展。3.1顶级扩展3.1.1Pylance微软的Pylance可以大大提高你的工作效率。Pylance是一款Python语言服务器,它增强了IntelliSense、语法高亮和大量其他功能,为Python开发人员带来了令人......
  • 一种新的姿势:程序try/catch抛出异常之绕过canary pwn121
    一种新的姿势:程序try/catch抛出异常之绕过canary我前面发了不少关于绕过canary的姿势,先总结一下,现在绕过canary的姿势有泄露,爆破,格式化字符串绕过,多线程劫持TLS绕过,stack_smashing,今天介绍一种新的姿势,就是程序处理异常时,如果异常被上一个函数的catch捕获,那么上个函数的rbp就会......
  • EL1205 电子工程实践
    免责声明:本评估简报中提供的信息在发布时是正确的。在不太可能的情况下,任何变化如有必要,将通过电子邮件进行明确沟通,并分发新版评估简报。学年:2023/24评估简介:课程电子工程学士(荣誉)模块代码:EL1205课程名称:电子工程实践简报标题:设计与构建:RS232字符生成器评估类型:课程此评估包包括......
  • SI 2120程序设计图像搜索综合
    工程学院电气学院工程和计算机科学SI2120程序设计范式相似图像搜索综合任务(24%)2024年冬季最多两名学生一组的项目第1部分将于2月16日23:59之前到期第2部分将于3月8日23:59之前到期第3部分和第4部分将于4月22日23:59之前到期延迟分配政策:每延迟一天减10%。例如:一个项目周五晚上......
  • CH9120网口配置协商及说明
     目录(1)结构体定义(2)通信流程详解1.通信方式2.通信结构体3.通信过程①搜索②获取配置③配置模块④恢复出厂设置(3)说明文档连接 CH9120上位机搜索配置协议(1)结构体定义1#defineMAX_DEVICE_CNT20......
  • 20240412打卡
    第七周第一天第二天第三天第四天第五天第六天第七天所花时间5h5h1h6h1h代码量(行)469493155497博客量(篇)11111知识点了解完成了python大作业,花费两天完成音频处理工具完成学习记录app地铁系统json数据转对象地铁查询后端完成蓝桥......