⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 div_f.asm

📁 TMS320C3X 汇编语言程序编译环境
💻 ASM
字号:
* REGISTER USED AS INPUT: R0
* REGISTERS MODIFIED: R0, R1, R2, R3
* REGISTER CONTAINING RESULT: R0
         .global RESET,INIT
         .global INVF,Loo
* REGISTER FROM 808000H (CTRL)
	 .data
MASK     .word 0FFFFFFFFH
BLK0     .word 0809800H ; 片内1K×32bit RAM块0起始地址
BLK1     .word 0809C00H ; 片内1K×32bit RAM块1起始地址
STCK     .word 0809E00H ; 堆栈起始地址
CTRL     .word 0808000H ; Pointer for peripheral±bus memory map
DMACTL   .word 0000000H ; Init for DMA control (0)
TIM0CTL  .word 0000000H ; Init of timer 0 control (32)
TIM1CTL  .word 0000000H ; Init of timer 1 control (48)
SERGLOB0 .word 0000000H ; Init of serial 0 glbl control (64)
SERPRTX0 .word 0000000H ; Init of serial 0 xmt port control (66)
SERPRTR0 .word 0000000H ; Init of serial 0 rcv port control (67)
SERTIM0  .word 0000000H ; Init of serial 0 timer control (68)
SERGLOB1 .word 0000000H ; Init of serial 1 glbl control (80)
SERPRTX1 .word 0000000H ; Init of serial 1 xmt port control (82)
SERPRTR1 .word 0000000H ; Init of serial 1 rcv port control (83)
SERTIM1  .word 0000000H ; Init of serial 1 timer control (84)
PARINT   .word 0000000H ; Init of parallel interface control (100)
IOINT    .word 0000000H ; Init of I/O interface control (96)
*

         .sect "init"; Named section
RESET    .word INIT ; RS± load address INIT to PC
         .space 63 ; Reserved space

	.text
* THE STATUS REGISTER HAS THE FOLLOWING ARRANGEMENT:
* BITS:    31–14 13  12 11 10  9    8   7   6  5  4  3 2 1 0
* FUNCTION: RESRV GIE CC CE CF RESRV RM OVM LUF LV UF N Z V C
*
INIT:    LDP 0,DP ; Point the DP register to page 0
         LDI 1800H,ST ; Clear and enable cache, and disable OVM
         LDI @MASK,IE ; Unmask all interrupts
         LDI @BLK0,AR0 ; AR0 points to block 0
         LDI @BLK1,AR1 ; AR1 points to block 1
         LDF 0.0,R0 ; 0 register R0
         RPTS 1023 ; Repeat 1024 times ...
         STF R0,*AR0++(1) ; Zero out location in RAM block 0 and ...
         || STF R0,*AR1++(1) ; Zero out location in RAM block 1
         LDI @CTRL,AR0 ; Load in AR0 the pointer to control registers
	 LDI @DMACTL,R0
	 STI R0,*+AR0(0) ; Init DMA control
	 LDI @TIM0CTL,R0
	 STI R0,*+AR0(32) ; Init timer 0 control
	 LDI @TIM1CTL,R0
	 STI R0,*+AR0(48) ; Init timer 1 control
	 LDI @SERGLOB0,R0
	 STI R0,*+AR0(64) ; Init serial 0 global control
	 LDI @SERPRTX0,R0
	 STI R0,*+AR0(66) ; Init serial 0 xmt control
	 LDI @SERPRTR0,R0
	 STI R0,*+AR0(67) ; Init serial 0 rcv control
	 LDI @SERTIM0,R0
	 STI R0,*+AR0(68) ; Init serial 0 timer control
	 LDI @SERGLOB1,R0
	 STI R0,*+AR0(80) ; Init serial 1 global control
	 LDI @SERPRTX1,R0
	 STI R0,*+AR0(82) ; Init serial 1 xmt control
	 LDI @SERPRTR1,R0
	 STI R0,*+AR0(83) ; Init serial 1 rcv control
	 LDI @SERTIM1,R0
	 STI R0,*+AR0(84) ; Init serial 1 timer control
	 LDI @PARINT,R0
	 STI R0,*+AR0(100) ; Init parallel interface control (C30 only)
	 LDI @IOINT,R0
	 STI R0,*+AR0(96) ; Init I/O interface control
	 LDI @STCK,SP ; Init the stack pointer
	 OR  2000H,ST ; Global interrupt enable

         LDF   -3.25,R0
	 CALL  INVF
	 LDF   7.5,R1
	 MPYF3 R0,R1,R2

         BR $

INVF: 	 LDF   R0,R3 ; 浮点除数v暂存R3
	 ABSF  R0 ; 浮点除数v取正
* EXTRACT THE EXPONENT OF v.
	 PUSHF R0
	 POP   R1
	 ASH   -24,R1 ;R1中的低8位为除数的指数部分
* x[0] FORMATION IS GIVEN THE EXPONENT OF v.

	 NEGI  R1
	 SUBI  1,R1 ; 求-e-1, the exponent of x[0]
	 ASH   24,R1
	 PUSH  R1
	 POPF  R1 ; Now R1 = x[0] = 1.0 * 2**(-e-1)
* NOW THE ITERATIONS BEGIN.
         LDI   8,RC
         RPTB  Loo
	 MPYF  R1,R0,R2 ; R2 = v * x[0]
	 SUBRF 2.0,R2 ; R2 = 2.0 ± v * x[0]
Loo:	 MPYF  R2,R1 ; R1 = x[1] = x[0] * (2.0 - v * x[0])

	 RND   R1 ; This minimizes error in the LSBs

* FOR THE LAST ITERATION WE USE THE FORMULATION:
* x[5] = (x[4] * (1.0 ± (v * x[4]))) + x[4]

	 MPYF  R1,R0,R2 ; R2 = v * x[4] = 1.0..01.. => 1
	 SUBRF 1.0,R2 ; R2 = 1.0 ± v * x[4] = 0.0..01... => 0
	 MPYF  R1,R2 ; R2 = x[4] * (1.0 - v * x[4])
	 ADDF  R2,R1 ; R2 = x[5] = (x[4]*(1.0±(v*x[4])))+x[4]
*
	 RND   R1,R0 ; Round since this is followed by a MPYF
*
* NOW THE CASE OF v < 0 IS HANDLED.
*
	 NEGF  R0,R2
	 LDF   R3,R3 ; This sets condition flags
	 LDFN  R2,R0 ; If v < 0, then R0 = -R0
*
	 RETS

	.end

⌨️ 快捷键说明

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