英文原版地址:NASM Assembly Language Tutorials - asmtutor.com

背景知识

汇编语言是基础的。程序员在硬件上拥有的唯一接口是内核本身。为了使用汇编构建有用的程序,我们需要使用内核提供的linux系统调用。这些系统调用是内置在操作系统中的库,提供例如从键盘读取和输出到屏幕的函数。

当你调用一个系统调用,内核将立即暂停你的程序的执行。它将联系必要的驱动需要在硬件上执行你请求的任务然后将控制权还给你的程序。

注:驱动被叫做驱动是因为内核真的用它们去驱动硬件

通过将想要执行的函数号(操作码)存入到EAX寄存器以及将想传给系统调用的参数填充到剩余的寄存器,我们可以在汇编中完成系统调用。一个软件被请求INT命令中断,内核接管然后使用我们的参数从库调用函数。

举个例子,请求一个中断,当EAX寄存器为1时,将调用sys_exit,当EAX寄存器为4时将调用sys_write代替。如果函数需要,EBX,ECX和EDX将作为参数传递。

写代码

首先,我们在 .data 段创建一个变量 'msg' ,在本例中指定它为我们想输出的字符串'Hello World!'。在我们的代码段,我们通过提供一个全局标记 _start 表示程序的入口点,告诉内核从哪开始执行。

我们将使用系统调用sys_write来输出我们的消息到控制台窗口。这个函数在linux系统调用表中的操作码被分配为4。这个函数也带有三个参数,在请求中断来执行任务之前,将它们有序的存入EDX,ECX和EBX三个寄存器中。

传递的参数如下:

  • EDX将被存入字符串的长度(比特数)

  • ECX将被存入我们在 .data 段创建的变量的地址

  • EBX将被存入饿哦们想写入的文件(在本例中为标准化输出STDOUT)

传递参数的数据类型和意义可以再函数的定义中找到。

使用下边的命令编译,链接然后执行这个程序 hello.asm

SECTION .data
msg     db      'Hello World!', 0Ah     ; 指定msg变量为你的消息字符串SECTION .text
global  _start_start:mov     edx, 13     ; 要写入的字节数,字符数加0ahmov     ecx, msg    ; 将消息的内存地址复制ECX寄存器mov     ebx, 1      ; 写到标准输出mov     eax, 4      ; 调用 SYS_WRITE (kernel opcode 4)int     80h

编译命令

nasm -f elf hello.asm

链接命令

ld -m elf_i386 hello.o -o hello

执行命令

./hello

最后会报错 Segmentation fault ,也就是段错误

NASM汇编教程翻译01 第一讲 Hello, World!相关推荐

  1. NASM汇编教程翻译09 第九讲 用户输入

    英文原版地址:NASM Assembly Language Tutorials - asmtutor.com 介绍BSS段 目前为止我们已经用了text段和data段,现在介绍下BSS段.BSS代表以 ...

  2. NASM汇编教程翻译07 第七讲 换行符

    英文原版地址:NASM Assembly Language Tutorials - asmtutor.com 对于像"Hello world"这样的命令行程序,换行符时必不可少的. ...

  3. NASM汇编教程翻译03 第三讲 计算字符串长度

    英文原版地址:NASM Assembly Language Tutorials - asmtutor.com 背景知识 为什么我们需要计算字符串长度? sys_write要求我们传递指向内存中我们想要 ...

  4. layui导入模板数据_数据可视化图表 教程echarts,第一讲

    1 我们写web项目,展示数据的地方,可能会使用到图表.今天就讲这个玩意. 本教程暂时定为 三讲:(随后情况,如果有新的研究,会有所更新!) 第一讲  饼图的使用 第二讲  柱状图的使用 第三讲  拆 ...

  5. Chisel 教程翻译 之 第一章:概述介绍《Digital Design with Chisel》

    1 Introduction 1 入门 This book is an introduction to digital system design using a modern hardware co ...

  6. 《ArcGIS Engine+C#实例开发教程》第一讲桌面GIS应用程序框架的建立

    原文:<ArcGIS Engine+C#实例开发教程>第一讲桌面GIS应用程序框架的建立 摘要:本讲主要是使用MapControl.PageLayoutControl.ToolbarCon ...

  7. (转)【风宇冲】Unity3D教程宝典之AssetBundles:第一讲

    自:http://blog.sina.com.cn/s/blog_471132920101gz8z.html 原创文章如需转载请注明:转载自风宇冲Unity3D教程学院 AssetBundles第一讲 ...

  8. vim入门教程(实践第一)

    2019独角兽企业重金招聘Python工程师标准>>> vim 是一个具有很多命令的功能非常强大的编辑器.限于篇幅,在本教程当中      就不详细介绍了.本教程的设计目标是讲述一些 ...

  9. 《ArcGIS Engine+C#实例开发教程》第七讲 图层符号选择器的实现2

    <ArcGIS Engine+C#实例开发教程>第七讲 图层符号选择器的实现2 原文:<ArcGIS Engine+C#实例开发教程>第七讲 图层符号选择器的实现2 摘要:在第 ...

  10. C#苹果应用开发——第一讲初始Xamarin Xamarin ios 教程 Xamarin跨平台开发

    C#苹果应用开发--第一讲初始Xamarin   Xamarin ios 教程 Xamarin跨平台开发 C#苹果应用开发 教程观看地址:v.youku.com/v_show/id_XNzA3OTUx ...

最新文章

  1. 5个案例让Python输出漂亮的表格!
  2. 强化学习、联邦学习、图神经网络,飞桨全新工具组件详解
  3. python财务报表分析-用Python爬取东方财富网上市公司财务报表
  4. HTML之页面结构分析
  5. 华为鸿蒙加快完善,替换安卓!华为鸿蒙OS生态持续扩大:或适配高通平台
  6. LoRa和ZigBee谁更适合智能家居?
  7. word可以直接导入mysql嘛_如何把word文档导入到数据库中——java POI
  8. html 正则表达式验证金额,js金额校验,js正则表达式,包含正负,小数点后两位...
  9. 医疗影像技术简介(X射线,CT,MRI等)
  10. Python面向对象编程案例:封装数据库增删改查操作
  11. string不能输入空格,如何输入有空格字符串呢
  12. 31部黑客电影,你看过哪几部?
  13. Unity3D导出Android工程(Android中应用Unity3D)
  14. word格式与pdf格式相互转换
  15. 音视频-Video标签整理(属性、方法、事件)
  16. 当我跑步时我在想什么读后感
  17. 疑问代词who和whom的用法
  18. Gauss-Legendre求积公式-高斯型积分公式
  19. 第一次搭建ftp遇见的蹩脚的问题
  20. window7系统的电脑如何调节亮度?

热门文章

  1. 计算机毕业设计Java智能交通管控系统(源码+系统+mysql数据库+Lw文档)
  2. 2018 ACM-ICPC 西安邀请赛记录
  3. 2022年道路运输企业安全生产管理人员考试及道路运输企业安全生产管理人员新版试题
  4. 基于JAVA教师教学质量评估系统计算机毕业设计源码+数据库+lw文档+系统+部署
  5. Elasticsearch分布式架构原理图
  6. 使用STVD和Cosmic C编译器开发STM8S快速入门指南
  7. 手机html禁止复制,网页禁止复制文字?学会这六招,全网内容任你免费复制!...
  8. 【ENVI解决经验】裁剪后背景改为白色(透明)
  9. vue 实现点击图片放大
  10. VS中如何添加报表控件