IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 【汇编语言实战】一元二次方程ax2+bx+c=0求解(含源码与过程截屏,可修改参数) -> 正文阅读

[C++知识库]【汇编语言实战】一元二次方程ax2+bx+c=0求解(含源码与过程截屏,可修改参数)

🌵🌵🌵前言

?你好啊,我是“ 怪& ”,是一名在校大学生哦。
🌍主页链接:怪&的个人博客主页
??博文主更方向为:课程学习知识、作业题解、期末备考。随着专业的深入会越来越广哦…一起期待。
??一个“不想让我曾没有做好的也成为你的遗憾”的博主。
💪很高兴与你相遇,一起加油!

一、实验说明及要求

1、实验说明

1、通过实验内容1理解底层程序设计。
2、要求在数据段中定义a、b、c、x,a、b、c初值不限。
3、程序执行过程中通过debug修改参数a、b、c的值。
4、计算的结果保存在变量x中。

2、实验要求

1、实验目的。
2、简单的程序流程图。
3、实验过程中内存状况截图及运行结果截图。
4、完整的代码(包括必要的注释)。

二、实验代码

DATAS SEGMENT
    ;此处输入数据段代码  
    a dw +1H		;+1,-2,+3 B^-4AC=4-(12)=-8	 b^2-4ac<0,无根
    b dw -2H		;+1,-4,+4 B^-4AC=16-(16)=0	 b^2-4ac=0,有一根	
    d dw +3H		;+1,-2,-3 B^-4AC=4-(-12)=16	 b^2-4ac>0,有两根
   	x1 dw 1H
   	x2 dw 1H
    
    
DATAS ENDS

STACKS SEGMENT
    ;此处输入堆栈段代码
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
    
	
START:
    MOV AX,DATAS
    MOV DS,AX
    ;此处输入代码段代码
beginning:
    mov AX,b				;
    IMUL AX					;b^2
    MOV CX,AX 				;cx=b^2
    MOV AX,4				;ax=4
    IMUL A					;ax=4a
    IMUL D					;ax=4ac
    MOV BX,AX				;bx=4ac
    MOV AX,CX				;ax=b^2
    SUB AX,BX				;ax=b^3-4ac
    cmp AX,0				    ;b^<4ac 	
	JL no_answer			    ;跳转至no_answer
	CMP AX,0
	JE one_answer			;相等,跳转至ONE_ANSWER
    jmp two_answer			;否则跳转至two_answer			


no_answer:
	mov x1,0
	mov x2,0
	jmp	end_work
	
	
one_answer:	;一个值的时候:x1+x2=-b/(-2a)
	
	MOV AX,B		;AX:B
	MOV BX,A
	DIV BX			;AX:B/A		
	MOV CX,2	
	DIV CX			;AX:B/(2A)
	MOV CX,-1
	MUL CX			;AX:-B/(2A)
	MOV X1,AX		;X1=-B/(2A)
	MOV X2,AX		;X2:-B/(2A)
	JMP	end_worK
	
sqrt:	;求ax的根号
	mov bx,+1	;用bx比较
	mov cx,0	;用cx记录求根数
compute:
	SUB AX,BX		    ;ax-bx
	CMP AX,0
	JL continue_work	    ;<0
	CMP AX,0
	JE equal_cx1		    ;=0
						;>0
	add bx,2	;bx+2
	add cx,1	;根数+1
	
	;cmp ax,bx	;比较
	;jb continue_work	   ;当剩余值ax小于bx时,根数即为cx
	;cmp ax,bx 	;比较
	;je equal_cx1		   ;当剩余值ax=bx时,根数即为cx+1
	
	JMP compute
	
equal_cx1:		       ;当剩余值ax=bx时,根数即为cx+1
	add cx,1
	jmp continue_work
	
two_answer:
    jmp sqrt
continue_work:	;cx: sqrt(b^2-4ac)
	mov AX,B	;ax=b
	MOV BX,-1
	IMUL BX	;AX=-1
	add AX,CX	;ax:-b+sqrt(b^2-4ac)
	MOV BX,2	;BX=2
	IDIV BX		;ax= [-b+sqrt(b^2-4ac)]/2
	mov BX,A	;BX=A
	IDIV BX		;ax= [-b+sqrt(b^2-4ac)]/(2a)
	MOV X1,AX
	
	mov AX,B	;ax=b
	MOV BX,-1
	IMUL BX	;AX=-b
	sub AX,CX	;ax:-b-sqrt(b^2-4ac)
	MOV BX,2	;BX=2
	IDIV BX		;ax= [-b-sqrt(b^2-4ac)]/2
	mov BX,A	;BX=A
	IDIV BX		;ax= [-b-sqrt(b^2-4ac)]/(2a)
	MOV X2,AX
	
end_work: 
	jmp beginning	;跳至开头,重新执行
	MOV AH,4CH		;退出    
    INT 21H
    
CODES ENDS
    END START

三、代码思路

在这里插入图片描述
在这里插入图片描述

四、程序运行结果

(1)、无解

a=+1 b=-2 c=+3
b^2-4ac = 4-12 = -8<0
所以令x1=0, x2=0
内存中,x1、x2初始值如下:

在这里插入图片描述
指令执行:发现跳至no_answer情况

在这里插入图片描述
结果:可以看到内存中x1=0,x2=0 计算正确

在这里插入图片描述

(2)、一个解(X1 = X2)

a= +1 b = -4 c = +4
b^2-4ac = 16-16=0
x1 = x2 =-2a/b=2

用debug将内存中的a、b、c、x1、x2调整至 1、-4、4、1、1
在这里插入图片描述

据此运行图可见其已跳转至One_answer情况了。
在这里插入图片描述

结果分析:根据有符号数乘法,结果低位有效。
可得:x1=x2=2,所以计算正确。
在这里插入图片描述

(3)、两个不同解

a =+1 b=-2 c=-3
b^2-4ac=4-(-12)=16>0,所有两个根
x1=3
x2=-1

用debug将内存中的a、b、c、x1、x2调整至 1、-2、-3、1、1
在这里插入图片描述
跳至two_answer情况(两个不同解)
在这里插入图片描述
求出 b 2 ? 4 a c \sqrt {b^2 - 4ac} b2?4ac ? ,求根部分为:sqrt标识,求根结果保存在CX中
在这里插入图片描述
求出x1=3
在这里插入图片描述
求出x2=-1 (有符号数运算,仅低位有效,补码为FF,真实值即为-1)
在这里插入图片描述
在内存中查看结果: X1=3 X2=-1
.在这里插入图片描述

五、实验总结

??在这次的实验中,我再次熟悉了DEBUG的启动及其基本命令的使用,同时将在课堂上所学过以及先前实验已实践过的寄存器调用与寻址操作再次复习巩固,并且对汇编语言下的:顺序程序设计、分支程序设计、循环程序设计有了自己的理解与设计。
??同时,一元二次方程的求解涉及有符号数的计算,所以在分支跳转以及运算时需要注意指令的选择,DIV/IDIV,MUL/IMUL等,我在实践代码设计与调试中明白了有/无符号数的运算操作以及存储方式,对标志寄存器以及分支跳转更加熟练。
??由于一元二次方程的解有三个情况:1、无解 2、一个解(两个解相同) 3、两个不同的解的情况 ,以及运用到循环、跳转、分块等思想。在实验过程中,我有遇到一些问题,例如汇编代码运行的顺序、跳转、运算结果有符号的判断跳转等,在老师的耐心解答以及我再次调试、实践下,最终圆满的完成了所有的实验要求,同时将过程与结果都认真记录下来。
??5月16日下午2:30-5:30的汇编实验课,我从下午2:30做至晚上9:30,经历了近百次的调试bug以及上万次的执行指令,终于大体完成要求的功能,但还是有些小地方不够完美,之后又三次前往实验室完善代码及图片记录,最终呈现至此博文中。

??????忙碌的敲代码也不要忘了浪漫鸭!

🌞汇编语言是进入大学至此最喜欢的专业课之一,也承载着我的遗憾……
🌻宝子们一定要学好哦!

请添加图片描述

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-07-20 18:34:21  更:2022-07-20 18:34:59 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/13 16:10:52-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码