Assembly 转换为c++;连接臂组件
我试图将此代码转换为arm汇编,但遇到了一些问题Assembly 转换为c++;连接臂组件,assembly,arm,Assembly,Arm,我试图将此代码转换为arm汇编,但遇到了一些问题 // Multiply with current digit of first number // and add result to previously stored result // at current position. int sum = n1*n2 + result[i_n1 + i_n2] + carry; // Carry for next i
// Multiply with current digit of first number
// and add result to previously stored result
// at current position.
int sum = n1*n2 + result[i_n1 + i_n2] + carry;
// Carry for next iteration
carry = sum/10;
// Store result
result[i_n1 + i_n2] = sum % 10;
i_n2++;
}
到目前为止,这就是我所拥有的,我最大的问题是它正在增加的部分
int sum = n1*n2+result[i_n1 + i_n2] + carry
i_n1
和i_n2
只是用于在result
n1
中查找位置的索引,n2
是数字result
是指向内存的指针。我还遇到了一个较小的问题,由于我在中如何使用MOD
,编译器给了我错误;结果[i_n1+i_n2]=总和%10代码>有人能告诉我我做错了什么以及如何纠正吗
这就是我目前所拥有的
;int sum = n1*n2 + result[i_n1 + i_n2] + carry;
ldr r0,=carry
ldr r1,=i_n1
str r1,[r1] ;stores value of r1 into r1
ldr r2,=i_n2
str r2,[r2] ; stores value of r2 in r2
ldr r3,=result
add r4,r1,r2 ; value of i_n1+ value of i_n2
ldr r5,=n2
ldr r6,=n1
mul r7, r5,r6
;carry = sum/10;
mov r1,#10
ldr r2,=sum
sdiv r0,r2,r1 ;divide r2 by r0 sum/10
ldr r3,=carry
str r0,[r3]
;result[i_n1 + i_n2] = sum % 10;
ldr r0,=sum
***mov r1,r0,MOD 10 ;divides r0 by mod 10 and stores remainder in r1*****
ldr r2,i_n1
ldr r3,=i_n2
add r4,r2,r3 ;i_n1+i_n2
ldr r5,=result
str r1,[r5] ;stores value of sum %10 into r5 which is result
;i_n2++;
add r3,#1
正如Fuz所说,在武器装配中没有MOD命令。
无论如何,您可以使用subs创建mod函数。
事实上,我不太擅长组装,但我做了一个似乎有效的例子
.data
n1: .word 10
n2: .word 15
carry: .word 5
vector: .word 1, 2, 3, 4, 5, 6, 7
in1: .word 2
in2: .word 1
.text
main:
;Load n1, n2, carry, in1, in2
ldr r0, =n1
ldr r0, [r0]
ldr r1, =n2
ldr r1, [r1]
ldr r2, =carry
ldr r2, [r2]
ldr r3, =in1
ldr r3, [r3]
ldr r4, =in2
ldr r4, [r4]
;Load vector
ldr r5, =vector
add r5, r5, r3, lsl #2 ;Add in1 << 2 (Each pos is a word)
add r5, r5, r4, lsl #2 ;Add in2 << 2
ldr r6, [r5]
;int sum = n1*n2+result[_n1 + i_n2] + carry
mul r7, r0, r1
add r7, r7, r6
add r7, r7, r2
;Passing argument in r0 (Saving r0 in r8)
mov r8, r0
mov r0, r7
bl dividebyten
mov r2, r0
;Restore sum in r0 to get mod
mov r0, r7
bl mod
str r0, [r5]
;Restore n1 in r0
mov r0, r8
add r4, r4, #1
swi 0x11
mod:
stmfd sp!, {r1 - r9, lr}
mov r1, #10
mov r2, r0
iter:
cmp r2, r1
blt exit
sub r2, r2, r1
b iter
dividebyten:
stmfd sp!, {r1 - r9, lr}
mov r1, #10
mov r2, #0
loop:
cmp r0, r1
blt exit
add r2, r2, #1
sub r0, r0, r1
b loop
exit:
mov r0, r2
ldmfd sp!, {r1 - r9, pc}
.end
.data
n1:单词10
n2:单词15
携带:。字5
向量:。单词1,2,3,4,5,6,7
in1:。单词2
in2:.单词1
文本
主要内容:
;加载n1、n2、进位、in1、in2
ldr r0,=n1
ldr r0,[r0]
ldr r1,=n2
ldr r1,[r1]
ldr r2=进位
ldr r2,[r2]
ldr r3,=in1
ldr r3,[r3]
ldr r4,=in2
ldr r4,[r4]
;负载向量
ldr r5,=向量
添加r5、r5、r3、lsl#2;加在1中没有MOD 10
操作数修饰符。你认为为什么会存在这样的东西?@LưuVĩnhPhúc:不是重复的:OP想要一个运行时操作,但使用操作符进行汇编时操作,而不是asm指令。使用ARM上的操作数修饰符可以执行的唯一运行时操作是移位/旋转。@PeterCordes我知道,但有一个运行时解决方案,在这个问题上sdiv
比减法循环快得多,除了非常小的输入,其中循环只运行一次或两次。您可以使用sdiv
结果(OP已经使用该结果来获取sum/10
)以编译器的方式获得模结果,方法是再次相乘和相减x%10=x-10*(x/10)
ldr r3,=in1
ldr r3,[r3]
ldr r4,=in2
ldr r4,[r4]
它们到底在做什么?我以为这些都是假设告诉我从右到右有多远的结果?难道这些不只是加载存储在地址中的值吗?另外,我的程序是整数相乘,而你的程序是字相乘。谢谢@PeterCordes,我不知道sdiv的存在。@Shazee ldr r3,=in1加载in1存储位置的地址。与另一个ldr r3相比,[r3]您正在r3中加载r3指向的内存地址的值。@Shazee:阅读Steph的答案,并在调试器中运行代码。在指令运行后查看寄存器和内存中的值,注意它们不是您想要的str
将寄存器值存储到内存中,但它将在该点保存指针值。(在程序开始时,将任何内容存储到n1
是没有意义的;如果要这样做,您应该在n1
中添加一个不同的静态值作为开始!或者更好,根本不使用静态存储,而只使用寄存器来保存所需的值。)