ARM汇编中字符串存储位置及给定代码存储细节技术问询
ARM汇编中字符串存储相关问题解答
一、ARM汇编中字符串的常规存储位置
在ARM汇编里,字符串的存储位置由其是否需要修改决定:
- 只读、运行时无需修改的字符串,一般放在
.rodata(只读数据段); - 需要在运行时修改的字符串,会被放在
.data段(也就是你提到的global data segment全局数据段); - 动态生成的字符串,会在程序运行时从堆中分配空间,堆属于dynamic data segment动态数据段。
二、示例代码的字符串存储细节
先看给出的ARM汇编代码:
.text .global main main: push {lr} ldr r0, =string bl printf mov r0, $0 pop {lr} bx lr .data string: .asciz "Hello World!\n"
针对你的问题逐一解答:
- 存储位置:这段代码里的
"Hello World!\n"被定义在.data段,属于全局数据段(global data segment)。 - 存储方式:通过
.asciz伪指令定义,会将字符串的每个字符按ASCII编码依次存入内存,并且自动在字符串末尾追加一个空字节(\0)。 - 字节占用:每个ASCII字符确实占用1个字节,比如'H'对应0x48、'e'对应0x65,换行符'\n'对应0x0A,再加上末尾的空字节0x00,整个字符串一共占14个字节(原字符串13个字符+1个结束空字节)。
- 起止位置的确定:
- 起始位置:标签
string对应的内存地址就是字符串的起始地址,代码中通过ldr r0, =string把这个地址加载到r0寄存器,传递给printf函数; - 结束位置:因为是
.asciz定义的C风格字符串,程序会从起始地址开始逐个读取字节,直到遇到**空字节(0x00)**就判定为字符串结束,printf这类标准函数就是依靠这个空字节来识别字符串终点的。
- 起始位置:标签
内容的提问来源于stack exchange,提问作者user394334
相关产品推荐
相关产品推荐

