gpt4 book ai didi

c++ - assembly 打印 float

转载 作者:行者123 更新时间:2023-11-28 07:52:08 25 4
gpt4 key购买 nike

我在汇编中的以下操作遇到了一些麻烦。我正在组装 IA32。假设 -4(%ebp)=x 和 -8(%ebp)=y 我已经从用户那里得到了它们。这是代码:

format1:    .string "Multiply : %u * %u = %llu\n"
format2: .string "Divide : %u / %u = %u\n"

# operation multiply
movl -4(%ebp), %eax
mull -8(%ebp)
pushl %edx
pushl %eax
pushl -8(%ebp)
pushl -4(%ebp)
pushl $format1
call printf

# operation divide
movl -4(%ebp), %eax
divl -8(%ebp)
pushl %eax
pushl -8(%ebp)
pushl -4(%ebp)
pushl $format2
call printf

乘法结果在 %llu 中的原因是因为我希望能够将 2 个长数字相乘并打印结果,即使它达到 64 字节。而且在 %edx 中,mull 命令保存了 64 字节结果的“其他 32 字节”,所以我需要将它插入堆栈以及 printf。例如我想要这个输出:

 Multiply : 4000000000 * 2 = 16000000000

此外,我希望 3 除以 4 的操作返回 X.YZ 结果。 (尾数不超过2位,不四舍五入)例如

Divide : 3 / 4 = 0.75

对于 19 和 1000:

Divide : 19 / 1000 = 0.01

对于 8 和 2:

Divide : 8 / 2 = 4.00

我真的很努力地想得到结果,但没有成功。多谢! :)

最佳答案

是的,您当然可以使用scanf,只需传递正确的参数即可。如您所知,对于浮点结果,您需要使用一些浮点除法和浮点格式进行打印。

请注意,根据调用约定,您应该保留ebx 寄存器的值。此外,您应该保持堆栈平衡,最好是对齐。

可能的解决方案:

.comm x,4,4
.comm y,4,4

.section .rodata

format1: .string "Div : %d / %d = %g\n"
format2: .string "Mod : %d %% %d = %d\n"
format3: .string "%d %d"

.text
.globl main
.type main, @function
main:
subl $32, %esp # allocate space, preserve alignment

movl $format3, (%esp)
movl $x, 4(%esp)
movl $y, 8(%esp)
call scanf

# operation divide
fildl x
fidivl y
fstpl 12(%esp) # x / y

movl $format1, (%esp)
movl x, %eax
movl %eax, 4(%esp)
movl y, %eax
movl %eax, 8(%esp)
call printf

# operation modulo
movl x, %eax
cltd
idivl y
movl $format2, (%esp)
movl x, %eax
movl %eax, 4(%esp)
movl y, %eax
movl %eax, 8(%esp)
movl %edx, 12(%esp)
call printf

addl $32, %esp
xor %eax, %eax
ret

参见 code in operation .

关于c++ - assembly 打印 float ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13554394/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com