🌵🌵🌵前言
?你好啊,我是“ 怪& ”,是一名在校大学生哦。 🌍主页链接:怪&的个人博客主页 ??博文主更方向为:课程学习知识、作业题解、期末备考。随着专业的深入会越来越广哦…一起期待。 ??一个“不想让我曾没有做好的也成为你的遗憾”的博主。 💪很高兴与你相遇,一起加油!
一、实验说明及要求
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以及上万次的执行指令,终于大体完成要求的功能,但还是有些小地方不够完美,之后又三次前往实验室完善代码及图片记录,最终呈现至此博文中。
??????忙碌的敲代码也不要忘了浪漫鸭!
🌞汇编语言是进入大学至此最喜欢的专业课之一,也承载着我的遗憾…… 🌻宝子们一定要学好哦!
|