套准打印中的值作为不同的数字

Value in register printing as a different number

所以我今年 spring 在大学修计算机课程,但我们没有得到任何体面的作业帮助。

我有一个程序使用加移法将两个二进制值相乘,该方法适用于任何符号的少量数字,但我需要它在作业的 B 部分使用 2 个特定数字。

调试时我发现代码在寄存器中存储了正确的产品,但打印后显示的数字与寄存器中的数字不同。

抱歉,如果我 post 编写了太多代码或没有 post 足够的信息,如果我需要对 post 进行任何更改,请告诉我。

代码全部通过 Putty 连接到 linux 上 运行 的学校服务器完成。

这是调试器显示寄存器 x3(存储 printf 格式的产品参数)在 print 语句之前保存正确数字的地方

(gdb) i r x3
x3             0x1850505038     104426655800

这是在打印错误数字的打印语句之后

(gdb) next
50              bl      printf
(gdb) next
522133279 times 200 equals 1347440696

这是程序

        define(multiplicand, w19)
        define(multiplier, w20)
        define(product, w21)
        define(i, w22)
        define(temp3, w23)

        define(result, x24)
        define(temp1, x25)
        define(temp2, x26)

fmt:    .string "Multiplicand: %d \nMultiplier: %d\n"
msg:    .asciz "%d times %d equals %d\n"
        .balign 4
        .global main
main:   stp     x29, x30, [sp, -16]!
        mov     x29, sp

        mov     multiplicand, 0b11111000111110001111100011111
        mov     multiplier, 0b11001000

        adrp    x0, fmt
        add     x0, x0, :lo12:fmt
        mov     w1, multiplicand
        mov     w2, multiplier
        bl      printf

        mov     i, 0
        mov     temp3, 1
loop:
        cmp     i, 32
        b.eq    print
        tst     multiplier, temp3
        b.eq    count
        uxtw    temp1, multiplicand
        uxtw    temp2, i
        lsl     temp1, temp1, temp2
        add     result, result, temp1
count:
        add     i, i, 1
        lsl     temp3, temp3, 1
        b       loop
print:
        ldr     x0, =msg
        mov     w1, multiplicand
        mov     w2, multiplier
        mov     x3, result
        bl      printf

        mov     w0, 0
        ldp     x29, x30, [sp], 16
        ret

没有错误消息

我要计算的表达式是:

522133279 * 200 = 104 426 655 800

打印的值为 1 347 440 696,但此值来自寄存器,该寄存器在打印语句之前立即存储了正确的值

  1. 1347440696 的十六进制是 0x50505038
  2. 104426655800 的十六进制是 0x1850505038

你看到问题了吗?

确保格式字符串(见评论)与您实际提供给 printf

的数据匹配