我目前正在使用Linux上的ARM汇编作为学习练习。我正在使用“裸”程序集,即没有libcrt或libgcc。任何人都可以向我指出有关在调用第一条指令之前在程序开始时堆栈指针和其他寄存器处于什么状态的信息吗?显然,pc
/ r15指向_start,其余似乎已初始化为0,只有两个例外:sp / r13指向我程序之外的地址,而r1指向稍高的地址。
因此,提出了一些可靠的问题:
任何指针将不胜感激。
这是使我的编译器启动Linux / ARM程序的方法:
/** The initial entry point.
*/
asm(
" .text\n"
" .globl _start\n"
" .align 2\n"
"_start:\n"
" sub lr, lr, lr\n" // Clear the link register.
" ldr r0, [sp]\n" // Get argc...
" add r1, sp, #4\n" // ... and argv ...
" add r2, r1, r0, LSL #2\n" // ... and compute environ.
" bl _estart\n" // Let's go!
" b .\n" // Never gets here.
" .size _start, .-_start\n"
);
如您所见,我只是从[sp]的堆栈中获取了argc,argv和环境材料。
一些澄清:堆栈指针指向进程内存中的有效区域。r0,r1,r2和r3是被调用函数的前三个参数。我分别用argc,argv和environ填充它们。
11.2.2 状态寄存器 状态寄存器是用来标识协处理器中指令执行情况的,它相当于CPU中的标志位寄存器。80x87协处理器的状态寄存器如图11.5所示。 15 13 12 11 8 7 0 B C3 TOP C2 C1 C0 ES SF PE UE OE ZE DE IE 图11.5 80x87协处理器的状态寄存器示意图 状态寄存器各标志位(或组合位)的含义如下: ◆B(Busy,忙) 忙标志位用
对于协处理器中状态寄存器的内容,程序员可用指令FSTSW把其值送到内存单元中。如果当前使用的是80287及其以后的协处理器,那么,可用指令“FSTSW AX”把该状态寄存器的值传送给通用寄存器AX。一旦状态寄存器的值复制到内存或AX中,那么,就可对其各位进行分析,并可检测出当前协处理器的工作状态。 对于80287协处理器,它还可通过I/O地址00FAH~00FFH来实现其与CPU之间的数据交换,而
问题内容: 普通CPU(例如Android设备)是基于寄存器的计算机。Java虚拟机是基于堆栈的计算机。但是基于堆栈的计算机是否依赖于基于寄存器的计算机工作?由于基于堆栈的计算机不是OS,因此不能单独运行吗?除了JVM,是否有任何基于堆栈的计算机示例?有人说1个操作数,2个操作数;你为什么需要这个? 问题答案: JVM在任何地方都没有提到寄存器的存在。从它的角度来看,内存仅存在于少数几个地方,例如
问题内容: 出于好奇,这只是一个简单的理论问题。我一直像一个Java迷男孩。但是有一件事让我怀疑为什么Java不提供在堆栈上创建对象的机制?如果我可以在堆栈上创建小的Point(int x,int y)对象而不是像在C#上创建结构那样的堆,效率会更高。java中的此限制背后是否有任何特殊的安全原因?:) 问题答案: 这里的策略是Java不会将这个决定泄漏给语言,而是让JVM / Hotspot /
问题内容: 我知道,如果我在某个从函数某处调用的函数内,那么此返回地址将压入堆栈。 在上面的代码中,当foo函数处于活动状态时,我将获取堆栈中第一个推送的局部变量的地址。我如何访问在此变量堆栈之前的某个地方返回的返回地址(主要称为foo)?该位置是否固定并且可以相对于第一个局部变量访问?我该如何修改? 编辑:我的环境是带有gcc编译器的x86处理器上的Ubuntu 9.04。 问题答案: 有一个内
问题内容: 是局部变量,将其存储在堆或堆栈中的何处? 问题答案: 在堆上。每当您用来创建对象时,它都会在堆上分配。