汇编语言程序设计 --- 一元二次方程ax2+bx+c=0求解(含注释详细源代码)

目录

  • 一、实验内容
  • 二、实验说明
  • 三、实验报告要求
  • 四、实验目的
  • 五、 程序流程图
  • 六、内存变化情况
  • 七、源程序代码 (详细注释)

一、实验内容

一元二次方程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.学会描述汇编程序的流程图设计

五、 程序流程图

汇编语言程序设计 --- 一元二次方程ax2+bx+c=0求解(含注释详细源代码)_第1张图片

六、内存变化情况

汇编语言程序设计 --- 一元二次方程ax2+bx+c=0求解(含注释详细源代码)_第2张图片

汇编语言程序设计 --- 一元二次方程ax2+bx+c=0求解(含注释详细源代码)_第3张图片
汇编语言程序设计 --- 一元二次方程ax2+bx+c=0求解(含注释详细源代码)_第4张图片

七、源程序代码 (详细注释)

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

你可能感兴趣的:(#,汇编,汇编求解一元二次方程的解,汇编大作业设计)