码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • NASM汇编教程翻译01 第一讲 Hello, World!


    英文原版地址: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

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

    编译命令

    nasm -f elf hello.asm

    链接命令

    ld -m elf_i386 hello.o -o hello

    执行命令

    ./hello

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

  • 相关阅读:
    信奥中的数学基础:因式分解
    做一个校园跑腿小程序需要多少成本?
    景联文科技提供4D-BEV标注工具:提升自动驾驶感知能力的精准数据支持
    Python中输入输出函数input和print用法
    预训练模型相对位置编码和绝对位置编码的通俗理解
    【观点】区块链的未来:分布式商业;企业的未来:分布式商业生态战略
    P2607 [ZJOI2008] 骑士
    Python 的Tkinter包系列之七:好例子补充
    【性能优化下】组织结构同步优化二,全量同步/增量同步,断点续传实现方式
    强烈推荐APP破解常用工具集合!
  • 原文地址:https://blog.csdn.net/dlc0313/article/details/126837593
  • 最新文章
  • 沪漂五周年了:我越来越迷茫了
    Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
    MySQL-Seconds_behind_master的精度误差
    [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
    AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
    Agent OS :五种驯服不确定性的范式
    PortSwigger SQL注入LAB11
    数据库即时编译JIT
    [Begin]AI Learn Data Day 0
    深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号