8月25日。继续和老师学习的汇编课程
设计汇编实例
转移数据从Flash存储器到片内SRAM存储器。
先用 C语言编写。
void main(void)
{
unsigned short const TABLE[4]={0x0123,0x4567,0x89ab,0xcdef}; //FF:XXXX CODE
volatile unsigned short edata STORE[4];
unsigned char i;
for(i=3;i>=0;i--)
STORE[i]=TABLE[i];
}
复制代码
看一下反汇编的程序。
; FUNCTION main (BEGIN)
; SOURCE LINE # 1
; SOURCE LINE # 2
; SOURCE LINE # 3
000000 7E540000 R MOV WR10,#WORD0 ?tpl?0001
000004 7E440000 R MOV WR8,#WORD2 ?tpl?0001
000008 69320006 MOV WR6,@DR8+0x6
00000C 69220004 MOV WR4,@DR8+0x4
000010 69120002 MOV WR2,@DR8+0x2
000014 0B2A00 MOV WR0,@DR8
000017 7A1F0000 R MOV TABLE+4,DR4
00001B 7A0F0000 R MOV TABLE,DR0
; SOURCE LINE # 6
00001F 7E7003 MOV R7,#03H
;---- Variable 'i' assigned to Register 'R7' ----
?C0004:
; SOURCE LINE # 7
000022 7402 MOV A,#02H ; A=R11
000024 ACB7 MUL R11,R7 ; A=R11
000026 49250000 R MOV WR4,@WR10+TABLE
00002A 59250000 R MOV @WR10+STORE,WR4
00002E 1B70 DEC R7,#01H
000030 BE7000 CMP R7,#00H
000033 50ED JNC ?C0004
; SOURCE LINE # 8
000035 22 RET
; FUNCTION main (END) 复制代码
接下来是用汇编语言,用MCS-51指令编写。
data_seg1 segment code
rseg data_seg1
TABLE: DW 0x0123,0x4567,0x89ab,0xcdef ;four data is in code memory (ff:xxxx)
data_seg2 segment edata
rseg data_seg2
STORE: DSW 4 ; 4*2=8B (00:xxxx) EDATA
prog_seg segment code
rseg prog_seg
LJMP main
ORG 0x220
main:
MOV DPTR, #TABLE
MOV WR0, #STORE
MOV R4, #0x04
CON:
MOV A, #0x0
MOVC A, @A+DPTR
MOV R2, A
INC DPTR
MOV A, #0x0
MOVC A, @A+DPTR
MOV R3, A
MOV @WR0, WR2 ; {R2,R3}=WR2
INC DPTR
ADD WR0, #0x02
MOV A, R4
SUBB A, #0x01
MOV R4, A
JNZ CON
LJMP $
;-------------------------------------
;-------------------------------------
END
复制代码
然后把它改成用MCS-251指令。
data_seg1 segment code
rseg data_seg1
TABLE: DW 0x0123,0x4567,0x89ab,0xcdef ;four data is in code memory (ff:xxxx)
data_seg2 segment edata
rseg data_seg2
STORE: DSW 4 ; 4*2=8B (00:xxxx) EDATA
DPXL DATA 84H ; s:84h
//sfr DPXL=0x84;
prog_seg segment code
rseg prog_seg
LJMP main
ORG 0x220
main:
MOV DPTR, #TABLE
MOV DPXL, #0xff ;{DPXL,DPTR}=FF: #TABLE
MOV WR0, #STORE ; addr(STORE)
MOV R4, #0x04
CON:
MOV WR6, @DR56
MOV @WR0, WR6
INC DR56, #2
INC WR0, #2
DEC R4, #1
JNZ CON
LJMP $
;-------------------------------------
;-------------------------------------
END
复制代码
可以看得出用251指令比较简短。