This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

MOV in ASM

if my ASM code is previously coded to run for 256Byte internal RAM of MCU (use MOV instruction)
and i now need to change to external 2Kbyte RAM (use MOVX), then should i change R7 to R7:R6 because R7 is
not big enought to address BUFFER? or can anyone suggest what should i change the following code?

unsigned char Test(unsigned char BUFFER)
{

#pragma asm

MOV A, R7
MOV R1, A
RET

#pragma endasm
return 1;
}

Parents
  • If my ASM code is previously coded to run for 256 byte internal RAM of MCU (use MOV instruction) and i now need to change to external 2Kbyte RAM (use MOVX), then should i change R7 to R7:R6 because R7 is not big enought to address BUFFER? or can anyone suggest what should i change the following code?

    Some 8051 family variants have extra memory beyond the 256 byte scratchpad RAM that is described as "internal". Invariably, a better description from a programmers point of view would be "external on-chip RAM". To the CPU this extra on-chip RAM looks just like RAM that would be in an external chip accessed via an external bus on a conventional 8051/8052 design. Of course, there will be some other differences, P0 may be available as an I/O port for example.

    So, you need to use a MOVX instruction to get at this on-chip ram. For example, you will need something like the following (untested):

    unsigned char Test( unsigned int address )
    {
        address = address; //suppress UNUSED warning
                           // will be optimised out.
    
        #pragma asm
    
            MOV     DPH,R6
            MOV     DPL,R7
            MOVX    A,@DPTR
            MOV     R7,A
            RET
    
        #pragma endasm
    
        return( 1 );       // dummy return
    }
    
    But do you really need this? Keil can place variables in xdata for you.

Reply
  • If my ASM code is previously coded to run for 256 byte internal RAM of MCU (use MOV instruction) and i now need to change to external 2Kbyte RAM (use MOVX), then should i change R7 to R7:R6 because R7 is not big enought to address BUFFER? or can anyone suggest what should i change the following code?

    Some 8051 family variants have extra memory beyond the 256 byte scratchpad RAM that is described as "internal". Invariably, a better description from a programmers point of view would be "external on-chip RAM". To the CPU this extra on-chip RAM looks just like RAM that would be in an external chip accessed via an external bus on a conventional 8051/8052 design. Of course, there will be some other differences, P0 may be available as an I/O port for example.

    So, you need to use a MOVX instruction to get at this on-chip ram. For example, you will need something like the following (untested):

    unsigned char Test( unsigned int address )
    {
        address = address; //suppress UNUSED warning
                           // will be optimised out.
    
        #pragma asm
    
            MOV     DPH,R6
            MOV     DPL,R7
            MOVX    A,@DPTR
            MOV     R7,A
            RET
    
        #pragma endasm
    
        return( 1 );       // dummy return
    }
    
    But do you really need this? Keil can place variables in xdata for you.

Children