我正在使用C语言编写MSP430作为真实微控制器(或仿真器,如果需要)的模拟。当我为MSP430准备 test.s 文件时:
.text
.global main
.type main, @function
main:
mov #8,r4;
add r5,r5; // r5 = 0
jz l1;
add r6,r6; // r6 = 0
jz l2;
push r6; // for break purpose
l1:
mov #0x1234,r8;
push r10;
l2:
mov #0x5678,r9;
push r11;
我得到了这样的验证(通过MSP430)文件 test.lst :
test.elf: file format elf32-msp430
Disassembly of section .text:
00000000 <main>:
0: 34 42 mov #8, r4 ;r2 As==11
2: 05 55 rla r5 ;
4: 00 24 jz $+2 ;abs 0x6
6: 06 56 rla r6 ;
8: 00 24 jz $+2 ;abs 0xa
a: 06 12 push r6 ;
0000000c <l1>:
c: 38 40 34 12 mov #4660, r8 ;#0x1234
10: 0a 12 push r10 ;
00000012 <l2>:
12: 39 40 78 56 mov #22136, r9 ;#0x5678
16: 0b 12 push r11 ;
问题是JUMPS(即JZ)永远不会发生。无论在JZ之前设置了什么Z标志,代码都会通过JZ。我对JZ的仿效是:
在由MSP430生成的二进制文件中,偏移值正好为0(应该大于0以将PC移动到另一个代码部分)。
如何使跳转正常工作?或者可能生成二进制文件?
答案 0 :(得分:2)
您的test.elf
文件实际上是一个目标文件,因此它仍然包含未解析的重定位。
组装并链接此文件(使用C编译器,以获取调用main
的C启动代码)后,跳转是正确的:
$ msp430-gcc -mmcu=msp430f5529 -minrt -o test.elf test.s
$ msp430-objdump -d test.elf
...
0000454e <main>:
454e: 34 42 mov #8, r4 ;r2 As==11
4550: 05 55 rla r5 ;
4552: 03 24 jz $+8 ;abs 0x455a
4554: 06 56 rla r6 ;
4556: 04 24 jz $+10 ;abs 0x4560
4558: 06 12 push r6 ;
0000455a <l1>:
455a: 38 40 34 12 mov #4660, r8 ;#0x1234
455e: 0a 12 push r10 ;
00004560 <l2>:
4560: 39 40 78 56 mov #22136, r9 ;#0x5678
4564: 0b 12 push r11 ;
...
可以从中生成二进制文件:
$ msp430-objcopy -O binary test.elf test.bin
但是,生成的文件不是很有用,因为它不包含其起始地址。你最好创建(然后在模拟器中使用)Intel hex file:
$ msp430-objcopy -O ihex test.elf test.ihex