一元二次方程ax2+bx+c=0求解。
1、要求在数据段中定义a、b、c、x,a、b、c初值不限;
2、程序执行过程中通过debug修改参数a、b、c的值
3、计算的结果保存在变量x中。
1、实验目的
2、简单的程序流程图
3、实验过程中内存状况截图及运行结果截图。
4、完整的代码(包括必要的注释)
1.深刻理解计算机底层硬件设计与运行的工作原理
2.学习面向底层的编程思想
3.深刻理解并利用14个寄存器对CPU进行控制
4.掌握编写汇编程序的能力,深刻理解段的概念,程序中所有被计算机所处理的信息都可以被放在一个段中,但是为了提高开发者的开发效率,更提倡将指令、数据、栈等不同的信息划分为不同的段
5.理解跳转的本质并熟练掌握和运用
6.理解高级语言中的循环以及分支等结构在底层语言中如何实现
7.熟练使用标志位,利用运算结果标志和状态控制标志与其他指令配合使用
8.理解汇编程序中指令和伪指令,伪指令只在编译时起作用,并不会被翻译成机器码
9.掌握描述性符号语言,并熟练的与汇编指令进行转换
10.熟悉理解并运用基础汇编指令编写汇编程序
11.比较高级语言与汇编语言之间的异同之处
12.熟练运用-e,-t,-d等命令对CPU中各种寄存器的内容、内存的情况以及机器码等跟踪程序的运行
13.理解计算机显示字符的原理并修改屏幕上字符串的显示模式
14.理解程序返回的指令,是汇编指令,在程序结束后,将CPU的控制权还给操作系统
15.学会描述汇编程序的流程图设计
DATAS SEGMENT
;定义数据,a,b,c为一元二次方程的参数
;t 用来存储 b * b - 4 * a * c 的值
;s 用来保存 t 的平方根
;x1, x2用来保存实根最终结果
;y1, y2用来保存虚根的结果
;当 ▲ > 0 时,x1, x2为不同的值
;当 ▲ = 0 时,x1, x2为相同的值
;当 ▲ < 0 时,x1, x2用来保存实部,y1,y2 用来保存虚部
a DB 0
b DB 0
c1 DB 0
t DW 0
s DB 0
x1 DW 0
x2 DW 0
y1 DW 0
y2 DW 0
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
;对ds进行初始化,使ds指向datas
MOV AX,DATAS
MOV DS,AX
;******************************计算 b * b - 4 * a * c******************************
;计算b*b
;运用有符号类型的乘法,将(al)* b保存在ax中,再传输至dx中
MOV al, b
IMUL b
MOV dx, ax
;计算4*a*c
MOV al, a
MOV bl, 4
IMUL bl
IMUL c1
;计算 b * b - 4 * a * c,将结果存储在t变量中
SUB dx, ax
MOV t, dx
;********************************求解t的平方根********************************
;此处代码相当于:
;for(int i = 1; i <= t; i ++)
; if(i * i == t)
; s = i;
;cmp修改符号位,不存储计算结果
CMP t, 0
;当t小于0时,转到LESS0执行
JLE LESSE0
;修改计数寄存器,控制循环次数
MOV cx, t
MOV dl, 0
SQUARE:
;dl += 1;
INC dl
MOV al, dl
IMUL dl
;若b * b - 4 * a * c 能被开方,则零标志为1,JE跳转
cmp ax, t
JE ROOTING
;当cx为零时,跳出循环
LOOP SQUARE
;************************************▲ > 0求解********************************
;根据公式x1= (-b + s) / (2 * a), x2 = (-b - s) / (2 * a)给x1,x2赋值
ROOTING:
;当前的平方根存储在dl中,将平方根结果传输到s中
MOV s, dl
;**********求解x1************
MOV al, b
;求补指令,得到-b
NEG al
;得到中间结果(-b + s),保存在dl中
ADD al, s
MOV dl, al
;计算2 * a
MOV al, a
MOV bl, 2
IMUL bl
;计算(-b + s) / (2 * a),将结果存储在x1中
MOV bl, al
MOV al, dl
MOV dl, bl
IDIV dl
MOV x1, ax
;**********求解x2************
;求解(-b - s),
MOV al, b
NEG al
SUB al, s
MOV dl, al
;计算2 * a
MOV al, a
MOV bl, 2
IMUL bl
;计算(-b - s) / (2 * a),将结果存储在x2中
MOV bl, al
MOV al, dl
MOV dl, bl
IDIV dl
MOV x2, ax
;▲ > 0,则程序结束
CMP t, 0
JG S2
LESSE0:
;▲<0,跳转
CMP t, 0
JL L0
;************************************▲ = 0求解********************************
;求-b
MOV dl, b
NEG dl
;计算2 * a
MOV al, a
MOV bl, 2
IMUL bl
;x1 = x2 = -b / 2 * a
MOV bl, al
MOV al, dl
MOV dl, bl
IDIV dl
MOV x1, ax
MOV x2, ax
;程序结束,跳转结束指令
JMP s2
;************************************▲ < 0求解********************************
;求解虚部,y1 = t / 2 * a, y2 = (-t) / 2 * a
L0: ;计算t / 2 * a
MOV dx, t
MOV al, a
MOV bl, 2
IMUL bl
MOV bx, ax
MOV ax, dx
MOV dx, bx
IDIV dl
MOV y1, ax
;将ax中的数据取反,即(-t) / 2 * a
MOV dx, 0
SUB dx, ax
MOV y2, dx
;程序结束,将CPU还给操作系统
S2: MOV AH,4CH
INT 21H
CODES ENDS
END START