【发布时间】:2023-04-06 20:30:01
【问题描述】:
我刚开始学习 ARM 汇编。我目前正在使用“GNU assembler version 2.35.2 (arm-linux-gnueabihf)”的 32 位 Raspian。
这是我将部分 ascii 加载到寄存器中的简单程序:
.global _start
_start:
ldr r1,=helloworld
ldr r2,[r1]
@prepare to exit
mov r0,#0
mov r7,#1
svc 0
.data
helloworld:
.ascii "HelloWorld"
我将它加载到 gdb 中,可以看到我的寄存器 r2 加载了0x6c6c6548(在 ascii "lleH" 中)。一个快速的 objdump 显示:
Contents of section .data:
0000 48656c6c 6f576f72 6c64 HelloWorld
我有以下问题:
- 字符串在内存中的样子如何?换句话说,当字节序出现时?加载到内存时会发生反转吗?或者字符串会按原样加载到内存中,但在加载到寄存器时会反转?
- 为什么下面程序
.word的寄存器r2的内容是0x12345678而不是0x78563412?为什么没有遵循字节顺序?
注意:使用.word 代替.ascii
.global _start
_start:
ldr r1,=helloworld
ldr r2,[r1]
mov r0,#0
mov r7,#1
svc 0
.data
helloworld:
.word 0x12345678
编辑
第一个程序的内存转储显示,即使内存也有字符串,其顺序与源代码和目标文件中的顺序相同:
>>> x/32xb 0x1008c
0x1008c: 0x48 0x65 0x6c 0x6c 0x6f 0x57 0x6f 0x72
0x10094: 0x6c 0x64 0x41 0x11 0x00 0x00 0x00 0x61
这表明ldr 指令正在将该内存读取转换为 LSB 保存内存中第一个字节的小端格式。理解是否正确?但这仍然不能回答为什么 .word 没有发生这种情况。
【问题讨论】:
-
字节从不反转。像最高有效字节是“第一个字节”一样读取寄存器的值会使字节看起来好像颠倒了,但这只是您读取它们的方式的影响。
标签: assembly arm cpu-architecture endianness