【发布时间】: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的模仿是:
- 读取代码(16 位)并获取偏移量(10 位 LSB)
- 检查 Z 标志(0 或 1)
- 如果 Z = 0,则移至代码的下一部分 (PC++)
- 否则,设置 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