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

树莓派3B下ARM汇编变量地址查看与终端输出问题

ARM汇编变量调试与地址输出问题解答

问题1:判断0X21024是否为变量variable1的地址

直接在GDB中执行以下命令验证:

  • 执行 info variables:列出所有全局变量的地址,找到variable1对应的地址与0X21024对比。
  • 执行 print &variable1:直接打印variable1的内存地址,若结果显示为$1 = (int *) 0x21024,则该地址就是变量地址。

问题2:查看变量的完整长度

你的代码中variable1用.word声明,ARM汇编里.word默认对应4字节(32位),可通过GDB命令确认:

  • 执行 print sizeof(variable1):直接输出变量的字节长度,结果应为4。
  • 执行 x /4xb &variable1:以1字节为单位查看变量的4个字节内容,直观验证其长度。

问题3:通过printf输出变量地址到终端

需要修改格式字符串和参数传递逻辑,调整后的代码如下:

@; This is Data section
.data

.balign 4       
variable1: .word 1

.balign 4
return: .word 0

.balign 4
string: .asciz "%p\n"  @; 改用%p格式符输出地址

.text
.balign 4 

.global main    
main:
    LDR R1, addr_of_return         
    STR LR, [R1]                         

    LDR R1, addr_of_var1    @; R1直接存入variable1的地址
    MOV R3, #10            
    STR R3, [R1]

    LDR R0, addr_of_string  @; R0存放格式串地址
    @; 无需执行LDR R1, [R1],直接用R1中的地址作为printf参数
    BL printf
    
    LDR LR, addr_of_return          
    LDR LR, [LR]                         
    BX LR
         

addr_of_var1 : .word variable1
addr_of_return : .word return
addr_of_string : .word string

说明

  • C标准库中%p是专门用于输出指针/内存地址的格式符,会以十六进制形式打印地址。
  • ARM汇编调用printf时,第一个参数(格式串)存在R0,第二个参数(要输出的地址)存在R1,这里LDR R1, addr_of_var1已经把变量地址加载到R1,无需再通过[R1]取值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 06:40:44