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