【问题标题】:How to generate binary from MSP430 assembler with correct jumps?如何从 MSP430 汇编器生成具有正确跳转的二进制文件?
【发布时间】:2016-01-16 18:38:21
【问题描述】:

我正在用 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,则移至代码的下一部分 (PC++)
  4. 否则,设置 PC = PC + 2*offset

在MSP430生成的二进制文件中,偏移值正好为0(应该大于0才能将PC移动到另一个代码段)。

如何使跳转正常工作?或者二进制文件的生成被破坏了?

【问题讨论】:

  • 虽然有些人称 C 为“高级语言的汇编器”,但这是真正的汇编器。不要添加不相关的标签!
  • @Olaf,不,我用 C 语言做这个。汇编器仅用于准备二进制输入文件(这可能是问题的原因)。
  • 您只显示汇编器输出。 C 与此无关。最多是编译器的问题。
  • @kfx: 1) OP 没有说明他使用的编译器/汇编器。 2)他也没有说文件是否已经重新定位,这可能会有所不同。 3) 要查看 ADD 指令更改了哪些标志 - 因此如果 JZ 有用与否,您只需查看任何 MSP430 系列用户指南中的指令描述。
  • @kfx ti.com/lit/ug/slau049f/slau049f.pdf 在第 85 页。从第 40 页开始:“零位。当字节或字操作的结果为 0 时设置该位,当结果不为 0 时清除该位。”

标签: assembly simulation microcontroller msp430


【解决方案1】:

您的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

【讨论】:

  • 如何用这个方法把test.s 放到test.bin 中(跳转值正确)?
  • 已更新;但是 .bin 文件会得到错误的绝对地址。
  • 那么如何用正确的地址实现输入数据二进制?
  • 纯二进制文件不(不能)包含ist起始地址。这就是为什么你不应该使用这种格式。
猜你喜欢
  • 1970-01-01
  • 2018-11-01
  • 2017-05-18
  • 1970-01-01
  • 2011-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多