📄 fdsma.asm
字号:
;********************FDSMA********************
;本程序实现在双字节数据块中查找有符号数极大值。
;入口参数:数据块首址在SADR中,数据个数在W中。
;出口参数:极大值在SOUH:SOU中,极大值地址在SADR中。
;占用资源:W,STATUS,FSR,020H,024H,025H,028H,029H,两重堆栈。
;说 明: 1.如果有两个或两个以上相等的极大值,则只能给出第一个极大值的地址.
; 2.加载本文件的同时也加载了另外一个文件"FDUMA.ASM",
; 故用户在使用这个子程序时可直接调用, 不必重新加载.
; 3.本程序的执行对原数据块并无影响.
IFNDEF FDSMA1
#DEFINE FDSMA1
FDSMA MOVWF TEMP1
MOVWF TEMP2
MOVF SADR,W
MOVWF FSR
INCF FSR,F
LOOP52 BTFSC INDF,7
GOTO NOPLUS1
MOVF INDF,W
MOVWF SOUH
DECF FSR,F
MOVF INDF,W
MOVWF SOU ;SOUH和SOU赋初值
MOVF FSR,W
MOVWF SADR
MOVLW .3
ADDWF FSR,F ;FSR指向下一个数的高位字节
LOOP50 BTFSC INDF,7
GOTO NEXT24
MOVF INDF,W
SUBWF SOUH,W
BTFSC STATUS,C
GOTO NOVER1
MOVF INDF,W
MOVWF SOUH ;SOUH中总是存放最大值
DECF FSR,F ;FSR指向低位字节
RELOW2 MOVF INDF,W
MOVWF SOU ;最大值低位
MOVF FSR,W
MOVWF SADR ;最大值地址
NEXT23 INCF FSR,F
NEXT24 INCF FSR,F
INCF FSR,F
DECFSZ TEMP1,F
GOTO LOOP50
RETURN
NOPLUS1 INCF FSR,F
INCF FSR,F
DECFSZ TEMP1,F
GOTO LOOP52
MOVF TEMP2,W ;重新获得数据个数
CALL FDUMA ;全是负数,则按无符号数算法求其最大值
RETURN
NOVER1 BTFSS STATUS,Z ;判断高位是否相等
GOTO NEXT24
DECF FSR,F
MOVF INDF,W
SUBWF SOU,W ;高位相等的情况下判断低位大小
BTFSS STATUS,C
GOTO RELOW2
GOTO NEXT23
INCLUDE "FDUMA.ASM"
ENDIF
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -