Assembly 转换为c++;连接臂组件

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

我试图将此代码转换为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 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
中添加一个不同的静态值作为开始!或者更好,根本不使用静态存储,而只使用寄存器来保存所需的值。)