You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C程序中将变量地址传递给外部汇编例程修改值?

解决方案

1. 修正C代码的函数调用

你当前的编译错误源于误用了解引用操作符*:*msgNumber要求操作数是指针类型,但msgNumber是普通int变量,因此编译器报错。要传递变量的内存地址给汇编函数,必须使用取地址操作符&,修改后的代码如下:

int msgNumber = 5555;
// 传递msgNumber的地址给汇编函数
VSHRTMSE(&msgNumber);

2. 声明外部汇编函数原型

在C代码中,必须提前声明外部汇编函数的原型,让编译器知晓函数的参数类型和返回值规则。由于我们需要让汇编修改传入的int变量,函数参数应定义为int*(指向int的指针):

// 放在调用代码之前(如文件开头或对应头文件)
extern void VSHRTMSE(int *msg_ptr);

3. 汇编例程的核心处理逻辑

汇编侧需要根据平台的调用约定(参数传递规则)接收指针参数,再通过指针间接修改内存中的值。以下是不同架构的简单示例:

示例1:x86架构(AT&T语法,参数通过栈传递)

.global VSHRTMSE
VSHRTMSE:
    pushl %ebp          ; 保存基址寄存器
    movl %esp, %ebp
    movl 8(%ebp), %eax  ; 从栈中取出传入的指针(第一个参数)
    movl $1234, (%eax)  ; 将指针指向的内存值修改为1234
    popl %ebp
    ret

示例2:ARM架构(参数通过r0寄存器传递)

.global VSHRTMSE
VSHRTMSE:
    mov r1, #5678       ; 准备要写入的新值
    str r1, [r0]        ; 将新值写入r0指针指向的内存地址
    bx lr               ; 返回C程序

关键注意点

  • 只有传递变量的地址,汇编才能直接修改C程序中变量的原始值;如果传值,汇编只能修改副本,不会影响原变量
  • 汇编的参数传递规则取决于目标平台(如x86-64用寄存器传参、嵌入式架构有各自的调用约定),需对应调整代码

内容的提问来源于stack exchange,提问作者user19950842

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 14:09:50