如何用汇编语言计算判别式(b ^ 2 - 4ac)

时间:2013-03-02 04:13:54

标签: assembly x86

大家好我是汇编语言的新手,我无法弄清楚如何创建一个程序来读取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

1 个答案:

答案 0 :(得分: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等。