This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

load用汇编写的程序,可是无法运行



你好,

我初学汇编,想用汇编编写一段改变XF位从而改变LED灯暗灭的简单程序。(5416DSP, CCS3.3)

以下是我的程序:

1.main.asm

	                .def	main
			.def	timer0
			
			.mmregs

			.data
ms			.word	00h


			.text
main:		STM		#0000h,CLKMD
		
loop1:		LD		CLKMD,A
			AND		#01h,A
			BC		loop1,AEQ
			
			STM		#40C7h,CLKMD
			STM		#4240h,SWWSR
			STM		#0FFA0h,PMST
			STM		#0802h,BSCR
			
;INITIALIZE THE TIMER
			STM		#0000h,IMR

			STM		#0010h,TCR
			STM		#186Ah,PRD
			STM		#0C2Fh,TCR

			STM		#0008h,IFR
			ORM		#0008h,*(IMR)
			RSBX	INTM
			LD 		#40,DP;因为data段起始地址为0x8000,是第40页,其中有变量ms

loop2:
			LD		@ms,A
			SUB		#500,A
			BC		loop2,ANEQ
			ST		#0,@ms
			RSBX	XF
loop3:		
			LD 		@ms,A
			SUB		#500,A
			BC		loop3,ANEQ
			BD		loop2
			ST		#0,@ms
			SSBX	XF


;interrupt
timer0:		
			PSHM	AL
			PSHM	AH

			LD		@ms,A
			ADD		#01h,A
			STL		A,@ms

			POPM	AH
			POPM 	AL
			
			RETE

2.

		.ref	main
		.ref	timer0
		.sect   ".vectors"
rs: BD 		main
	nop
	nop
nmi: rete 		;NMI, SINT16
    nop
	NOP
	NOP
sint17: rete 	;SINT17
	NOP
	NOP
sint18: rete 	;SINT18
	NOP
	NOP
sint19: rete 	;SINT19
	NOP
	NOP
sint20: rete 	;SINT20
	NOP
	NOP
sint21: rete 	;SINT21
	NOP
	NOP
sint22: rete 	;SINT22
	NOP
	NOP
sint23: rete 	;SINT23
	NOP
	NOP
sint24: rete 	;SINT24
	NOP
	NOP
sint25: rete 	;SINT25
	NOP
	NOP
sint26: rete 	;SINT26
	NOP
	NOP
sint27: rete 	;SINT27
	NOP
	NOP
sint28: rete 	;SINT28
	NOP
	NOP
sint29: rete 	;SINT29
	NOP
	NOP
sint30: rete       	;SINT30
	NOP
	NOP
int0: rete 		;INT0, SINT0
	NOP
	NOP
int1: rete		;INT1, SINT1
	NOP
	NOP
int2: rete 		;INT2, SINT2
	NOP
	NOP
tint0: B  timer0 	;TINT0, SINT3
	NOP
	NOP
brint0: rete 	;BRINT0, SINT4
	NOP
	NOP
bxint0: rete 				;BXINT0, SINT5
	NOP
	NOP
dmac0: rete 				;DMAC0, brint2, SINT6
	NOP
	NOP
dmac1: rete 				;DMAC1, bxint2, SINT7 ??
	NOP
	NOP
int3: rete 					;INT3, SINT8
	NOP
	NOP
hpint:rete 				;HPINT, SINT9
	NOP
	NOP
brint1:rete				;BRINT1 or DMAC2, SINT10
	NOP
	NOP
bxint1: rete 				;BXINT1 or DMAC3, SINT11
	NOP
	NOP
dmac4: rete 				;DMAC4, SINT12
	NOP
	NOP
dmac5: rete				;DMAC5, SINT13
	NOP
	NOP
rsvd1: rete 				;reserved
	NOP
	NOP
rsvd2: rete 				;reserved
	NOP
	NOP

3. my.cmd

MEMORY
{
	PAGE 0: 
		VECT:	origin = 0xFF80	   length = 0x80
		DARAM1:	origin = 0x0080	   length = 0x200

	PAGE 1:
		DARAM2: origin = 0x8000	   length = 0x100
}

SECTIONS
{
	.text    :>  	DARAM1	PAGE 0
	.vectors :>		VECT	PAGE 0
	
	.data	 :> 	DARAM2	PAGE 1
	.bss	 :>		DARAM2	PAGE 1
}

遇到的问题是,当直接加载后,跳出的窗口是没有指令的,即”-----------------“

                             当加载后,并且用.geL文件重启,即PC指向中断向量表,则程序无法正常从中断向量表跳到main。

请高手解答一下,谢谢!

vect.asm

  • 你好,

    我自己是这么解决的:把中断向量表里的第一个中断跳向 _c_int00,然后再.text段中令_c_int00: 跳向main。在linker选项当中选择load-time autoinitiation。我的程序中也有一些地方修改了一下。

    我想问的是,为什么之前那样直接跳到main不可以(在linker选项当中选择no autoinitiation)?还有,CCS中debug->reset CPU, 与.gel文件 reset CPU有什么区别?

  • 你好,

    试试cmd文件指定程序入口地址为main。
    -e main

  • Debug->Reset CPU是指CCS将执行software reset, 停止CPU并将PC指针指到reset vector.

    gel->Reset CPU要看你的gel文件中reset cpu hotmenu具体是怎么定义的。

  • 你好,

    这是我修改后的程序,可是现在无法运行了,不知道错在哪里了?好像中断进不去,您能不能帮我看看?

    		    .def    main
                .def    timer0
                .def    _c_int00
    
    
                .mmregs
    
                .data
    ms            .word    00h
    
    
                .text
    _c_int00:    B        main
    
    main:       STM        #0000h,CLKMD
           
    loop1:      LDM        CLKMD,A
                AND        #01h,A
                BC        loop1,ANEQ
               
                STM        #40C7h,CLKMD
                STM        #4240h,SWWSR
                STM        #0FFA8h,PMST
                STM        #0802h,BSCR
               
    
           
    ;INITIALIZE THE TIMER
                STM        #0000h,IMR
    
                STM        #0010h,TCR
                STM        #186Ah,PRD
                STM        #0C2Fh,TCR
    
                STM        #0008h,IFR
                LD        #0,DP
                ORM        #0008h,*(IMR)
                RSBX    INTM
               
                STM        #ms,AR0
    
    loop2:
                LD        *AR0,A
                SUB        #500,A
                BC        loop2,ANEQ
                ST        #0,*AR0
                RSBX    XF
    loop3:       
                LD         *AR0,A
                SUB        #500,A
                BC        loop3,ANEQ
                ST        #0,*AR0
                SSBX    XF
                B        loop2
    
    
    
    ;interrupt
    timer0:       
                PSHM    AL
                PSHM    AH
    
                LD        *AR0,A
                ADD        #01h,A
                STL        A,*AR0
    
                POPM    AH
                POPM     AL
               
                RETE
    	.ref	main
    		.ref	timer0
    		.ref	_c_int00
    		.sect   ".vectors"
    rs: BD 	_c_int00
    	NOP
    	NOP
    	
    nmi: rete 		;NMI, SINT16
        nop
    	NOP
    	NOP
    sint17: rete 	;SINT17
    	NOP
    	NOP
    sint18: rete 	;SINT18
    	NOP
    	NOP
    sint19: rete 	;SINT19
    	NOP
    	NOP
    sint20: rete 	;SINT20
    	NOP
    	NOP
    sint21: rete 	;SINT21
    	NOP
    	NOP
    sint22: rete 	;SINT22
    	NOP
    	NOP
    sint23: rete 	;SINT23
    	NOP
    	NOP
    sint24: rete 	;SINT24
    	NOP
    	NOP
    sint25: rete 	;SINT25
    	NOP
    	NOP
    sint26: rete 	;SINT26
    	NOP
    	NOP
    sint27: rete 	;SINT27
    	NOP
    	NOP
    sint28: rete 	;SINT28
    	NOP
    	NOP
    sint29: rete 	;SINT29
    	NOP
    	NOP
    sint30: rete       	;SINT30
    	NOP
    	NOP
    int0: rete 		;INT0, SINT0
    	NOP
    	NOP
    int1: rete		;INT1, SINT1
    	NOP
    	NOP
    int2: rete 		;INT2, SINT2
    	NOP
    	NOP
    tint0: B  timer0 	;TINT0, SINT3
    	NOP
    	NOP
    brint0: rete 	;BRINT0, SINT4
    	NOP
    	NOP
    bxint0: rete 				;BXINT0, SINT5
    	NOP
    	NOP
    dmac0: rete 				;DMAC0, brint2, SINT6
    	NOP
    	NOP
    dmac1: rete 				;DMAC1, bxint2, SINT7 ??
    	NOP
    	NOP
    int3: rete 					;INT3, SINT8
    	NOP
    	NOP
    hpint:rete 				;HPINT, SINT9
    	NOP
    	NOP
    brint1:rete				;BRINT1 or DMAC2, SINT10
    	NOP
    	NOP
    bxint1: rete 				;BXINT1 or DMAC3, SINT11
    	NOP
    	NOP
    dmac4: rete 				;DMAC4, SINT12
    	NOP
    	NOP
    dmac5: rete				;DMAC5, SINT13
    	NOP
    	NOP
    rsvd1: rete 				;reserved
    	NOP
    	NOP
    rsvd2: rete 				;reserved
    	NOP
    	NOP
    -stack 0x400
    
    MEMORY
    {
    	PAGE 0: 
    		VECT:	origin = 0xFF80	   length = 0x80
    		DARAM1:	origin = 0x0080	   length = 0x200
    
    	PAGE 1:
    		DARAM2: origin = 0x8000	   length = 0x1000
    }
    
    SECTIONS
    {
    	.text    :>  	DARAM1	PAGE 0
    	.vectors :>		VECT	PAGE 0
    	
    	.data	 :> 	DARAM2	PAGE 1
    	.bss	 :>		DARAM2	PAGE 1
    
    }
  • 你好,

    请问

    1、为什么先load程序,然后DEBUG->RESET CPU之后,再run程序无法正常运行。而先RESET CPU,再load,再RUN就可以了。

    2、我将linker选项中改为no autoinitiation ,并且按照您说的在cmd中加入-e main,然后load程序之后PC指向main没错,程序也可以正常运行。但是我把main.asm中的“.def _c_int00”与“_c_int00:    B        main”两句注释掉之后(因为用不着),程序却无法正常运行了,请问为什么。

    谢谢~

  • 看一下IFR TINT位有没有置1?

  • 1. Debug->Reset CPU不会重新初始化所有的变量,而load会重新初始化

    2. 如果你用汇编写的话, 不需要_c_int00这个函数, 这个函数在rts.lib库中, 是建立C语言环境用的。 

  • 为什么我IFR一直是0x0008,就算reset CPU之后还是0x0008.向IFR写入0XFFFF之后还是不变。

  • 感觉在IFR为0008h的时候,TINT0中断还是没有响应。单步调试的时候就一直在loop2当中,我修改了一下程序。我觉得是程序哪里出问题了,您能不能看下。

     .def    main
                .def    timer0
                .mmregs
    
                .data
    ms            .word    00h
    
    
                .text
    main:       RSBX	  CPL
    			SSBX      SXM			
    			STM        #0000h,CLKMD
    loop1:      LDM        CLKMD,A
                AND        #01h,A
                BC        loop1,ANEQ
               	
    			STM		   #0000h,ST0
                STM        #40C7h,CLKMD
                STM        #4240h,SWWSR
                STM        #0FFA8h,PMST
                STM        #0802h,BSCR
    ;setup SP
    stack_size	.set		10
    stack		.usect 	    ".stack",stack_size
               	STM			#(stack+stack_size-1),SP
    
           
    ;INITIALIZE THE TIMER
                STM        #0000h,IMR
    
                STM        #0010h,TCR
                STM        #186Ah,PRD
                STM        #0C2Fh,TCR
    
                STM        #0008h,IFR
                LD        #0,DP
                ORM        #0008h,*(IMR)
                RSBX    INTM
               
                STM        #ms,AR0
    
    loop2:
                LD        *AR0,A
                SUB        #500,A
                BC        loop2,ANEQ
                ST        #0,*AR0
                RSBX    XF
    loop3:       
                LD         *AR0,A
                SUB        #500,A
                BC        loop3,ANEQ
                ST        #0,*AR0
                SSBX    XF
                B        loop2
    
    
    
    ;interrupt
    timer0:       
                PSHM    AL
                PSHM    AH
    
                LD        *AR0,A
                ADD        #01h,A
                STL        A,*AR0
    
                POPM    AH
                POPM     AL
               
                RETE