我正在使用 MPLabX IDE 5.4 和 XC8 编译器(一个 C/MPASM 混合编译器,有一个名为 pic-as v.2.2 作为其汇编器的驱动程序)来编译/汇编一段简单的汇编代码并输出一个列表文件。
我的整个汇编代码:
PROCESSOR 16F84A
#include <xc.inc>
PSECT code
; a comment
org 00
addlw 01
addlw 02
addlw 03
clrw
loop: addlw 04
goto loop
end loop
列表文件:
从 MPLab X IDE 的反汇编列表文件或通过 CLI 命令生成相同的结果:)$pic-as -mcpu=16F84A -Wa,-a MyAssemblyFile.S -o MyFolder/MyOutputFileName
:
1 processor 16F84A
2 pagewidth 132
3 psect udata,global,class=RAM,space=1,delta=1,noexec
4 psect udata_bank0,global,class=BANK0,space=1,delta=1,noexec
5 psect code,global,class=CODE,delta=2
6 psect data,global,class=STRCODE,delta=2,noexec
7 psect edata,global,class=EEDATA,space=3,delta=2,noexec
8 0089
9 psect code
10 01FA org 0
11 01FA 3E01 addlw 1
12 01FB 3E02 addlw 2
13 01FC 3E03 addlw 3
14 01FD 0103 clrw
15 01FE loop:
16 01FE 3E04 addlw 4
17 01FF 29FE goto loop
第一列包含行号(即 1,2,3...19)。第二列和第三列分别列出了每条指令的内存(向量)地址(0x01FA-0x01FE)和操作码(3E08、29FE 等)。
问题:
- 指令不应该从 0x0000-0x03FF(PIC16F84A 的程序存储器地址)顺序存储。0x0000 应该始终是程序的起始行或起点,我也明确表示
org 0
为程序起点。但是列表文件显示了占用 0x01FA-0x01FF 的指令 - 就好像汇编程序从程序存储器的中间(0x03FF / 2 = 0x01FF)向上计数并从 0x01FA 开始。 - 什么是
0x0089
地址,为什么会在那里?
[编辑] 映射文件(如果重要)
Name Link Load Length Selector Space Scale
Output/temp.o code 1FA 1FA 6 3F4 0
TOTAL Name Link Load Length Space
CLASS CODE
code 1FA 1FA 6 0