neg.asm

来自「CCS3.3自带的TI 5400系列DSP的dsplib文件。文档说明可以在TI」· 汇编 代码 · 共 101 行

ASM
101
字号
;***********************************************************
; Version 2.20.01                                           
;***********************************************************
;*****************************************************************************
;  Function:	 neg
;  Description:  vector neg
;
;  Copyright Texas instruments Inc, 1998
;-----------------------------------------------------------------------------
; Revision History:
; 0.00	J. Axelrod, 4/15/98. Original version.  
; 1.00	R. Piedra, 8/31/98. Reduced number of cycles.
; 2.00	- Li Yuan, 4/09/02. fixed overflow flag setup at the end of code.
;*****************************************************************************
        .mmregs

; Far-mode adjustment

	.if __far_mode
offset	.set 1			; far mode uses one extra location for ret addr  ll
	.else
offset	.set 0
	.endif

	.asg	(2), ret_addr
					; x in A
	.asg	(3 + offset), arg_z
	.asg	(4 + offset), arg_n
					; register usage
					; ar0: addr. idx
	.asg	ar2, ar_x
	.asg	ar3, ar_z
	.asg	ar4, ar_temp

;*****************************************************************************
	.def	_neg
	.text

_neg

        PSHM    ST0                                 ; 1 cycle
        PSHM    ST1                                 ; 1 cycle
        RSBX    OVA                                 ; 1 cycle
        RSBX    OVB                                 ; 1 cycle

; Preserve registers
;-------------------
	ssbx	sxm			; sign extension on		(1)
	ssbx	ovm			; map -32768 to + 32767 	(1)

; Get arguments
;--------------
	ld	*sp(arg_n),b		; b = n 			(1)
	sub	#2,b			;				(2)
	stlm	b, brc			; brc = n -2			(1)

	stlm	a, ar_x 		; pointer to x			(1)
	mvdk	*sp(arg_z),*(ar_z)	; pointer to z			(2)


_start:
; Loop computes n -1 elements
; ---------------------------
	rptbd	eloop-1 		;				(2)
	ld	*ar_x+,16,a		; ah = x(0)			(1)
	neg	a			; ah = -x(0)			(1)


	st	a,*ar_z+		; write z(0)			(1)
     || ld	*ar_x+,a		; ah = x(1)
	neg	a			; ah = -x(1)			(1)
eloop

; Store last computed element
; ---------------------------
	sth	a, *ar_z+		; store last output z(1)	(1)	(1)


; Return
;--------
_end:
	rsbx	ovm			;				(1)	(1)
	
	ld	#0,a			;				(1)	(1)
	xc	1, AOV			; return overflow flag		(1)	(1)
	ld	#1,a			;				(1)	(1)

        POPM    ST1
        POPM    ST0

	.if	__far_mode
	fretd				;				(4)	(4)
	.else
	retd 				;				(3)	(3)
	.endif
	nop
	nop

;end of file. please do not remove. it is left here to ensure that no lines of code are removed by any editor

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?