NASM 中 %define 和 equ 有什么区别?

2024-03-24

Code:

%define x 0x03
x equ 0x03

他们之间有什么区别?


%define是一种更强大的执行宏的方法,类似于 C 预处理器。在您的简单情况下,没有太大区别,使用x源代码中将导致常量3被替换。这其中有一个细微的差别equ语句在第一次被读取时被评估一次,并且%define只要在源代码中遇到宏,就会对其进行求值。

您可以看到两个语句片段之间的区别:

addr   equ       $
       %define   addr $

在这种情况下,addr,当在代码中遇到时,将具有不同的值。在第一种情况下,$将是装配位置所在的位置equ是。换句话说,它在哪里defined.

在第二种情况下,它计算出位于以下位置的装配位置:addr is used.

Where %define闪耀的是这样的东西:

%define thricexplusy(x,y) (3 * x + y)

or:

%define ctrl(c) (c & 0x1F)
: :
mov     al, ctrl('z')

(或者甚至更复杂的东西),它允许您将参数传递给宏,这是简单的不可能实现的equ.

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

NASM 中 %define 和 equ 有什么区别? 的相关文章

  • 使用自定义引导加载程序创建可引导 ISO 映像

    我正在尝试将我用汇编语言编写的引导加载程序转换为ISO图像文件 以下是代码来自MikeOS http mikeos sourceforge net write your own os html引导加载程序 这是我的引导加载程序代码 BITS
  • 使用多秒后出现分段错误

    我对汇编完全是菜鸟 我尝试创建函数并在 C 中使用它 这个函数获取 3 个变量 a x y 它们是包含两个 64 位 int 的结构 我想返回a x y 不幸的是 这段代码是 NASM 导致段错误 define a1 rdi define
  • 将bootloader和内核制作成iso? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 如何创建将内核加载到 iso 的简单引导加载程序 已经过去 5 天了 我在 google 中搜索并进行
  • 汇编器什么时候使用像 R_X86_64_32S 这样的符号扩展重定位而不是像 R_X86_64_32 这样的零扩展更好?

    举个具体的例子 在 GAS 2 24 上 移动地址 mov s eax s After as 64 o a o a S objdump Sr a o 使用零扩展 0000000000000000
  • 汇编 NASM 中的随机数生成

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

    我正在研究一种打印多位整数的方法 方法是反复将整数除以 10 并收集余数 然后打印它们 这是有问题的代码段 Divide initial division mov ax 111 number we want to print mov ch
  • NASM:磁盘读取超时

    尝试从磁盘 从同一文件 读取数据 将另外 2 个 512 字节扇区加载到内存中 磁盘读取功能如下 read DH sectors to ES BX from drive DL disk read push dx push bx Tried
  • 为什么我们必须在这里取消引用 stdout ?

    我正在尝试打电话fputs str stdout 从装配 我为什么要push dword stdout 而不是仅仅push stdout 因为在 C 中我们不这样做fputs str stdout 为什么我们需要取消引用stdout在装配中
  • Linux 64 位 shellcode

    我正在尝试在 Ubuntu 64 位上编写我的第一个 Hello world shellcode 但它不起作用 我有文件你好 asm 64 bit Hello World in Linux NASM global start global
  • 如何在 Linux x86 NASM 中打印字符?

    我正在尝试使用打印单个字符或数字NASM 针对 x86 GNU Linux 架构 这是我正在使用的代码 section text global start start Linux printing preparation mov eax 4
  • ORG 汇编指令有什么作用?

    谁能给我一个关于 ORG 指令的全面描述 何时以及为何在汇编编写的应用程序中使用它 在 x86 或 AMD64 上使用 Nasm ORG用于设置汇编器位置计数器 这可能会也可能不会在链接时转换为加载地址 它可用于定义绝对地址 例如当定义诸如
  • 是什么原因导致“x.asm:(.text+0xd): 对‘y’的未定义引用”?

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

    我正在尝试找到一种方法让我的代码在继续之前等待两秒钟 我在保护模式下使用Linux的nasm 所以我只能使用int 80h 我找到了一个syscall称为 alarm 27 另一个叫 pause 29 但是 当我尝试使用这些时 程序会等待并
  • 在 Assembly 中实现流程“(1) if {...} else if {...} ... (2)”

    我在 C 中有以下流程 some stuff1 if something1 func1 func2 else if something2 func3 func4 some stuff2 我想知道如何在汇编中对其进行编码 我的意思是 不是精确
  • 为什么 nasm 找不到 cmake 中的 include 语句

    我正在使用一个模块化引导加载程序 我觉得设置它使用 Gas 比将 nasm 移植到 cmake 更痛苦 似乎并非如此 NAsm 无法找到包含文件 我缺少什么 完整的代码可以在这个 Github 存储库 https github com Co
  • 在保护模式下将字符打印到屏幕 ASM

    我正在尝试进入保护模式 然后打印出 Hi 但相反 它只是从我的 BIOS 中断调用中打印 正在加载操作系统 在进入 pmode 之前发生 而没有其他内容 My 引导加载程序 asm DEFINE KERNEL LOAD OFFSET 0x1
  • Gas 与 nasm:哪个汇编器生成最好的代码?

    这两种工具都将汇编指令直接翻译成机器代码 但是是否有可能确定哪一个生成最快 最干净的代码 当你用汇编程序编写时 您正在准确地描述生成的指令所以它不依赖于汇编器 这取决于你 您编写的助记符与机器代码中的实际指令之间存在一一对应的关系
  • 在 NASM 中使用 istruc 时:“警告:尝试初始化 BSS 部分‘.bss’中的内存:忽略 [-w+other]”

    在搜索这个错误时我发现this https stackoverflow com questions 65731514 nasm attempt to initialize memory in bss section 77001709问题 但
  • 近调用/跳转表并不总是在引导加载程序中工作

    一般问题 我一直在开发一个简单的引导加载程序 并在某些环境中偶然发现了一个问题 在这些环境中 此类指令不起作用 mov si call tbl SI Call table pointer call call tbl Call print c
  • Nasm 打印到下一行

    我用 nasm Assembly 编写了以下程序 section text global start start Input variables mov edx inLen mov ecx inMsg mov ebx 1 mov eax 4

随机推荐