快捷搜索: 王者荣耀 脱发

汇编语言 求三个数中最大值,结果存入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个小时的时间,还是很开心能够把它写出来,困难就是用来克服的嘛,下一步想着这个代码怎么再能精简点就更好了,继续努力吧,做一个开心学习的人儿。

经验分享 程序员 微信小程序 职场和发展