向量地址从程序存储器的中间开始

如何解决向量地址从程序存储器的中间开始

我正在将MPLabX IDE 5.4与XC8编译器(具有名为pic-as v.2.2的驱动程序作为其汇编程序的C / MPASM混合编译器)一起使用,以编译/汇编简单的汇编代码并输出清单文件。

我的整个汇编代码:

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,class=BANK0,noexec
 5                              psect   code,class=CODE,delta=2
 6                              psect   data,class=STRCODE,delta=2,noexec
 7                              psect   edata,class=EEDATA,space=3,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等)。

问题:

  1. 不应从0x0000-0x03FF(PIC16F84A的程序存储器地址)开始顺序存储指令。 0x0000应该始终是程序的起点或起点,我也明确地将org 0声明为程序的起点。但是清单文件显示的指令却占用了0x01FA-0x01FF -好像汇编器从程序存储器的中间(0x03FF / 2 = 0x01FF)开始向上计数,然后从0x01FA开始。
  2. 什么是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

解决方法

使用最新版本的MPLABX v5.40,Microchip很难开发8位汇编语言应用程序。

为帮助我制作了PIC16F84A示例项目,您可以找到here

这是pic-as(v2.20)源代码:

    ;
    ; File:     main.S
    ; Target:   PIC16f84A
    ; Author:   dan1138
    ; Date:     2020-08-20
    ; Compiler: pic-as(v2.20)
    ; IDE:      MPLABX v5.40
    ;
    ; Description:
    ;
    ;   Example project for the PIC16F84A controller using the pic-as(v2.20) tool chain.
    ;
    ; Add this line in the project properties box,pic-as Global Options -> Additional options: 
    ;   -Wa,-a -Wl,-pPor_Vec=0h,-pIsr_Vec=4h
    ;
    ;                           PIC16F84A
    ;                   +----------:_:----------+
    ;             <>  1 : RA2               RA1 : 18 <> 
    ;             <>  2 : RA3               RA0 : 17 <> 
    ;             <>  3 : RA4/T0CKI        OSC1 : 16 <- 4MHz crystal
    ;    ICSP_VPP ->  4 : MCLR             OSC2 : 15 -> 4MHz crystal     
    ;         GND ->  5 : GND               VDD : 14 <- 5v0
    ;             <>  6 : RB0/INT       PGD/RB7 : 13 <> ICSP_PGD
    ;             <>  7 : RB1           PGC/RB6 : 12 <> ICSP_PGC
    ;             <>  8 : RB2               RB5 : 11 <> 
    ;             <>  9 : RB3               RB4 : 10 <> 
    ;                   +-----------------------:
    ;                            DIP-18

        PROCESSOR   16F84A
        PAGEWIDTH   132
        RADIX       DEC

    #include <xc.inc>

    ; PIC16F84A Configuration Bit Settings

     config FOSC = HS        ; Oscillator Selection bits (HS oscillator)
     config WDTE = OFF       ; Watchdog Timer (WDT disabled)
     config PWRTE = OFF      ; Power-up Timer Enable bit (Power-up Timer is disabled)
     config CP = OFF         ; Code Protection bit (Code protection disabled)

      skipnc  MACRO
        btfsc   STATUS,STATUS_C_POSITION
      ENDM

      skipnz  MACRO
        btfsc   STATUS,STATUS_Z_POSITION
      ENDM
    ;
    ; Power-On-Reset entry point
    ;
        PSECT   Por_Vec,global,class=CODE,delta=2
        global  resetVec
    resetVec:
        PAGESEL main                ;jump to the main routine
        goto    main

    ;
    ;   Data space use by interrupt handler to save context
        PSECT   Isr_Data,class=RAM,space=1,delta=1,noexec
    ;
        GLOBAL  WREG_save,STATUS_save
    ;
    WREG_save:      DS  1
    STATUS_save:    DS  1
    PCLATH_save:    DS  1
    ;
    ;   Interrupt vector and handler
        PSECT   Isr_Vec,delta=2
        GLOBAL  IsrVec
    ;
    IsrVec:
        movwf   WREG_save
        swapf   STATUS,W
        movwf   STATUS_save
        movf    PCLATH,W
        movwf   PCLATH_save
    ;
    IsrHandler:
    ;
    IsrExit:
        movf    PCLATH_save,W
        movwf   PCLATH
        swapf   STATUS_save,W
        movwf   STATUS
        swapf   WREG_save,F
        swapf   WREG_save,W
        retfie                      ; Return from interrupt
        

    ;objects in bank 0 memory
        PSECT   MainData,noexec
    max:    DS      1               ;reserve 1 byte for max
    tmp:    DS      1               ;reserve 1 byte for tmp

    /* find the highest PORTB value read,storing this into the object max */
        PSECT   MainCode,delta=2
    main:
        BANKSEL TRISB               ;starting point
        movlw   0xFF
        movwf   BANKMASK(TRISB)     ;
        BANKSEL max
        clrf    BANKMASK(max)
    loop:
        BANKSEL PORTB               ;read and store port value
        movf    BANKMASK(PORTB),w
        BANKSEL tmp
        movwf   BANKMASK(tmp)
        subwf   max,w               ;is this value larger than max?
        skipnc
        goto    loop                ;no - read again
        movf    BANKMASK(tmp),w     ;yes - record this new high value
        movwf   BANKMASK(max)
        goto    loop                ;read again
        END     resetVec

如果可以的话,请从我的git存储库中获取整个MPLABX项目的副本。在MPLABX中建立汇编语言项目需要了解一些事情,而Microchip还没有提供足够详细的文档。

如果不是Microchip,他们不是我的雇员,他们不能付我足够的钱为他们这样做。

我期望随着学校在秋季课程中开始教授PIC汇编语言,MPLABX工具的问题将成为更多的问题。我的答案是,在由于la脚工具的琐碎问题而使更多的学生感到沮丧和失败之前,尝试提供帮助。

,

MPLabX IDE 无法为中端设备正确构建 pic-as 项目,因为缺少在位置 0x000 "-Wl,-presetVec=0h" 处设置重置向量的选项。 您可以从命令行构建项目:

pic-as -mcpu=16f1937 -Wl,-presetVec=0h -Wa,-Map=test.map test.S

XC8-PIC Assembler Guide for EE中所述。

或者,您可以尝试在项目选项中将选项 -Wl,-presetVec=0h 添加到 pic-as 编译器/链接器,以从 IDE 构建。 MPLABX v5.40 compiler settings

顺便说一句,也缺少将中断向量放置在正确位置的选项。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-