套准印刷中的值作为不同的数字[重复]
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
时一定做错了什么。以上是关于套准印刷中的值作为不同的数字[重复]的主要内容,如果未能解决你的问题,请参考以下文章
在ci中交换两个数字只是google c程序中的编码然后我写的代码是不同的