从C调用MIPS:对齐未对齐的参数

从C调用MIPS:对齐未对齐的参数,c,mips,mips32,C,Mips,Mips32,我正在从C调用一些函数,它们是MIPS中的代码。 有时,我通过$a0到$a3传递的参数没有对齐,如果我尝试使用lw加载它们,就会抛出错误 我是否可以加载这些未对齐的参数并将其转换为对齐的参数(而不是使用lb然后将它们粘合在一起)?我不需要回信,只要读一下就行了 我也试着在MIPS代码中使用“align”,但它不起作用,可能不是为了这个 编辑:我正在使用GCC 7.4.0 编辑:我使用的是包含未对齐数据的压缩结构。在C代码中使用压缩结构时,编译器知道哪些字段未对齐,并创建访问未对齐数据所需的代码。

我正在从C调用一些函数,它们是MIPS中的代码。 有时,我通过$a0到$a3传递的参数没有对齐,如果我尝试使用lw加载它们,就会抛出错误

我是否可以加载这些未对齐的参数并将其转换为对齐的参数(而不是使用lb然后将它们粘合在一起)?我不需要回信,只要读一下就行了

我也试着在MIPS代码中使用“align”,但它不起作用,可能不是为了这个

编辑:我正在使用GCC 7.4.0


编辑:我使用的是包含未对齐数据的压缩结构。

在C代码中使用压缩结构时,编译器知道哪些字段未对齐,并创建访问未对齐数据所需的代码。它可能会完全按照您在问题中描述的那样执行,即使用
lb
而不是
lw
并组合字节

(存在一些陷阱。您可以创建代码,使未对齐数据的信息丢失。)

不幸的是,在汇编代码中,您必须手动执行此操作


作为一种解决方法,您可以从C中的包装器函数调用汇编代码,该函数在将值传递给汇编代码之前将值复制到对齐的变量

在C代码中使用压缩结构时,编译器知道哪些字段未对齐,并创建必要的代码来访问未对齐的数据。它可能会完全按照您在问题中描述的那样执行,即使用
lb
而不是
lw
并组合字节

(存在一些陷阱。您可以创建代码,使未对齐数据的信息丢失。)

不幸的是,在汇编代码中,您必须手动执行此操作


作为一种解决方法,您可以从C中的包装器函数调用汇编代码,该函数在将值传递给汇编代码之前将值复制到对齐的变量

你能关闭未对齐的访问错误吗?我使用的是GCC 7.4.0,我能找到的唯一信息是标志“-mno unaligned access”,但它至少在该版本上是无法识别的。你是在使用压缩结构还是将指针投射到需要更严格对齐的类型,例如从
uint8_t*
uint32_t*
?您的C编译器可能知道变量未对齐,并使用单字节访问生成代码,但汇编代码不会自动执行此操作。也许您可以从C中的包装函数调用汇编代码,该函数将值复制到对齐的变量,然后再将其传递给汇编代码。如果没有代码,这个问题将无法回答,并且只会产生猜测。谢谢Bodo!我使用的是压缩结构。创建包装器,然后创建局部变量并通过works传递这些变量。这是一个资源非常有限的系统,我希望在MIPS上有一种更快的方法,但如果没有其他方法出现,我将坚持使用包装器。你能关闭未对齐的访问错误吗?我使用的是GCC 7.4.0,我能找到的唯一信息是标志“-mno未对齐的访问”但它至少在该版本上不被识别。您是使用压缩结构还是将指针强制转换到需要更严格对齐的类型,例如从
uint8\u t*
uint32\u t*
?您的C编译器可能知道变量未对齐,并使用单字节访问生成代码,但汇编代码不会自动执行此操作。也许您可以从C中的包装函数调用汇编代码,该函数将值复制到对齐的变量,然后再将其传递给汇编代码。如果没有代码,这个问题将无法回答,并且只会产生猜测。谢谢Bodo!我使用的是压缩结构。创建包装器,然后创建局部变量并通过works传递这些变量。这是一个资源非常有限的系统,我希望在MIPS上有一种更快的方法,但是如果没有其他方法,我会坚持使用包装器。