如何在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
相关产品推荐
相关产品推荐

