windows - fejl VarBstrFromR8 i samling 64 bits

Indlæg af Hanne Mølgaard Plasc

Problem



I montage 32 bit er dette lille program ok


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


Resultatet er OK: 6.28


Ved montering i 64 bit er resultatet 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


Hvor er fejlen ?? tak skal du have

Bedste reference