[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]基本语法 的相关文章

  • 制作共享对象时不能使用针对 .data 的重定位 R_X86_64_32S(64 位 NASM + gcc)

    我正在尝试使用 NASM 和 GCC 制作一个程序 global main extern puts section data hi db hello 0 section text main push hi call puts ret 我正在
  • NASM“忽略寄存器大小规范”

    我尝试用 NASM 组装一个文件 但它指向文件中的这一行 mov al byte ptr es bx saying error comma colon or end of line expected 我找到了一个本网站的页面 https s
  • NASM x86 16 位寻址模式[重复]

    这个问题在这里已经有答案了 我在指向地址并在我的情况下写入字节大小的变量时遇到问题 这给了我错误 错误 无效的有效地址 mov byte AX byte 0x0 经过一番尝试和错误后 我测试了相同的结果 但使用的是 EAX 这编译得很好 m
  • 汇编 NASM 中的随机数生成

    我正在从事汇编 nasm 的大学项目 唯一的问题是我无法生成 162 到 278 之间的偶数随机数 我尝试了很多算法 但似乎无法限制范围内的数字 是否有一个小技巧或调整来获得范围内所需的数字 目的是在屏幕上随机显示一个水果 主要是贪吃蛇游戏
  • 如何在8086汇编中减去两个64位整数

    编写一个名为 SUB64 的程序 用 0x0160 和 0x0164 中的 64 位整数减去内存位置 0x0150 和 0x0154 中的 64 位整数 将结果存储在内存位置 0x0170 和 0x0174 中 我理解将其分成更小的部分背后
  • 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
  • 将小数字加载到 64 位 x86 寄存器中

    在 64 位 x86 CPU 下 通常我们将数字 1 加载到寄存器中 如下所示 mov rdx 1 48BAFFFFFFFFFFFFFFFF 该指令按照旧版本 NASM 的组装方式占用 10 个字节 另一种方法是 xor rdx rdx 4
  • 汇编代码不识别?和@数据

    这是我的第一个汇编程序 任何人都可以帮助使其成功运行 我看到下面的编译错误 为什么它不识别 and data 我正在尝试交换汇编中的两个变量 我正在执行以下命令 nasm f elf swap asm 但我收到这个错误 swap asm 6
  • 程序集 - 无法设置断点 lldb

    我用这些选项组装了nasm O0 g f macho64但 lldb 抱怨 无法将断点解析到任何实际位置 当我尝试在文件中的行号处设置任何断点时 我已经开始尝试学习 OS X 的 64 位汇编 但到目前为止这确实是一个挑战 似乎几乎没有任何
  • NASM 中 %define 和 equ 有什么区别?

    Code define x 0x03 x equ 0x03 他们之间有什么区别 define是一种更强大的执行宏的方法 类似于 C 预处理器 在您的简单情况下 没有太大区别 使用x源代码中将导致常量3被替换 这其中有一个细微的差别equ语句
  • “mov eax, [num]”和“mov eax, num”之间的区别

    我是一名初学者 正在编写汇编程序 使用以下代码打印从 1 到 9 的数字 section text global start start mov ecx 10 mov eax 1 l1 mov num eax mov eax 4 mov e
  • nasm:在运行时从 rip(指令指针)获取重定位二进制文​​件的偏移量

    我有一个适用于 x86 64 的 multiboot2 兼容 ELF 文件 其中启动符号定义在start asm NASM 汇编文件 multiboot2 标头包含relocatable tag 因为 GRUB 不支持 multiboot2
  • assembly x86 qemu:致命:尝试在 RAM 或 ROM 之外执行代码

    我正在开发一个非常基本的 shell 其中当前唯一的命令是 help 如果您输入错误 系统会通知您该命令无法识别 在段和堆栈设置的某个地方 我有一个错误 导致 shell 在我输入任何内容后吐出一些废话 然后完全冻结 我在终端中遇到错误 q
  • NASM 无法声明初始化数据[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 由于某种原因我无法编译 nasm 程序 如果我尝试在 data 部分中放入某些内容 则会出错 error comma expect
  • nasm idiv 为负值

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

    这两种工具都将汇编指令直接翻译成机器代码 但是是否有可能确定哪一个生成最快 最干净的代码 当你用汇编程序编写时 您正在准确地描述生成的指令所以它不依赖于汇编器 这取决于你 您编写的助记符与机器代码中的实际指令之间存在一一对应的关系
  • 分配内存空间的宏

    我需要让一个汇编程序员来计算帕斯卡三角形 https en wikipedia org wiki Pascal 27s triangle 这样帕斯卡三角形的每一行都与其他行分开存储在内存中 我想做一个 但我不知道如何使用宏在汇编中做到这一点
  • 近调用/跳转表并不总是在引导加载程序中工作

    一般问题 我一直在开发一个简单的引导加载程序 并在某些环境中偶然发现了一个问题 在这些环境中 此类指令不起作用 mov si call tbl SI Call table pointer call call tbl Call print c
  • 弹出 x86 堆栈以访问函数 arg 时出现分段错误

    我正在尝试链接 x86 程序集和 C 我的C程序 extern int plus 10 int include

随机推荐

  • 关于项目报错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链接器和操作系统的库链接才能形成可执行文件 而在