用汇编语言编写,使用x64架构,使用Dosbox环境,统一用16位:从键盘任意输入a,b,c的值,编程计算并输出一元二次方程ax2+bx+c=0的根,能对输入参数进行判断,结果保留两位小数,数据的输入和结果的输出都要有必要的提示,且提示独占一行
时间: 2024-05-08 08:21:04 浏览: 91
一个用汇编语言写的计算器
很好,这个问题需要使用汇编语言编写程序,使用x64架构,并在Dosbox环境下运行。我将为你提供参考代码,你可以在此基础上进行修改和优化。
```
.model small
.stack 100h
.data
msg1 db 'Please input the value of a, b, c:', '$'
msg2 db 'The equation has no solution!', '$'
msg3 db 'The equation has one solution: x=', '$'
msg4 db 'The equation has two solutions: x1=', '$'
msg5 db ' and x2=', '$'
a dw ?
b dw ?
c dw ?
delta dw ?
x1 dd ?
x2 dd ?
.code
main proc
mov ax, @data
mov ds, ax
;显示提示信息1
lea dx, msg1
mov ah, 9
int 21h
;读取a的值
mov ah, 1
int 21h
sub al, '0'
mov a, ax
;读取b的值
mov ah, 1
int 21h
sub al, '0'
mov b, ax
;读取c的值
mov ah, 1
int 21h
sub al, '0'
mov c, ax
;计算delta
mov ax, b
imul b
mov cx, 4
mov bx, a
imul c
sub ax, bx
mov delta, ax
;判断delta的值
cmp delta, 0
jg delta_positive ;delta>0
je delta_zero ;delta=0
jmp delta_negative ;delta<0
delta_positive:
;计算x1和x2
mov ax, b
neg ax
mov bx, delta
fsqrt
mov dx, 0
mov x1, ax
mov x2, ax
mov ax, b
mov cx, 2
imul cx
idiv x1
mov x1, ax
mov ax, x1
neg ax
mov x2, ax
;显示提示信息4和5
lea dx, msg4
mov ah, 9
int 21h
mov ax, x1
call print_float
lea dx, msg5
mov ah, 9
int 21h
mov ax, x2
call print_float
jmp end_prog
delta_zero:
;计算x1
mov ax, b
neg ax
mov cx, 2
imul cx
mov dx, 0
mov x1, ax
mov ax, x1
mov dx, 0
;显示提示信息3
lea dx, msg3
mov ah, 9
int 21h
mov ax, x1
call print_float
jmp end_prog
delta_negative:
;显示提示信息2
lea dx, msg2
mov ah, 9
int 21h
jmp end_prog
end_prog:
mov ah, 4ch
int 21h
main endp
;打印浮点数
print_float proc
push ax
push bx
push cx
push dx
mov cx, 100 ;小数位数
mov bx, 10 ;除数
mov dx, 0 ;存储小数部分
div_loop:
xor dx, dx
div bx
push dx ;将余数存入栈中
dec cx
cmp ax, 0 ;商为0时退出循环
jne div_loop
mov bx, 10 ;除数
mov cx, 0 ;计数器清0
int_part: ;计算整数部分
xor dx, dx
div bx
push dx ;将余数存入栈中
inc cx ;计数器加1
cmp ax, 0 ;商为0时退出循环
jne int_part
mov ah, 2 ;打印整数部分
pop ax
add al, '0'
int 21h
dec cx ;计数器减1
mov ah, 2 ;打印小数点
mov dl, '.'
int 21h
print_loop: ;打印小数部分
pop ax
add al, '0'
mov ah, 2
int 21h
inc cx
cmp cx, 100 ;最多打印100位小数
je end_print
cmp sp, 0 ;栈空退出循环
jne print_loop
end_print:
pop dx
pop cx
pop bx
pop ax
ret
print_float endp
end main
```
这个程序首先显示提示信息,读取a、b、c的值,计算delta,然后根据delta的值计算方程的根并输出结果。如果方程无解,程序会输出提示信息“the equation has no solution”。
请注意,这个程序使用了一个打印浮点数的子程序。这个子程序通过栈来实现对小数部分的存储和打印。由于x64架构下没有直接的浮点数处理指令,我们需要手动计算并打印浮点数。
阅读全文