【问题标题】:NASM X86_64 global variable from C来自 C 的 NASM X86_64 全局变量
【发布时间】:2016-02-03 12:17:11
【问题描述】:

我对 X86_64 上的 NASM 程序集完全陌生。我想在 asm 程序中访问我的变量 toto 并增加它的值。到目前为止,我正在执行以下操作:

C 程序:

#include <stdio.h>
#include <inttypes.h>

int64_t toto;
extern void modifytoto(void);

int main() {
    toto=0;
    modifytoto();
    printf("toto = %d \n",toto);
    return 0;
}

而汇编程序如下(增量为伪代码)。

global  modifytoto
global  toto

section .text
        modifytoto:
            mov rax, 1
            mov toto, rax
            ret  

我不能使用 toto 作为 modifytoto() 的参数,因为它应该用于更复杂的程序中,我不想在其中修改参数。

我正在使用以下 cmd 进行组装

nasm -f elf64 -o mix_asm.o kernel3.asm

我收到了这条消息:

kernel3.asm:7: error: symbol `toto' undefined

我的代码有什么问题?

【问题讨论】:

  • 为什么你认为 'mov toto, rax' 会增加 toto 的价值? mov 覆盖 toto 值,它的值变为 1,但不再是 1。尝试添加到,1
  • 酷,asm 指令只是为了表明我的目的,但你是对的。谢谢!
  • 为什么 add toto, 1 给我这个消息?操作码和操作数的组合无效
  • @syf 写add DWORD PTR toto, 1,然后在回来询问更多问题之前阅读手册。
  • 很酷,谢谢!最后,我写了 mov rax, 1 add [toto], rax 就可以了

标签: c assembly nasm


【解决方案1】:

你需要放线

extern toto

在你使用 toto 告诉 NASM toto 是一个外部符号之前的某个地方。这就像在 C 中一样:如果您不通过声明 toto 来告诉它,编译器不知道 toto 应该是什么。

【讨论】:

    猜你喜欢
    • 2016-01-25
    • 1970-01-01
    • 2015-06-12
    • 2012-02-06
    • 1970-01-01
    • 2018-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多