套准印刷中的值作为不同的数字[重复]

Posted

技术标签:

【中文标题】套准印刷中的值作为不同的数字[重复]【英文标题】:Value in register printing as a different number [duplicate] 【发布时间】:2019-05-27 02:33:02 【问题描述】:

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

我有一个程序使用 add-shift 方法将两个二进制值相乘,该方法适用于任何符号的少量数字,但我需要它与 2 个特定数字一起用于赋值的 B 部分。

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

抱歉,如果我发布了太多代码或没有发布足够的信息,请告诉我是否应该更改帖子的任何内容。

代码都是通过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 104426655800 十六进制是0x1850505038

你看到问题了吗?

确保格式化字符串(见注释)与您实际提供给printf的数据相匹配

【讨论】:

而解决方案是处理 64 位整数的格式字符串,例如 %lld (long long),因为它们正在将 64 位结果加载到 @ 987654327@. 糟糕,感谢彼得指出这一点。我输入得太快了,忽略了我有这个向后的事实,我会修改答案。 谢谢你们,我已经尝试过 %ld 但我不知道我应该使用 %lld。感谢您的快速回答,我真的很感激。 @Kweestor:你使用什么平台,long 是 AArch64 上的 32 位类型?我认为它通常等于大多数非 Windows 平台上的指针宽度。是的,刚刚在 AArch64 Linux GCC 上检查了 sizeof(long) = 8:godbolt.org/z/Zyel-m。所以%ld 应该等价于%lld(都是有符号的 64 位整数)。 我第一次尝试%ld时一定做错了什么。

以上是关于套准印刷中的值作为不同的数字[重复]的主要内容,如果未能解决你的问题,请参考以下文章

XForms 重复:相同的元素名称,不同的值约束

急!谁能帮我找一篇机械英文论文,并翻译成中文

在ci中交换两个数字只是google c程序中的编码然后我写的代码是不同的

印刷设计工作中的经验和教训

自强队视觉组训练项目-3 | 20180107-印刷体数字识别

根据不同列中的值删除重复项