【问题标题】:changing global variables in NASM assembly更改 NASM 程序集中的全局变量
【发布时间】:2016-01-25 07:48:08
【问题描述】:

我已经定义了这些全局变量,但我似乎无法在代码中更改它们的值。我需要其他 C 模块才能访问这些变量。

global base 
global freep 

SECTION .data  
  base:   dd   0           
  freep:     dd    0 

下面的代码给出了这个错误:

:173: 错误:操作码和操作数的组合无效

所以我的问题是如何将值移动到全局变量中?

  mov freep, esi

【问题讨论】:

    标签: assembly nasm


    【解决方案1】:

    来自the NASM manual

    2.2.2 NASM 需要方括号用于内存引用
    规则很简单,就是对内存位置内容的任何访问都需要在地址周围加上方括号,并且对地址的任何访问变量没有。

    所以如果你想将esi 的值存储在freep 你应该写:

    mov [freep], esi
    

    如果您想获取freep 的地址并将其放入esi,您会这样写:

    mov esi, freep
    

    指令mov freep, esi 无效,因为这里的freep 是立即数(freep 的地址),并且不能将立即数作为目标操作数。

    【讨论】:

    • 非常感谢,如果有人想在 esi 获得 freep 的价值,会是 mov esi, [freep]
    • 我有最后一个问题,我的全局变量是一个具有成员大小和 ptr 的结构。我将如何处理成员大小和 ptr? ptr 是 [freep + 4] ,大小是 [freep + 8] 吗?
    • 参见手册中的section 4.12.10,了解如何在 NASM 程序集中声明和使用结构。
    猜你喜欢
    • 2022-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-03
    • 1970-01-01
    • 2013-03-09
    • 1970-01-01
    相关资源
    最近更新 更多