汇编语言 求三个数中最大值,结果存入MAX单元

汇编语言 求三个数中最大值,结果存入MAX单元,第1张

已知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,程序执行正确:

代码编写的心路历程

下面的分支程序,谨慎使用,此代码为作者整理思路,有逻辑错误, 错误在于,如果CX最大,那么DONE就无法被执行,导致程序无法中断;

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++的程序见下,有助于梳理思路,理解汇编语言语句块

(16条消息) 三个数比大小 输出最大值_Elvin域文的博客-CSDN博客https://blog.csdn.net/m0_51787573/article/details/124096242?spm=1001.2014.3001.5502当然,程序的分支结构理解和基本指令含义理解也很重要,之前有几篇文章有讲,收录在“计算机硬件基础”专栏中,可以简单了解下,真正理解还是要去系统学习下。


这是实验报告中的一个小任务,代码确立很快,但小问题层出不穷,第一次学,手还比较生,对软件功能的编译不熟悉,大量时间花在了解决初始代码报错和对报错语句的理解上,修修改改,前后花了将近4个小时的时间,还是很开心能够把它写出来,困难就是用来克服的嘛,下一步想着这个代码怎么再能精简点就更好了,继续努力吧,做一个开心学习的人儿。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/607311.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-14
下一篇 2022-04-14

发表评论

登录后才能评论

评论列表(0条)

保存