ARM 初步尝试
ARM似是栈过程处理但又不全是,总之我初步尝试的映像并不是太友好,另外本文内容可能具有一些错误,欢迎各位大佬指点一二,ARM具有(R0~R15)个寄存器,例在“ARM-thumb”中规定以下。
【r0~r3】传入参数
【r4~r11】局部变量
【r12】IP 暂存器
【r13】SP 栈指针
【r14】LP 链接寄存器(返回地址,RIP)
【r15】PC 程序计数器
但真的与现实情况下会有不少出入,例下图所示函数则是一个例子,ARM-group式操作多个元目标的确不错 虽然总感觉有点怪怪的。
另外函数返回并不是通过“RET”而是通过“MOVS R0,R4; POP {R4,PC}”,把返回值放入 R0,可能不同的ARM函数调用协议之间会有一些差异 但应该比较类似,它类似于EAX的作用但又不尽相同。
但ARM让我看到IL的一些酸爽,LDR类似的感觉STR初见第一反应字符串什么鬼这么秀的?后头仔细看了下instruction-TABLE发现它是把寄存器的值写入栈内存的instruction。
LDR & STR 指令架构算是ARM的一大特色呢的确相对于IA架构各种PUSH、MOV要精简可读的多,但这并不是我要转ARM的理由,我可不喜欢搞ARM的程序。
ARM寻址方式具有8种,不过IA架构也可以通过一些不同指令组合进行寻址,这个倒没什么好说的,相对的“寄存器移位寻址”ARM可以用类似“mov r0, r1, lsl #5” 之类的方式来表示,而IA则需要用几条指令才能搞定的穷尽来说会方便很多,当然类似ARM“ldr r0, [r1, #4]” 这种寻址方式与IA“mov eax, [ecx+4]”之间没有太大区别,只是形式上会有一些不同
或许从两者指令特性上来说的话:“IA架构更加细分子类化ARM架构的封装性更好”当然两者之间各有优势谈不上那方更好!
例下面的ARM过程让我感到有些奇怪的是R0看上去有点像ECX在实例函数的作用( 按理说应该是一个固定不被改写的寄存器才对,ECX指向this的地址,的确这里的R0也是相同的 所以这才令人感到奇怪或许这就是不同平台之间的一些差异?