树莓派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
相关产品推荐
相关产品推荐

