使用Visual Studio C ++的汇编语言如何声明float?

问题描述 投票:0回答:1

我在这里有我的代码,我不知道如何声明,输入和输出浮点类型编号。在c中,%f用于浮点数。我在我的代码中尝试过,但无法正常工作。我也尝试过REAL8。这是我的代码。我知道%d是整数,但是当我使用%f时,输出为0.000000,我无法输出确切的答案。

.386
.model flat, c
.stack 100h


printf      PROTO arg1:Ptr byte, printlist:VARARG
scanf       PROTO arg2:Ptr byte, inputlist:VARARG

.data
in1fmt      byte "%d" , 0
msg1fmt     byte 0Ah, "%s" , 0
msg2fmt     byte 0Ah, 0Ah, "%s" , 0
msg3fmt     byte 0Ah,"%s%d" , 0Ah, 0Ah, 0
msg4fmt     byte 0Ah,"%s%d" , 0Ah, 0Ah, 0Ah, 0Ah, 0
msg5fmt     byte 0Ah, "%s%d" , 0Ah, 0Ah,  0
msg1        byte "Enter any number: " , 0
msg2        byte "Enter another number: " , 0
msg3        byte "The sum is: " , 0
msg4        byte "The product is: " , 0
msg5        byte "The largest is: ", 0

num1        sdword ?
num2        sdword ?
sum         sdword ?
product     sdword ?
largest     sdword ?

.code
main        proc
INVOKE printf, ADDR msg1fmt, ADDR msg1
INVOKE scanf, ADDR in1fmt, ADDR num1
INVOKE printf, ADDR msg2fmt, ADDR msg2
INVOKE scanf, ADDR in1fmt, ADDR num2

mov eax, 0
mov eax, num1
add eax, num2
mov sum, eax
mov eax, 0
mov eax, num1
imul num2
mov product, eax
mov eax, 0
add eax, num1
.if eax > num2
mov eax, num1
mov largest, eax
.else
mov eax, 0
add eax, num2
mov largest, eax
.endif

INVOKE printf, ADDR msg3fmt, ADDR msg3, sum
INVOKE printf, ADDR msg4fmt, ADDR msg4, product
INVOKE printf, ADDR msg5fmt, ADDR msg5, largest

ret
main        endp
end
visual-studio assembly masm fpu
1个回答
0
投票

唯一真正的绊脚石是即使对于"%f",'printf'也希望堆栈上有一个double(REAL8)。

.686
.model flat, c

INCLUDELIB MSVCRT.LIB

; If MSVCRT.LIB doesn't exist try the first or both of the following libs
; includelib libcmt.lib
; includelib legacy_stdio_definitions.lib

printf     PROTO arg1:Ptr byte, printlist:VARARG
scanf      PROTO arg2:Ptr byte, inputlist:VARARG

.data
    in1fmt      byte "%f" , 0
    msg1fmt     byte 0Ah, "%s" , 0
    msg2fmt     byte 0Ah, 0Ah, "%s" , 0
    msg3fmt     byte 0Ah,"%s%f" , 0Ah, 0Ah, 0
    msg4fmt     byte 0Ah,"%s%f" , 0Ah, 0Ah, 0Ah, 0Ah, 0
    msg5fmt     byte 0Ah, "%s%f" , 0Ah, 0Ah,  0
    msg1        byte "Enter any number: " , 0
    msg2        byte "Enter another number: " , 0
    msg3        byte "The sum is: " , 0
    msg4        byte "The product is: " , 0
    msg5        byte "The largest is: ", 0

    num1        REAL4 ?
    num2        REAL4 ?
    sum         REAL8 ?         ; printf needs a double as argument
    product     REAL8 ?         ; printf needs a double as argument
    largest     REAL8 ?         ; printf needs a double as argument

.code
main proc
    INVOKE printf, ADDR msg1fmt, ADDR msg1
    INVOKE scanf, ADDR in1fmt, ADDR num1
    INVOKE printf, ADDR msg2fmt, ADDR msg2
    INVOKE scanf, ADDR in1fmt, ADDR num2

    fld num1
    fadd num2
    fstp sum

    fld num1
    fmul num2
    fstp product

    fld num1
    fld num2
    fcomi st,st(1)
    jnbe @F             ; Jump if ZF=0 & CF=0 - ST(0) > ST(1)
    fxch
    @@:
    fstp largest
    fstp st(0)              ; Just pop ST(0)

    INVOKE printf, ADDR msg3fmt, ADDR msg3, sum
    INVOKE printf, ADDR msg4fmt, ADDR msg4, product
    INVOKE printf, ADDR msg5fmt, ADDR msg5, largest

    xor eax, eax            ; Exitcode: 0
    ret
main endp
end
© www.soinside.com 2019 - 2024. All rights reserved.