如何从MSP430汇编器生成具有正确跳转的二进制文件?

时间:2016-01-16 18:38:22

标签: assembly simulation microcontroller msp430

我正在使用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的仿效是:

  1. 读取代码(16位)并获得偏移量(10位LSB)
  2. 检查Z标志(0或1)
  3. 如果Z = 0,请转到Code(PC ++)的下一部分
  4. 否则,设置PC = PC + 2 *偏移
  5. 在由MSP430生成的二进制文件中,偏移值正好为0(应该大于0以将PC移动到另一个代码部分)。

    如何使跳转正常工作?或者可能生成二进制文件?

1 个答案:

答案 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