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 位。请注意,根据您使用的汇编程序, for 的语法[WORD b]可能会发生变化。我看到了一些用途[WORD PTR b]或只是WORD b或类似的东西。

于 2013-03-02T04:23:22.733 回答