hyengine 编译问题之结果入栈如何解决

简介: hyengine 编译问题之结果入栈如何解决

问题一:如果函数地址的高16位不为0,MOV_FUNCTION_ADDRESS_TO_REG宏是如何处理的?


如果函数地址的高16位不为0,MOV_FUNCTION_ADDRESS_TO_REG宏是如何处理的?


参考回答:

如果函数地址的高16位不为0,MOV_FUNCTION_ADDRESS_TO_REG宏会通过MOVK_X_I_S_I(NEXT_INSTRUCTION, reg, IMM16(func##Address >> 16), LSL, 16);这行代码,使用MOVK_X_I_S_I指令将函数地址的16-31位(即高16位)移动到寄存器reg中,并左移16位与之前的值合并。


关于本问题的更多回答可点击原文查看:https://developer.aliyun.com/ask/666188



问题二:MOV_FUNCTION_ADDRESS_TO_REG宏是如何处理64位函数地址的?


MOV_FUNCTION_ADDRESS_TO_REG宏是如何处理64位函数地址的?


参考回答:

MOV_FUNCTION_ADDRESS_TO_REG宏通过一系列的条件判断和指令执行,逐步将64位函数地址的各个16位段(从低到高)移动到指定的寄存器中。首先处理低16位,然后是高16位、32-47位(如果非零)和48-63位(如果非零),以确保64位地址的完整性和准确性。


关于本问题的更多回答可点击原文查看:https://developer.aliyun.com/ask/666191



问题三:如何将CTX_REG中的ctx地址放入R0寄存器作为第一个参数?


如何将CTX_REG中的ctx地址放入R0寄存器作为第一个参数?


参考回答:

要将CTX_REG中的ctx地址放入R0寄存器作为第一个参数,可以使用MOV_X_I(NEXT_INSTRUCTION, R0, CTX_REG);这样的指令,但考虑到CTX_REG可能存储的是一个地址,并且这个地址需要被加载到R0中,如果CTX_REG本身就是R0的别名,则无需移动;否则,可能需要一个加载指令如LDR_X_X_I(NEXT_INSTRUCTION, R0, CTX_REG, 0);(假设CTX_REG是一个指针寄存器,指向ctx的起始地址,且不需要偏移)。


关于本问题的更多回答可点击原文查看:https://developer.aliyun.com/ask/666199



问题四:在调用JS_NewObject后,如何将结果存入js栈的SP_OFFSET(0)位置?


在调用JS_NewObject后,如何将结果存入js栈的SP_OFFSET(0)位置?


参考回答:

在调用JS_NewObject后,其结果通常会被放置在R0寄存器中(假设这是函数的返回值寄存器)。要将这个结果存入js栈的SP_OFFSET(0)位置,可以使用STR_X_X_I(NEXT_INSTRUCTION, R0, SP, SP_OFFSET(0));这样的指令,其中SP是栈指针寄存器,SP_OFFSET(0)是栈顶偏移量。


关于本问题的更多回答可点击原文查看:https://developer.aliyun.com/ask/666201



问题五:EXCEPTION宏的作用是什么?


EXCEPTION宏的作用是什么?


参考回答:

EXCEPTION宏的作用是从CTX_REG指定的上下文中获取一个内置函数(可能是异常处理函数)的地址,将其加载到tmp寄存器中,然后将js栈上SP_OFFSET(0)位置的值(可能是JS_NewObject的返回值或其他重要值)移动到R0寄存器作为参数,最后通过BLR_X指令跳转到tmp寄存器指向的函数地址执行异常处理或其他内置操作。


关于本问题的更多回答可点击原文查看:https://developer.aliyun.com/ask/666202

相关文章
|
4月前
hyengine 编译问题之实现数列递归函数如何解决
hyengine 编译问题之实现数列递归函数如何解决
|
4月前
|
存储 缓存 Java
hyengine编译实现问题之复用 quickjs 原代码如何解决
hyengine编译实现问题之复用 quickjs 原代码如何解决
|
4月前
|
存储 JavaScript 前端开发
hyengine 编译问题之对象存储入栈如何解决
hyengine 编译问题之对象存储入栈如何解决
|
4月前
|
缓存 索引
hyengine编译问题之快路径优化如何解决
hyengine编译问题之快路径优化如何解决
|
4月前
|
测试技术
hyengine 编译问题之取出具体数值如何解决
hyengine 编译问题之取出具体数值如何解决
|
4月前
|
存储
hyengine 寄存器问题之提升代码性能如何解决
hyengine 寄存器问题之提升代码性能如何解决
|
4月前
|
存储
hyengine 编译问题之创建对象异常如何解决
hyengine 编译问题之创建对象异常如何解决
|
7月前
|
存储
【汇编】栈及栈操作的实现
【汇编】栈及栈操作的实现
325 1
【汇编】栈及栈操作的实现
|
测试技术 编译器 C++
栈局部变量优化探究,意外发现了 vs 的一个 bug ?
栈局部变量优化探究,意外发现了 vs 的一个 bug ?
|
编译器 C语言 C++
编译的四个过程-预处理、编译、汇编、链接
编译的四个过程-预处理、编译、汇编、链接