[Intel汇编-NASM]基本语法

2023-11-17

1. NASM编译器介绍:

    1) Netwide Assembler,是目前唯一开源且免费的汇编器;

    2) 该汇编器只提供编译的功能,但不提供连接的功能,在Linux下编译器产生.o文件后还需要使用ld链接器和操作系统的库链接才能形成可执行文件,而在Windows下需要使用MASM的ml链接器连接形成.exe文件;

    3) 这里我们先介绍实模式编程,由于Linux以及Windows都是运行在保护模式下的,因此我们会将编译好的程序写进虚拟硬盘的主引导扇区中,然后由虚拟机启动来观察程序运行效果,在Windows中使用Oracle Virtual Box以及VHD,在Linux中使用Bochs和dd磁盘工具;

    4) NASM和MASM一样都是遵从Intel汇编语法,因此指令集(即指令的名称相同)相同、语法相同,仅仅就是内存寻址形式以及其它的一些语法的细微处有不同地方;


2. 符号命名规则以及立即数的表示形式、越界问题:

    1) 对于指令、寄存器名称以及立即数中的字母,都对大小写不敏感;

    2) 但是对于标号是大小写敏感的!比如Tag:和tag:就是两个完全不同的标号;

    3) 标号必须以字母开头,或者是以'_'、'.'、'@'、'?'开头,当然标号当中也可以包含这些符号,并且标号也可以只包含这些符号,比如'@@'等,但是如果以特殊符号开头而不是以字母开头,对于NASM有特殊含义(之后会详细讲解);

    4) 立即数的表示:

        i. 规则基本和MASM一样,可以用H、没有后缀、B来区分十六进制、十进制、二进制,并且后缀的大小写随意;

        ii. 后缀法表示十六进制时,如果是以字母开头的就必须加一个0前缀,否则编译器会认为这是一个标号而不是一个立即数而报错!(注意:标号基本上是以字母开头的)

        iii. 但是NASM还支持更加传统的十六进制表示形式,就是C语言的0x前缀表示法,用这种方式十六进制如果是以字母开头就无需加0前缀了,并且无需任何后缀,x的大小写随意;

        iv. NASM允许使用下划线来使较长的立即数更加清晰,并且对于任意一种表示法都有效,比如100_0_11_11B、0F_E_3H、33_3_33、0x89_EF等,但是下划线不能放在开头,否则汇编器会将其误认为标号而报错;

       !注意:任何汇编语言都不允许立即数作为目的操作数,因为目的操作数具有存放运算结果的功能,而立即数没有自己的空间,因此不能作为目的操作数使用!

    5) 立即数越界问题:就是指立即数的范围超出目的操作数的范围大小,比如mov cl, 0623EFA823H、mov byte [bx], 3242342342325等,这种情况编译器不会报错,但是会警告提示范围过大,如果执意运行而忽视警告,则在运行时会做截断处理而损失精度,极大可能会导致程序错误或异常崩溃!所以不能忽视立即数越界问题;

    6) 良好的符号命名习惯:

        i. 所有指令和寄存器名称都小写;

        ii. 立即数的后缀都大写;

        iii. 立即数中的字母都大写;

        iv. 0x中的x小写;

        v. 全局标号以大写字母开头,后面跟小写字母(和Java的类名相似);

        vi. 局部标号全小写;(关于全局标号和局部标号的概念后面会详细介绍)

    7) 字符串的表示:

        i. 字符串也是一种立即数;

        ii. 既可以使用' '也可以使用" "来表示字符串立即数;

       

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[Intel汇编-NASM]基本语法 的相关文章

  • 标签移动到注册和子是什么意思?

    given a a label L1 db beat it 10 0 L2 what is the meaning of mov eax L2 sub eax L1 L2 寄存器 以及来自标签的子寄存器包含字符串 MOV EAX L2将标签
  • 如何让 nasm 在 MacOS 终端中作为命令工作?

    我一直在尝试让 nasm 作为终端中的命令工作 但似乎没有任何效果 我只是不断收到错误 nasm error unable to find utility nasm not a developer tool or in PATH 因此 首先
  • Linux 64 位 shellcode

    我正在尝试在 Ubuntu 64 位上编写我的第一个 Hello world shellcode 但它不起作用 我有文件你好 asm 64 bit Hello World in Linux NASM global start global
  • NASM 2行db(初始化数据)似乎不起作用

    我有以下 x86 64 代码 可以在 OSX Yosemite 上运行 global main extern exit extern puts DEFAULT REL section data putsmsg db Puts message
  • 虚拟机 Ubuntu 上的 NASM:无法执行二进制文件 exec 格式错误

    组装简单的 64 位 hello world 程序后出现错误 我正在使用以下命令 nasm f elf64 hello asm o hello o successfull ld o hello o hello m elf x86 64 su
  • macOS 上的 NASM 间接寻址程序集不正确

    在 macOS 上汇编以下代码 global start default rel section text start lea rdx buffer 0 lea rdx buffer 1 lea rdx buffer 2 lea rdx b
  • 是什么原因导致“x.asm:(.text+0xd): 对‘y’的未定义引用”?

    我已经很长一段时间没有使用 C 和汇编语言进行编程了 大约 2 年 现在我决定重新开始 但我想做一些更复杂的事情 我考虑过创建一个简单的内核 现在我在网上找到了这个源代码 启动 asm global loader extern kernel
  • 从 C 执行二进制机器代码

    下列的this http www muppetlabs com breadbox software tiny teensy html我已经成功地生成了大小为 528 字节的 a out 当 gcc main c 最初给了我 8539 字节的
  • 64位nasm除法idiv [重复]

    这个问题在这里已经有答案了 print out division message mov rcx 0 zero out register mov rax input mov rcx input2 idiv rcx divide rax by
  • Xcode 和 NASM 编码

    如何在 Xcode 中用汇编语言编写和构建程序 我寻找它但没有成功 你能帮助我吗 如果无法在 xcode 中编写 NASM 代码 请推荐一些好的 IDE 自从您提出这个问题以来 这可能已经发生了变化 但目前 安装Xcode 命令行工具 ht
  • 显示寄存器内容

    您好 我需要帮助显示寄存器的内容 我的代码如下 我已经能够显示数据寄存器的值 但我想显示标志状态 例如 1 或 0 如果还显示其他寄存器 如 esi ebp 的内容 将会很有帮助 我的代码没有打印标志的状态 我缺少什么 section te
  • 使用MOV指令时赋的值是多少?

    你能解释一下MOV指令的两种用法有什么区别吗 mov eax namedDataItem mov eax namedDataItem 这里的namedDataItem是在 data节中定义的命名数据项 取自NASM手册 http www n
  • nasm idiv 为负值

    尝试将正数除以负数 目前我的程序将正确划分 并且我可以正确访问其余部分 但是当我输入一个正数除以一个负值时 它根本不会被除 我知道有一种方法可以 签名扩展 并且它会正确划分 我只是看不懂说明书 movsss imm reg reg mem
  • Gas 与 nasm:哪个汇编器生成最好的代码?

    这两种工具都将汇编指令直接翻译成机器代码 但是是否有可能确定哪一个生成最快 最干净的代码 当你用汇编程序编写时 您正在准确地描述生成的指令所以它不依赖于汇编器 这取决于你 您编写的助记符与机器代码中的实际指令之间存在一一对应的关系
  • 为什么 printf 仍然可以在 RAX 小于 XMM 寄存器中 FP 参数数量的情况下工作?

    我正在关注Linux 64系统中的 开始x64汇编编程 一书 我正在使用 NASM 和 gcc 在关于浮点运算的章节中 本书指定了以下用于添加 2 个浮点数的代码 在本书和其他在线资源中 我读到寄存器 RAX 根据调用约定指定要使用的 XM
  • NASM 轮班操作员

    您将如何在寄存器上进行 NASM 中的位移位 我读了手册 它似乎只提到了这些操作员 gt gt lt lt 当我尝试使用它们时 NASM 抱怨移位运算符处理标量值 您能解释什么是标量值并举例说明如何使用 gt gt and lt lt 另外
  • 从 NASM 调用 C 函数 _printf 会导致分段错误

    我一直在尝试使用 NASM 在 Mac OS 和 Windows 上学习 64 位汇编 我的代码是 extern printf section data msg db Hello World 10 0 section text global
  • 如何在 Debian 上编译 DOS 程序?

    在我的汇编语言课程中 我们使用 DPMI 编写 DOS 程序 不幸的是 我无法一直使用 32 位 Windows 机器 我在我使用的几乎每台计算机上都安装了 Debian 虚拟机 我已经安装了 DOSBox 和 DOSEMU 有什么办法可以
  • Polygot 包含 nasm/yasm 和 C 的文件

    我有一堆幻数 我想将它们包含在由 nasm 或 yasm 编译的 C 程序和汇编文件中 在纯 C 语言中 该文件看起来像是一系列定义 例如 define BLESS 55378008 define ANSWER 42 在 nasm 或 ya
  • 计算 [1..N] 中前导 1 下面有 K 个零位的整数? (没有 HW POPCNT 的连续范围的 popcount)

    I have following task Count how many numbers between 1 and N will have exactly K zero non leading bits e g 710 1112 will

随机推荐

  • 关于项目报错Error:Cannot build Artifact :war exploded because it is included into a circular depency

    报个这个错的意思 你大概在编译项目的时候 你构建项目的时候 你点的是build project 而不是选择rebuild project 导致重复的依赖 这时候找到项目目录中的 idea目录 在进入artifacts文件目录 发现里面有两个
  • siammask_e 安装和使用

    基于siammask e的成绩 验证下demo效果 https paperswithcode com sota visual object tracking on vot2019 p fast visual object tracking
  • 值得拥有的5 款功能强大的免费 PDF 编辑器

    编辑 PDF 文件可能是一个真正的挑战 尤其是当您找不到合适的工具时 此外 如今大多数工具都需要大量订阅 这意味着您必须在口袋里烧一个洞才能对 PDF 文件进行更改 但是等等 这是一个转折点 有一些免费使用的 PDF 编辑器可以帮助您毫无后
  • 微信好友大数据分析

    微信好友数据分析 这里很多工作量 参考了该篇博客 在此致谢 传送门如下 一件有趣的事 我用 Python 爬了爬自己的微信朋友 不过原博客代码不是特别全 有些没有放出来 而且代码都是图片截图 比较模糊 所以我来整理一下我的代码 贴上来 同时
  • 【订阅消息】微信小程序发送服务通知

    前言 由于上次的公众号测试消息推送次数太多被官方认为是推销或者是广告之类的 被微信官方给禁了 然后偶然在一次吃饭的时候扫码点餐下单之后有个弹窗勾选订单完成通知 勾选之后就餐之后就会发送一个服务通知告诉您的订单已完成 其实基于这种消息提醒也是
  • keil5选择ST-Link Debugger时候setting点击不了问题

    分享一个自己用keil5的ST Link Debugger时候遇到的一个问题 就是在我选择用ST Link来进行调试时候 发现setting选择不了 如图所示 弹出来了一个提示我 说无法加载驱动程序 少了一个ST LINKIII KEIL
  • Redis 系列-- SpringBoot中redisTemplate 的操作(一)

    SpringBoot中 集成 redisTemplate 对 Redis 的操作 一 在Java 操作redis 时 有很多工具 redis 官网中 就有很多操作 目前主流开发框架SpringBoot 中 当然也有集成好的操作redis的工
  • 关于浏览器出现ERR_SSL_PROTOCOL_ERROR错误的原因与解决建议

    一 导致ERR SSL PROTOCOL ERROR错误主要有以下几个原因 Invalid System Time 系统时间与网络时间不同步 Firewall blocking the website or IP address Websi
  • 关于yarn安装时报“node“ is incompatible with this module的解决办法

    前提 在用vue写一个h5页面时 当在用yarn安装时 提示如下错误 The engine node is incompatible with this module Expected version 14 18 0 16 14 0 gt
  • Jmeter —— 常用的几种断言方法(基本用法)

    在使用JMeter进行性能测试或者接口自动化测试工作中 经常会用到的一个功能 就是断言 断言相当于检查点 它是用来判断系统返回的响应结果是否正确 以此帮我们判断测试是否通过 本文 主要介绍几种常用的断言 响应断言 JSON断言 BeanSh
  • WPS AI(海外版)使用体验分享

    最近很幸运的通过了WPS AI海外版的内测waitlist 这里和大家分享一下使用的体验和评价 申请与安装 WPS AI分为国内版和海外版两种 其中根据WPS自己的介绍 国内版本的模型由MinMax公司提供 海外版则是直接使用OpenAI的
  • OpenCV检测角点

    harris角点检测算法步骤 1 利用Soble计算出XY方向的梯度值 2 计算出Ix 2 Iy 2 Ix Iy 3 利用高斯函数对Ix 2 Iy 2 Ix Iy进行滤波 4 计算局部特征结果矩阵M的特征值和响应函数C i j Det M
  • Win7下U盘安装Ubuntu14.04双系统步骤详解

    Win7下U盘安装Ubuntu14 04双系统步骤详解 百度经验 http jingyan baidu com article 76a7e409bea83efc3b6e1507 html
  • 数据模型:数字化转型的核心能力

    业界数字化转型已经进入深水区 数据越来越受到大家重视 由于数据中台等等概念的兴起 大家越来越回到数据的根本问题 数据模型 今天不谈论高大上的数据中台 我想回到数据的本源 谈谈接地气的数据模型 大数据产业创新服务媒体 聚焦数据 改变商业 什么
  • Topaz Gigapixel AI 4.1.2 特别版 Mac 图片无损放大软件

    Topaz AI Gigapixel是一款由Topaz Labs公司开发的mac 软件 它使用深度学习技术 可以实现图片无损放大 使低分辨率图片转换成高分辨率 高质量的图片 还能够自动弥补图片损失的细节 增强画质 其实 对于像素图而言 无损
  • 想去谷歌工作?15个面试问题据说难倒天才!

    11月 15 日消息 谷歌公司的面试题在刁钻古怪方面相当出名 科技博客 BusinessInsider 贴出了 15 道谷歌面试题 并一一给出了答案 第一题 多少只高尔夫球才能填满一辆校车 职位 产品经理 解析 通过这道题 谷歌希望测试出求
  • 华为OD机试 - 找到比自己强的人数(Java)

    题目描述 给定数组 2 1 3 2 每组表示师徒关系 第一个元素是第二个元素的老师 数字代表排名 现在找出比自己强的徒弟 输入描述 无 输出描述 无 用例 输入 2 1 3 2 输出 0 1 2 说明 输入 第一行数据 2 1 表示排名第
  • 多益网络2022春笔试题记忆版

    多益网络笔试题 自己做完之后凭记忆整理出来的 填空题 数据结构 数据库 相对没那么难 所以只记了几个 选择题 1 A B C栈的出栈序列可能性有几种 2 关于队列 3 插入数据库表 name char 20 not null age cha
  • 毕业设计- 基于机器视觉的交通标志检测系统

    目录 前言 课题背景和意义 实现技术思路 一 交通标志检测识别理论基础 二 基于单阶段算法的交通标志检测 实现效果图样例 最后 前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实习为毕业后面临的就业升学做准备 一边要为毕业设计耗费大量
  • [Intel汇编-NASM]基本语法

    1 NASM编译器介绍 1 Netwide Assembler 是目前唯一开源且免费的汇编器 2 该汇编器只提供编译的功能 但不提供连接的功能 在Linux下编译器产生 o文件后还需要使用ld链接器和操作系统的库链接才能形成可执行文件 而在