请注意:我只是想学习。请不要因为我玩弄组装而对我大喊大叫。
我有以下方法:
uint32 test(int16 a, int16 b)
{
return ( a + b ) & 0xffff;
}
我根据在这里找到的详细信息创建了一个 .s 文件。
我的 .s 文件包含以下内容:
.macro BEGIN_FUNCTION
.align 2 // Align the function code to a 4-byte (2^n) word boundary.
.arm // Use ARM instructions instead of Thumb.
.globl _$0 // Make the function globally accessible.
.no_dead_strip _$0 // Stop the optimizer from ignoring this function!
.private_extern _$0
_$0: // Declare the function.
.endmacro
.macro END_FUNCTION
bx lr // Jump back to the caller.
.endmacro
BEGIN_FUNCTION addFunction
add r0, r0, r1 // Return the sum of the first 2 function parameters
END_FUNCTION
BEGIN_FUNCTION addAndFunction
add r0, r0, r1 // Return the sum of the first 2 function parameters
ands r0, r0, r2 // Ands the result of r0 and the third parameter passed
END_FUNCTION
因此,如果我调用以下命令:
addFunction(10,20)
我得到了我所期望的。但是如果我尝试
int addOne = addFunction(0xffff,0xffff); // Result = -2
int addTwo = 0xffff + 0xffff; // Result = 131070
我的 addOne 最终与我的 add 2 的值不同。关于我在这里做错了什么的任何想法?