nasm示例一:调用syscall打印Hello World
- NASM是基于英特尔 x86 架构的汇编与反汇编工具。
- syscall是x86_64架构中专门做系统调用的指令,可参考syscall
1、示例
global _start section .text _start: mov rax, 1 ; sys_write的系统调用编号为1 mov rdi, 1 ; 文件句柄1对应stdout mov rsi, msg ; 要输出的字符串地址 mov rdx, msglen ; 要输出的字符串长度 syscall ; 系统调用 mov rax, 60 ; sys_exit的系统调用编号为60 xor rdi, rdi ; exit 0 syscall section .data msg: db "Hello, World!", 10 ; ascii表中10对应换行符 msglen: equ $ - msg ; $ 等于当前行开头的地址
nasm -felf64 foo.asm && ld -o foo foo.o
运行结果 [root@localhost nasm]# ./foo Hello, World!
2、代码解释
2.1、syscall
Syscall # | Param 1 | Param 2 | Param 3 | Param 4 | Param 5 | Param 6 |
---|---|---|---|---|---|---|
rax | rdi | rsi | rdx | r10 | r8 | r9 |
Return value |
---|
rax |
1 common write sys_write 60 common exit sys_exit
sys_write和sys_exit的定义为 asmlinkage long sys_write(unsigned int fd, const char __user *buf, size_t count); asmlinkage long sys_exit(int error_code);
2.2、sys_exit
mov rax, 60 ; sys_exit的系统调用编号为60 xor rdi, rdi ; exit 0 syscall
语句 xor rdi, rdi 将rdi寄存器值设置为0,至于为什么不使用 mov rdi, 0 可参考 Does using xor reg, reg give advantage over mov reg, 0?,程序运行效果为 [root@localhost nasm]# nasm -felf64 foo.asm && ld -o foo foo.o [root@localhost nasm]# ./foo Hello, World! [root@localhost nasm]# echo $? 0
如果修改sys_exit系统调用的参数,那么程序运行的退出结果也会发生变化,如修改为 mov rdi, rax mov rax, 60 ; sys_exit的系统调用编号为60 syscall
则程序退出码为sys_write的返回值,因为字符串msg长度为14,所以程序运行的退出码也为14 [root@localhost nasm]# nasm -felf64 foo.asm && ld -o foo foo.o [root@localhost nasm]# ./foo Hello, World! [root@localhost nasm]# echo $? 14
2.3、字符串长度计算
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
基于蚂蚁金服「如何管理好10万行代码」搭建了 Vue 项目架构
此文是对蚂蚁金服文章的解读,所以要看懂此文一定要先去看原文:如何管理好10万行代码的前端单页面应用。 当时看到蚂蚁金服这篇文章有点茅塞顿开,只不过他们是基于 React 技术栈开发的,但是架构是一种思想,不区分语言不区分框架的,所以我相信这套架构一定可以应用到 Vue 项目中。废话不多说,直接进入正文。 同一“页面”内的模块再划分 这里意思是每个页面划分为 MVC 结构。那么如何用代码提现 MVC 结构呢。对于 Vue 项目中,难点在于 MC 两层。最后小组讨论用 Vuex 来架构 MC 两层,如下图所示。 领域模型 领域模型是指可跨模块复用的公共数据,所以我们也用 Vuex 来架构它,存放目录如下。 视图型组件和容器型组件 这一点要在 Vue 中实现其实也很好做,请看这篇文章。但是我们这边基于业务考虑,暂时觉得没必要弄得这么细,所以通用业务组件这一块,在我们 Vue 项目架构就没采用视图和容器这种组合方式了。 跨模块通信 为了保证模块的纯粹性,所以跨模块通信采用中介者模式来解耦。我们建立了一个 pageTalk 目录用中介者模式来处理跨模块通信。 总结 以上便是我们基于蚂蚁这套架构实...
- 下一篇
SpringCloud微服务实战(三)-服务注册与发现
订单服务源码https://github.com/Wasabi1234/SpringCloud_OrderDemo 商品服务源码https://github.com/Wasabi1234/SpringCloud_ProductDemo 注册中心Eureka Server 新建项目 使用 @EnableEurekaServer 就可以让应用变为Eureka服务器,这是因为spring boot封装了Eureka Server,让你可以嵌入到应用中直接使用 直接运行成功如下 但是不断报异常,why? 这是因为该应用虽然是 Server 端,但也同时是 Client 端,也需要一个注册中心将自己注册进去 为消除其异常,修改下配置 配置需要注册的地址,也就是往自己身上注册 通过观察源码,知道其实是一个 map, 所以配置如下 启动仍旧报错,其实正常问题,因为服务端自己又是 Server, 又是 Client, 服务端未启动完成时,客户端肯定是无法找到服务端的 但是 eureka 的服务端/客户端采用心跳通信方式 可看到地址已随配置被改变 接下来配置实例名 实例名被修改成功 但是该应用本身就是个...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- Hadoop3单机部署,实现最简伪集群
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装