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
  • But R1 in RB0 has physical address 0x01,
        R1 in RB1 has physical address 0x09,
        R1 in RB2 has physical address 0x11, and
        R1 in RB3 has physical address 0x19.

    The example is effectively R1 = BUFFER. What 8051 has registers allocated to memory accessible via MOVX?