汇编语言 求三个数中最大值,结果存入MAX单元
已知X、Y、Z、MAX为16位的带符号数,求三个数中最大值,结果存入MAX单元。
思路:定义数据段,代码段,让堆栈段自动装入;X,Y,Z,MAX 16位带符号数没有给出,那就自己写几个吧,那问题来了,16位带符号数该怎么输入呢?
DB是八位,一字节;那就用DW了,它是字,16位;
试着用分支程序
分支程序正确代码
DATA SEGMENT X DW 7 Y DW 5 Z DW 8 MAX DW ?,? DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX, DATA MOV DS, AX MOV AX, X MOV BX, Y MOV CX, Z CMP AX, BX JGE NEXT MOV MAX,BX CMP MAX,CX JGE DONE MOV MAX,CX JMP DONE NEXT: MOV MAX,AX CMP MAX,CX JGE DONE MOV MAX, CX JMP DONE DONE: MOV DX, MAX ;便于使用debug查看结果是否正确 MOV AH,4CH INT 21H CODE ENDS END START
运行结果
从上图可以看到,程序完好执行,没有发生卡死
用debug检验程序功能是否完备且逻辑正确
u命令:
d ds:0006 由于是字,所以地址从AX到MAX从 0000,0002,0004到0006;0006是MAX的地址:
d ds:0000:
下方可以看到,DX已经存入8,程序执行正确:
代码编写的心路历程
DATA SEGMENT X DW 7 Y DW 5 Z DW 8 MAX DW ?,? DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX, DATA MOV DS, AX MOV AX, X MOV BX, Y MOV CX, Z CMP AX, BX JGE NEXT CMP BX, CX JGE NEXT1 MOV MAX, CX NEXT: CMP AX, CX JGE DONE MOV MAX, CX NEXT1: MOV MAX, BX DONE: MOV MAX, AX MOV DX, MAX; 方便查看结果是否正确 MOV AL, 4CH INT 21H CODE ENDS END START
换种思路
结果,代码延时严重,卡死,原因是下面三行代码错误
DONE: MOV DX,MAX MOV AL, 4CH ;MOV AX,4CH 也不行,应为 MOV AH,4CH INT 21H
DATA SEGMENT X DW 7 Y DW 5 Z DW 8 MAX DW ?,? DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX, DATA MOV DS, AX MOV AX, X MOV BX, Y MOV CX, Z CMP AX, BX JGE NEXT MOV MAX,BX CMP MAX,CX JGE DONE MOV MAX,CX JMP DONE NEXT: MOV MAX,AX ;第一次写的时候,:(冒号)写成了中文符,所以不断报错 CMP MAX,CX JGE DONE MOV MAX, CX JMP DONE DONE: MOV DX, MAX; 方便查看结果是否正确 MOV AL, 4CH INT 21H CODE ENDS END START
采用子程序的结构也可以实现这样的功能,感兴趣可以自己尝试下。
总结下:程序的逻辑编写还算是比较上手吧,因为有C++的基础,先在DEVC++上梳理了两种三个数比大小的方法,然后分别用汇编语言进行实现,结果就是第二种并列两个if语句的方式,更实现更简单一点,C++的程序见下,有助于梳理思路,理解汇编语言语句块
当然,程序的分支结构理解和基本指令含义理解也很重要,之前有几篇文章有讲,收录在“计算机硬件基础”专栏中,可以简单了解下,真正理解还是要去系统学习下。
这是实验报告中的一个小任务,代码确立很快,但小问题层出不穷,第一次学,手还比较生,对软件功能的编译不熟悉,大量时间花在了解决初始代码报错和对报错语句的理解上,修修改改,前后花了将近4个小时的时间,还是很开心能够把它写出来,困难就是用来克服的嘛,下一步想着这个代码怎么再能精简点就更好了,继续努力吧,做一个开心学习的人儿。
下一篇:
使用EA画ER图并导出为图片