操作系统实战45讲之汇编语言
创始人
2024-05-30 15:36:38
0

先来一段能够输出“Hello, World”的汇编代码:

section .datastringShowing db "Hello, World",10,0stringShowingLength equ 13
section .bss
section .textglobal mainmain:push rbpmov rbp,rspmov rax,1mov rdi,1mov rsi,stringShowingmov rdx,stringShowingLengthsyscallmov rsp,rbppop rbpmov rax,60mov rdi,0syscall

在这里插入图片描述

nasm -f elf64 -g -F dwarf helloworld.asm -o helloworld.o使用64位汇编器进行汇编。
gcc -o helloworld helloworld.o进行链接。
./helloworld进行执行。
下边进行代码的分解:

push rbp
mov rbp,rsp

这两段代码相当于把父程序调用子程序的栈保存下来,方便再回到父程序。

mov rax,1

寄存器 rax 中存放系统调用号,在其他情况下,返回值也存放在 eax 中。这段汇编代码表明让rax=1,表明会使用write(int fd,char *buf,int n)系统调用,可以看到这个系统调用需要传入3个参数,第一个参数是文件描述符,0表示标准输入,1表示标准输出,2表示标准错误;第2个参数是读入的字符数组;第三个参数是要传输的字节数。

  mov rdi,1mov rsi,stringShowingmov rdx,stringShowingLength

write(int fd,char *buf,int n)系统调用传递参数,当系统调用参数小于等于6个时,参数则必须按顺序放到寄存器rdirsirdxr10r8r9中。当系统调用参数大于6个时,全部参数应该依次放在一块连续的内存区域里,同时在寄存器rbx中保存指向该内存区域的指针。可以看到在这段代码中rdi放入的是文件描述符——1,代表标准输出,rsi中放入的是stringShowing这个字符串的首字母地址,rdx放入的是stringShowing的长度stringShowingLength,为13。

syscall

就是真正系统调用。

mov rsp,rbp
pop rbp

把堆栈还原。

mov rax,60
mov rdi,0
syscall

退出程序,返回给操作系统0。

此文章为3月Day 7学习笔记,内容来源于极客时间《操作系统实战 45 讲》。

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
【PdgCntEditor】解... 一、问题背景 大部分的图书对应的PDF,目录中的页码并非PDF中直接索引的页码...
修复 爱普生 EPSON L4... L4151 L4153 L4156 L4158 L4163 L4165 L4166 L4168 L4...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...