Assembly 使用ARM的LDR指令,我可以访问什么地址

Assembly 使用ARM的LDR指令,我可以访问什么地址,assembly,arm,instruction-set,Assembly,Arm,Instruction Set,我对ARM汇编代码一无所知 我刚刚检查了指令集,发现有一条指令LDR可以用作“LDR{}{}Rd” 关于本说明,我有两个问题: 1) 这里的地址是物理地址还是虚拟地址? 2) 我怎么知道哪个地址对我来说是“合法”或“可读”的?我不知道我可以访问哪个地址 我只是想测试一下这个指令,这样任何有效的地址都会对我有帮助 多谢各位 除非您正在编写内核/引导加载程序代码,否则所有地址都是虚拟的。即使您想使用物理地址,也不能使用物理地址。(假设您正在编写用户空间代码,该代码将在Linux等全尺寸操作系统下运行

我对ARM汇编代码一无所知

我刚刚检查了指令集,发现有一条指令LDR可以用作“LDR{}{}Rd”

关于本说明,我有两个问题: 1) 这里的地址是物理地址还是虚拟地址? 2) 我怎么知道哪个地址对我来说是“合法”或“可读”的?我不知道我可以访问哪个地址

我只是想测试一下这个指令,这样任何有效的地址都会对我有帮助

多谢各位

  • 除非您正在编写内核/引导加载程序代码,否则所有地址都是虚拟的。即使您想使用物理地址,也不能使用物理地址。(假设您正在编写用户空间代码,该代码将在Linux等全尺寸操作系统下运行。更一般地说,要么您总是有虚拟地址,要么您总是有物理地址。您不能编写使用某些物理和虚拟内存访问的代码。如果您想对某个物理地址执行某些操作,您必须将其映射到您的虚拟地址空间。)

  • 当操作系统启动进程时,堆栈指针通常指向有效内存。您在数据或bss段中放置的任何内容也应该是可读的

  • 除此之外,任何问题都超出了单一答案的范围。谷歌搜索一个介绍教程

    但是,由于您特别提到了
    ldr
    ,而且它不仅仅是一条简单的指令(将编译时常量放入寄存器的加载或伪指令):请参阅

    我真的不知道ARM asm,我不知道答案会是arch特定的。1.二,。应用于所有CPU上的用户空间代码(在具有受保护内存的普通操作系统上)

  • 除非您正在编写内核/引导加载程序代码,否则所有地址都是虚拟的。即使您想使用物理地址,也不能使用物理地址。(假设您正在编写用户空间代码,该代码将在Linux等全尺寸操作系统下运行。更一般地说,要么您总是有虚拟地址,要么您总是有物理地址。您不能编写使用某些物理和虚拟内存访问的代码。如果您想对某个物理地址执行某些操作,您必须将其映射到您的虚拟地址空间。)

  • 当操作系统启动进程时,堆栈指针通常指向有效内存。您在数据或bss段中放置的任何内容也应该是可读的

  • 除此之外,任何问题都超出了单一答案的范围。谷歌搜索一个介绍教程

    但是,由于您特别提到了
    ldr
    ,而且它不仅仅是一条简单的指令(将编译时常量放入寄存器的加载或伪指令):请参阅


    我真的不知道ARM asm,我不知道答案会是arch特定的。1.二,。应用于所有CPU上的用户空间代码(在具有受保护内存的普通操作系统上)。

    这取决于程序运行的ARM架构。如果是像Cortex-M0(ARMv6-M)这样的小型微控制器,则使用物理地址。在特定处理器的参考手册中,您可以检查哪些地址是有效的(例如RAM的地址范围)。您还需要记住,通常地址必须与字大小对齐(同样,它取决于特定版本的体系结构)

    如果您使用“大”ARM处理器,如Cortex-A(ARMv7-A)或64位ARM(ARMv8-A)中的一个,那么您也(很可能)使用某种高级操作系统(例如Linux),并且处理器本身具有MMU。在这种情况下,传递虚拟地址。如果您使用的是32位Linux,并且使用的是标准的,则用户空间程序可以访问0xC0000000(对齐的)以下的所有地址。顺便说一句,您可以使用其他指令(如LDRB、LDRH)访问未对齐的地址


    如果您正在使用Linux,可能会有所帮助。这篇文章目前相当混乱,但至少在文章内部有一组相当好的指向其他文章的外部链接。

    这取决于您的程序运行在什么样的ARM体系结构上。如果是像Cortex-M0(ARMv6-M)这样的小型微控制器,则使用物理地址。在特定处理器的参考手册中,您可以检查哪些地址是有效的(例如RAM的地址范围)。您还需要记住,通常地址必须与字大小对齐(同样,它取决于特定版本的体系结构)

    如果您使用“大”ARM处理器,如Cortex-A(ARMv7-A)或64位ARM(ARMv8-A)中的一个,那么您也(很可能)使用某种高级操作系统(例如Linux),并且处理器本身具有MMU。在这种情况下,传递虚拟地址。如果您使用的是32位Linux,并且使用的是标准的,则用户空间程序可以访问0xC0000000(对齐的)以下的所有地址。顺便说一句,您可以使用其他指令(如LDRB、LDRH)访问未对齐的地址


    如果您正在使用Linux,可能会有所帮助。这篇文章目前相当混乱,但至少在文章内部有一组相当好的指向其他文章的外部链接。

    ARMv7-a-R体系结构参考手册
    明确指出

    指令中用作数据或指令地址的地址是虚拟地址(VA)

    PC、LR或SP中保存的地址是VA

    VA贴图从零到VA空间的大小。对于ARMv7,最大VA空间为4GB,最大VA范围为0x00000000-0xFFFFFF

    此外,很明显,该VA被转换为物理地址,而物理地址又被用于对物理内存执行所需的操作。 进一步说明了禁用内存管理单元(实际内存映射)的影响,但这并不否定地址是虚拟地址这一事实

    总之,在最近的ARM体系结构中,除非编写内核,否则您确实可以使用虚拟地址操作,而内核