0

こんにちは、私はアセンブリ言語が初めてで、3 つの 16 ビット整数 a、b、c を読み取って判別式を計算するプログラムを作成する方法がわかりません。(b^2-4ac) 誰か助けてくれませんか? これまでのところ、プログラムで a と c を乗算することから始めました。

.data
Prompt  BYTE        "Enter a number ?" , 0
Message BYTE        "The discriminant is: ", 0
b       SDWORD  ?
a       SDWORD  ?
cc      SDWORD  ?
discriminant    SDWORD  ?
.code
main        PROC
mov edx, OFFSET Prompt          ; EDX must have the string's offset
    call    WriteString     ; Call the procedure to write a string
    call    ReadInt         ; Call the procedure to read an integer
    mov a, eax          ; The integer is read into AL, AX or EAX

    mov edx, OFFSET Prompt  ; Read another integer 
    call    WriteString
    call    ReadInt
    mov cc, eax

mov eax, a                          ; AL AX or EAX must have the
                    ;  multiplicand
    cdq             ; Clear the EDX register
    imul    cc          ; One operand - the multiplier
    mov Product, eax            ; The product is in AL, AX or EAX
4

1 に答える 1

1

16ビット入力を使用していると言うので、a、b、およびcは16ビット整数であると予想されます。これにより、32 ビットの署名付きの結果が得られます。これで、次のことができます。

; Get b ^ 2 into EBX
movsx eax, [WORD b] ; Sign extend b to 32bit
imul eax            ; Multiply
mov ebx, eax        ; Put the result into ebx

; Get 4ac into EAX
movsx eax, [WORD a] ; Sign extend a to 32bit
shl eax, 2          ; Multiply by 4
movsx ecx, [WORD c] ; Sign extend c to 32bit
imul ecx            ; EDX:EAX = 4 * a * c

; Subtract, the result is in EBX
sub ebx, eax

あなたの例がそうであったので、これは32ビットオペランドを使用しています。16 ビット オペランドで同等の処理を行うことができますが、32 ビットの結果に対して行った場合は、DX:AX から 32 ビットに変換する必要があります。使用しているアセンブラによっては、構文が異なる場合があることに注意してください[WORD b]。私はいくつかの使用[WORD PTR b]またはWORD bそのようなものを見てきました。

于 2013-03-02T04:23:22.733 に答える