程序集64位错误VarBstrFromR8

时间:2017-02-15 13:32:58

标签: windows api assembly x86-64

在程序集32位这个小程序没问题

pi    dq 3.14

val1  dq 2.0

;=======================================
; segment des données non initialisées
;=======================================
segment .bss
hMain   resd 1

qResult resq 1

ptResult resq 1

szResult  resb 100

;=======================================
; segment de code
;=======================================

segment .text

    global Main

    extern VarBstrFromR8,WideCharToMultiByte
Main:

    finit
    fld qword [pi]   ; store pi
    fmul qword [val1]  ; multiplier par 2
    fstp    qword [qResult]  ; stockage du résultat

    ;conversion en unicode
    push ptResult
    push LOCALE_NOUSEROVERRIDE
    push LOCALE_CUSTOM_DEFAULT
    push dword[qResult+4]
    push dword[qResult]
    call VarBstrFromR8
    mov ebx,__LINE__ - 1
    cmp  eax,NULL
    jne   .gestionerreurs

    ;conversion unicode ==> Ansi

    push NULL
    push NULL
    push 80    ; taille du buffer
    push szResult
    push -1
    push dword [ptResult]
    push WC_COMPOSITECHECK
    push CP_ACP
    call WideCharToMultiByte
    mov ebx,__LINE__ - 1
    cmp  eax,NULL
    je   .gestionerreurs

    push __LINE__
    push  szResult
    push 2
    call vidagememwin

结果还可以:6.28

在64位汇编中,结果为0 !!

iAlign  align 8

pi    dq 3.14

val1  dq 2.0


;=======================================
; segment des données non initialisées
;=======================================
segment .bss
hMain   resq 1
qResult resq 1
ptResult resq 1
szResult  resb 100


;=======================================
; segment de code
;=======================================
segment .text
    global Main

Main:

    sub rsp, 8h     ; alignement de la pile avant tout appel de procédure

    sub rsp,20h

    finit

    fld qword [pi]   ; stockage PI

    fmul qword [val1]  ; multiplier par val1

    fstp    qword [qResult]  ; stockage du résultat


    mov rcx,[qResult]
    mov rdx,LOCALE_CUSTOM_DEFAULT
    mov r8,LOCALE_NOUSEROVERRIDE
    mov r9,ptResult
    call VarBstrFromR8
    ;add rsp,10h
    mov r9,__LINE__ - 1
    cmp  eax,NULL
    jne   .gestionerreurs

    ;conversion unicode ==> Ansi
    add rsp,20h
    push NULL
    push NULL
    push 80    ; taille du buffer
    push szResult
    sub rsp,20h
    mov rcx,CP_ACP
    mov rdx,WC_COMPOSITECHECK
    mov r8,[ptResult]
    mov r9,-1
    call WideCharToMultiByte
    add rsp,20h
    mov r9,__LINE__ - 1
    cmp  eax,NULL
    je   .gestionerreurs  

    push __LINE__
    push  szResult
    push 2
    call affmemoireP

错误在哪里?谢谢

0 个答案:

没有答案