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

五、 程序流程图

在这里插入图片描述

六、内存变化情况

在这里插入图片描述

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

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

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
  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
汇编语言是一种低级语言,可以直接操作计算机硬件。实现二分查找算法的汇编语言代码如下: ``` section .data array db 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 array_size equ $ - array section .text global _start _start: mov eax, 0 ; 左边界 mov ebx, array_size ; 右边界 mov ecx, 5 ; 要查找的元素 binary_search: cmp eax, ebx ; 检查左右边界是否交叉 jg not_found ; 如果左边界大于右边界,则未找到 mov edx, eax ; 计算中间位置 add edx, ebx shr edx, 1 mov al, byte [array + edx] ; 获取中间位置的元素 cmp al, cl ; 比较中间位置的元素与要查找的元素 je found ; 如果相等,则找到了 jl move_right ; 如果中间位置的元素小于要查找的元素,则向右移动左边界 jg move_left ; 如果中间位置的元素大于要查找的元素,则向左移动右边界 move_right: inc eax jmp binary_search move_left: dec ebx jmp binary_search found: ; 找到了,可以在这里进行相应的处理 jmp exit not_found: ; 未找到,可以在这里进行相应的处理 exit: ; 程序退出 mov eax, 1 xor ebx, ebx int 0x80 ``` 上述代码使用了一个有序数组进行二分查找。首先,将左边界`eax`设置为0,右边界`ebx`设置为数组的大小。然后,将要查找的元素`ecx`设置为5。接下来,使用循环进行二分查找,直到找到目标元素或者左右边界交叉。在每次循环中,计算中间位置并获取中间位置的元素进行比较。如果中间位置的元素等于要查找的元素,则找到了;如果中间位置的元素小于要查找的元素,则向右移动左边界;如果中间位置的元素大于要查找的元素,则向左移动右边界。最后,根据是否找到目标元素进行相应的处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只可爱的小猴子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值