在Cortex-M3上,我想将数组的前两个值设置为0和1,所以我执行了以下操作:
main MOV R4, #0
array DCD 4,7,6,8
LDR R1, =array ; R1 = base address of array
STR R4, [R1, R4, LSL #2]
ADD R4, R4, #1
STR R4, [R1, R4, LSL #2]
END
显然STR指令并没有达到我的预期。这有什么问题吗?在《Cortex-M3指令集》手册中写道:
STR R0, [R1, R2, LSL #2] ; Stores R0 to an address equal to sum of R1
; and four times R2.
反汇编如下所示:
0x00000000 0200 DCW 0x0200
0x00000002 2000 DCW 0x2000
0x00000004 0009 DCW 0x0009
0x00000006 0000 DCW 0x0000
0x00000008 F04F0400 MOV r4,#0x00
0x0000000C 0004 DCW 0x0004
0x0000000E 0000 DCW 0x0000
0x00000010 0007 DCW 0x0007
0x00000012 0000 DCW 0x0000
0x00000014 0006 DCW 0x0006
0x00000016 0000 DCW 0x0000
0x00000018 0008 DCW 0x0008
0x0000001A 0000 DCW 0x0000
0x0000001C 4903 LDR r1,[pc,#12] ; @0x0000002C
0x0000001E F8414024 STR r4,[r1,r4,LSL #2]
0x00000022 F1040401 ADD r4,r4,#0x01
0x00000026 F8414024 STR r4,[r1,r4,LSL #2]
0x0000002A 0000 DCW 0x0000
0x0000002C 000C DCW 0x000C
0x0000002E 0000 DCW 0x0000
3条答案
按热度按时间ryhaxcpt1#
正如Michael所解释的,指令
array DCD 4,7,6,8
必须在AREA d, DATA
指令之后-否则数组将被置于只读代码区,因此无法被覆盖。ifsvaxew2#
保留8拇指区复位,数据,只读导出__矢量__矢量DCD 0x 20001000;堆栈指针初始化时在此处输入代码值
MAXP DCD最大值最小值DCD最小值
N双CD 12数字1双CD 3,-7,2,-2,10,20,30,15,32,8,64,66指针双CD数字1
最大DCD 0最小DCD 0
重设行程程式(_H)
主LDR R1,=指针;在R1 LDR R2中加载指针,[R1] ;从指针LDR R3获取数组地址,= MAX ;加载R3中的MAX指针LDR R6,[R3] ;从MAX指针LDR R7获取MAX的地址,= N ; R5 LDR R 0中的负载计数器地址,[R7] ;从R5 LDR R8中的计数器地址加载计数器值,= MIN ;在R8地址LDR R5中加载MIN指针,[R8] ;从最小指针LOOP LDR R4,[R2],#4加载最小值;从数组加载值并更新(递增)指针CMP R4、R6的地址;比较R6值与R3 IT GT ;如果大于,则执行下一指令MOVGT R6、R4 ;如果数组值大于R6中的值,则将R3中的R6值移到CMP R4、R5中;比较R6和R 0的最小值IT〈LT ;如果value小于最小值,则执行nex指令MOVLT R5、R4 ;更新R 0中最小数量的值
结束
mnowg1ta3#