0

私はこの課題に取り組んできましたが、単純なはずの最初の部分の 1 つを通過できません。私は教授と一緒にそれを調べましたが、彼もそれを理解できません.私はここでいくつかの助けを望んでいました. 数値を入力してst0にプッシュし、ポップしてtotal_meanに保存したいだけです。テスト目的で、最初にコードをコメントアウトしました。

extern printf
extern scanf

segment .data
    prompt_name db "Please enter you name: ", 0
    input_name db "%s %s",0
    ready db "Please have your numberic data ready",10,0
    get_num db "Enter a floating number: ",0
    stringdata db "%s",0

    namedata db "%s ",0
    display_name db "%s",10,0
    floatdata db "%Lf",0
    ask db "Are there more numbers (Y or N)? ", 0

    mean db "The mean of these %d values is %Lf",10,0
    largest db "the largest value is %Lf",10,0
    smallest db "the smallest value is %Lf",10,0

    more db "Do you have more data to analyze (Y or N)? ",0

    bye db "Thank you %s. I hope you enjoyed this program.",10,0


segment .bss
    user_float: resq 1
    large: resq 1
    small: resq 1
    total_mean: resq 2
    first_name: resb 32
    last_name: resq 32

segment .text

    global start_loop

start_loop:

;   mov rax,0
;   mov rdi, stringdata
;   mov rsi, prompt_name
;   call printf
;
;   mov qword rax, 0
;   mov rdi, input_name
;   mov rsi, first_name
;   mov rdx, last_name
;   call scanf
;
;   mov rax, 0
;   mov rdi, namedata
;   mov rsi, first_name
;   call printf
;
;   mov rax, 0
;   mov rdi, display_name
;   mov rsi, last_name
;   call printf
;
;   mov rax, 0
;   mov rdi, stringdata
;   mov rsi, ready
;   call printf
;
;   mov rax, 0
;   mov rdi, stringdata
;   mov rsi, get_num
;   call printf

    mov qword rax, 0
    push qword 0
    push qword 0
    mov rdi, floatdata
    mov rsi, rsp
    call scanf

    push qword 0
    push qword 0

    fld tword [rsp]
    fmul

    fstp tword [total_mean]

    mov qword rax, 0
    mov qword rax,0
    mov rdi, floatdata
    mov rsi, total_mean
    call printf

    pop rax
    pop rax
    pop rax
    pop rax

ret

問題を抱えているキーボードから入力を取得しようとしているのは、下半分だけです。12.0などの数値を入力して表示すると0.00000と表示されます。誰でもこれに対する解決策を見つけるのを手伝ってもらえますか?

4

1 に答える 1

0

x86-64では、80387 fpu スタックではなく、レジスタでdouble引数を渡します。XMMここで SystemV ABI を使用しているので (printfおよびscanf呼び出しで表示されます)、最初のdouble引数をXMM0に、(もしあれば) 2 番目の引数を に、というXMM1ように ( までXMM7) 入れてください。

于 2013-02-16T00:30:55.083 に答える