如何从汇编代码中引用C程序中的全局变量?

时间:2016-02-02 00:40:00

标签: c assembly

我有一个C程序,我想在外部程序集文件中访问该程序的全局变量。我该怎么做呢?使用NASM或FASM汇编程序。

示例代码:

[niko@dev1 test]$ cat cprogram.c 
#include <stdio.h>

int array[1024];

void func_increment(int position_index);

int main() {

    array[2]=4;
    func_increment(2);
    printf("val=%d\n",array[2]);
}
[niko@dev1 test]$ cat asmcode.S 
use64

global func_increment

section .text

func_increment:
    mov eax, array[position] <- how should I insert here the symbol located inside my C program
    inc eax

    ret

[niko@dev1 test]$ 

我在C程序中有很多类型,例如,一个声明为数组的结构类型,它长约32MB:

typedef struct buf {
    char                data[REQ_BUF_SIZE];
} buf_t;

我有指针,整数和许多变量类型:

char data[64] __attribute__ ((aligned (16)));
char nl[16] __attribute__ ((aligned (16)));
uint positions[32];

1 个答案:

答案 0 :(得分:4)

就符号而言,如果它们是全局的,您可以按名称引用它们。根据汇编程序和环境,您可能必须通过在下划线前加上声明符号外部和/或对其进行修改。

使用64位linux约定和nasm语法,您的代码可能如下所示:

extern array
global func_increment

func_increment:
    ; as per calling convention, position_index is in rdi
    ; since each item is 4 bytes, you need to scale by 4
    inc dword [array + 4 * rdi]
    ret