Assembly 臂装配部
对于赋值,我需要将数字提升到标准输入输入输入的幂(我需要处理浮点数)。我的想法是使用计数器进行while循环,如果整数为负,则将1除以实际数(如将其提高到-1)。问题是,我不知道如何在手臂装配中进行分割,我已经搜索过了,但没有运气,我唯一发现的是有人模糊地提到旋转。如果有人能给我指出正确的方向,那就太完美了。顺便说一下,我正在使用ARMSim v5 编辑:我用gcc-S编译了一个c文件,结果在ARMSim中出现了一些错误,我不明白为什么:Assembly 臂装配部,assembly,arm,division,Assembly,Arm,Division,对于赋值,我需要将数字提升到标准输入输入输入的幂(我需要处理浮点数)。我的想法是使用计数器进行while循环,如果整数为负,则将1除以实际数(如将其提高到-1)。问题是,我不知道如何在手臂装配中进行分割,我已经搜索过了,但没有运气,我唯一发现的是有人模糊地提到旋转。如果有人能给我指出正确的方向,那就太完美了。顺便说一下,我正在使用ARMSim v5 编辑:我用gcc-S编译了一个c文件,结果在ARMSim中出现了一些错误,我不明白为什么: .file "xd.c" .text
.file "xd.c"
.text
.globl x
.data
.align 4
.type x, @object
.size x, 4
x:
.long 6
.text
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
movl x(%rip), %eax
movl %eax, %edx
shrl $31, %edx
addl %edx, %eax
sarl %eax
movl %eax, x(%rip)
movl x(%rip), %eax
popq %rbp
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE0:
.size main, .-main
.ident "GCC: (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0"
.section .note.GNU-stack,"",@progbits
不确定你看了哪里,指令集引用应该是个好地方。它列出了作为浮点除法的
VDIV
。对于1/x
,您可能需要浮点运算。请查看C编译器的输出,了解您想法的C实现。你可以考虑用基数的倒数和指数的绝对值来处理负数,然后使用你的标准乘法循环。(这应该表现得更好,只需要一个循环,而不是两个版本。)即使ISA有一个除法,乘1/x也是很常见的,因为乘法更快,我说的是定点而不是浮点,转换为浮点做除法,然后返回比只做整数乘法和移位更糟糕。另一种解决方案是使用C编译器库gcclib(基本上用于gcc)。做自己的长除法也很简单,如果你想做的话,它比在循环中进行减法要快,当然也行。如果这是同一个赋值,那么你应该注意这是针对浮点数的。您还应该指定要使用的浮点单元(VFP、NEON或其他),这就是x86-64程序集。显然,它不会用ARM汇编程序进行组装。使用ARM编译器。e、 g.在提供arm none eabi gcc
的软件包上或安装该软件包。如果不确定查找的位置,说明集参考将是一个好地方。它列出了作为浮点除法的VDIV
。对于1/x
,您可能需要浮点运算。请查看C编译器的输出,了解您想法的C实现。你可以考虑用基数的倒数和指数的绝对值来处理负数,然后使用你的标准乘法循环。(这应该表现得更好,只需要一个循环,而不是两个版本。)即使ISA有一个除法,乘1/x也是很常见的,因为乘法更快,我说的是定点而不是浮点,转换为浮点做除法,然后返回比只做整数乘法和移位更糟糕。另一种解决方案是使用C编译器库gcclib(基本上用于gcc)。做自己的长除法也很简单,如果你想做的话,它比在循环中进行减法要快,当然也行。如果这是同一个赋值,那么你应该注意这是针对浮点数的。您还应该指定要使用的浮点单元(VFP、NEON或其他),这就是x86-64程序集。显然,它不会用ARM汇编程序进行组装。使用ARM编译器。e、 g.安装或安装提供arm none eabi gcc