AT& T上的浮点除法

时间:2018-03-19 14:29:35

标签: assembly

我有一个程序,我应该计算平均值 为此,我需要将总和除以n 但它们是整数,我希望结果是浮点数 我怎么能用语法

来做

让我们说

.data
    Sum: .quad 2212
    N:      .quad 20

现在我应该如何申报平均值并进行计算

         .global _start
     .data
    message: .string "Elements of the list: \n"
    message1: .string "Sum of elements in the list= %d \n"
    message2: .string "Average of elements in the list= %lf \n"
    message3: .string "Key %d is found at location %d in the list\n"
    message4: .string "Key occurs %d times in the list \n"
    formatd: .string "%ld\n"
    buf: .skip 1024
    a: .float 5.0
    b: .float 2.0
    sum: .quad 0
    avg: .double 0
    key: .quad 32
    N: .quad 20
    count: .quad 0
    list:   .quad 12
            .quad 23
            .quad 32
            .quad 84
            .quad 121
            .quad 34
            .quad 23
            .quad 32
            .quad 93
            .quad 22
            .quad 56
            .quad 32
            .quad 949
            .quad 123
            .quad 99
            .quad 23
            .quad 32
            .quad 289
            .quad 99
            .quad 34

这是一个数组,我正在遍历它并找到总和和平均值我也在寻找关键

       .text
    _start:
    movq $1, %rax           
    movq $1, %rdi
    movq $message, %rsi
    movq $24, %rdx
    syscall

    xorq %rcx, %rcx
    loop:
    pushq %rax
    pushq %rbx
    pushq %rcx
    movq $0, %rax
    movq $formatd, %rdi  
    movq $list, %rbx
    movq (%rbx,%rcx,8), %rsi
    addq %rsi, sum
    call printf
    popq  %rcx
    popq  %rbx
    popq  %rax

    inc %rcx
    cmp $20,%rcx
    jl loop



    pushq %rax
    pushq %rbx
    pushq %rcx
    movq $0, %rax
    movq $message1, %rdi  
    movq sum, %rsi
    call printf
    popq  %rcx
    popq  %rbx
    popq  %rax

到此为止我正在计算总和并显示每个元素

    #here i want to find avg
    #

    pushq %rax
    pushq %rbx
    pushq %rcx
    movq $0, %rax
    movq $message2, %rdi  
    movq  avg, %rsi
    call printf
    popq  %rcx
    popq  %rbx
    popq  %rax

这里我想找到平均值并显示它

1 个答案:

答案 0 :(得分:1)

让我假设你是在长模式下编程。如果您使用的是x87浮点单元,则通用方法如下所示:

fildq sum(%rip)  # load sum
fildq N(%rip)    # load N
fdivrp           # divide sum by N and pop

结果将在%st(0)。如果N是32位整数,则可以改为:

fildq sum(%rip)  # load sum
fidivl N(%rip)   # divide by integer sum

如果您使用的是SSE浮点单元,则代码如下所示:

cvtsi2sdq sum(%rip),%xmm0 # load sum
cvtsi2sdq N(%rip),%xmm1   # load N
divsd     %xmm1,%xmm0     # divide sum by N

结果位于xmm0