所以我今年春天正在上大学的计算机科学课程,我们在作业方面得不到任何体面的帮助。
我有一个程序,使用加法移位法将两个二进制值相乘,该方法对任何符号的小数都适用,但是我需要在赋值B的部分使用2个特定数字。
在调试时,我发现代码在寄存器中存储了正确的乘积,但在打印后显示的数字与寄存器中的数字不同。
很抱歉,如果我发布的代码过多或发布的信息不足,请告诉我是否应该更改有关该帖子的任何内容。
代码全部通过腻子连接到在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 = 104426655800
打印出的值是1 347 440 696,但是该值来自在打印语句前立即存储了正确值的寄存器
答案 0 :(得分:0)
0x50505038
0x1850505038
您看到问题了吗?
确保格式字符串(请参阅注释)与您实际向printf
馈送的数据相匹配