MPLabX IDE 5.4에서 가장 간단한 어셈블리 파일을 빌드하는 방법

Aug 19 2020

MPLabX IDE 5.4에서 어셈블리 코딩을 배우기 시작했습니다. 하드웨어, 시뮬레이터 또는 디버거를 연결하지 않고 단순히 개체 코드 파일을 빌드하고 어셈블리 파일에서 목록 파일을 생성하여 IDE가 작동하는지 확인하고 싶습니다. 하지만 가능한 가장 간단한 조립 라인을 구축하더라도 모호한 오류 메시지가 계속 나타납니다.

그림 [1-6] 에서 볼 수 있듯이 XC8의 통합과 함께 MPLabX IDE를 올바르게 설치해야합니다 (pic-as 어셈블리 컴파일러 또는 MPASM 어셈블러의 다른 이름을 패키지하는 것 같습니다. 번들로 묶여 있다는 것을 깨달을 때까지 MPASM 코드에 C 컴파일러가 필요한 이유를 검색합니다.) 그런 다음 한 줄의 주석과 하나의 end명령으로 어셈블리 파일을 빌드하는 것을 테스트했습니다 . 어셈블리가 성공적으로 빌드되었지만 목록 파일을 찾을 수 없습니다 (모든 디렉터리를 검색하는 하나의 * .lst 파일이 없음).

이전 end에 지침을 추가하자마자 그림 [7] 과 같이 빌드 프로세스가 실패했습니다 .

  1. 어셈블리 코드가 빌드되지 않는 이유는 무엇입니까?
  2. 내 빌드 프로세스 (실패 또는 성공)가 다른 사람들처럼 목록 파일을 생성하지 않은 이유

[편집]
다음은 어셈블리 코드 파일입니다. 프로젝트는 [1-6] 단계에서 생성되었습니다. 방금 org, clrw 및 end의 세 줄의 명령 으로 새 어셈블리 파일 ( FooFile.asm )을 만들었습니다 .

답변

7 Dan1138 Aug 21 2020 at 03:59

Microchip은 MPLABX v5.40의 최신 릴리스를 사용하여 8 비트 어셈블리 언어 애플리케이션을 개발하는 것을 매우 어렵게 만들었습니다.

PIC16F84A 예제 프로젝트를 만드는 데 도움이되도록 여기에서 찾을 수 있습니다 .

다음은 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,global,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,global,class=CODE,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,global,class=RAM,space=1,delta=1,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,global,class=CODE,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 프로젝트의 사본을 얻을 수 있다면. Microchip이 아직 충분히 자세히 문서화하지 않은 MPLABX에서 어셈블리 언어 프로젝트를 설정하는 방법에 대해 배워야 할 몇 가지 사항이 있습니다.

나는 Microchip이 직원이 아니고 그들이이 일을 할만큼 충분히 지불 할 수 없었습니다.

학교가 가을 세션에서 PIC 어셈블리 언어를 가르치기 시작함에 따라 MPLABX 도구의 문제가 더 문제가 될 것으로 예상합니다. 이 답변에 대한 나의 목표는 더 많은 학생들이 절름발이 도구에 대한 사소한 문제로 인해 좌절하지 않고 실패하지 않도록 돕는 것입니다.

2 KMC Aug 19 2020 at 23:33

Microchip이 MPLab X 및 XC8에 대해 가지고있는 문서는 아마도 제가 읽은 최악의 문서 일 것입니다. MPLab X IDE 5.4에서 어셈블러가 작동하도록하기 위해 여러 소스에서 읽은 내용을 메시해야했습니다. 여기에 오류나 경고 메시지없이 조립되는 어셈블리 코드가 있습니다.

PROCESSOR 16F84A
#include <xc.inc>
PSECT   code
        org     00
loop:   clrw
        end     loop

내가 읽은 튜토리얼 과 책 은 현재 XC8의 pic-as 대신 MPASM 어셈블러를 사용합니다. MPASM 및 이전 MPLab을 사용하면 순수한 어셈블리 코드가 빌드됩니다. 그러나 현재의 XC8 및 pic-as에서는 /Applications/microchip/xc8/v2.20/pic/include/xc.inc 를 포함하는 것으로 시작해야합니다. 여기서 / Applications / microchip / xc8 / v2를 가리키는 지시문이 있습니다. 20 / 그림 / 포함 / pic.inc 회전에서에 지시 포인팅이있는 /Applications/microchip/xc8/v2.20/pic/include/ic_as_chip_select.inc을 그에게 결국 포인트 /Applications/microchip/xc8/v2.20/ PSECT 를 정의하는 pic / include / proc / pic16f84a.inc :

psect udata,class=RAM,space=SPACE_DATA,noexec
psect udata_bank0,class=BANK0,space=SPACE_DATA,noexec
psect code,class=CODE,space=SPACE_CODE,delta=2
psect data,class=STRCODE,space=SPACE_CODE,delta=2,noexec
psect edata,class=EEDATA,space=SPACE_EEPROM,delta=2,noexec

모호한 이유가 무엇이든 psect어셈블리 코드를 감싸 야합니다. 설명은 다음과 같이 제공됩니다 (그게 무슨 말을하는지 또는 C 함수 호출을 브래킷으로 래핑하는 것처럼 어셈블리 코드를 래핑해야하는 이유를 모르겠습니다).

프로그램 섹션의 줄임말 인 Psect는 프로그램의 관련 부분을 그룹화하고 보관하는 컨테이너입니다. 이러한 부분의 소스 코드가 소스 파일에서 물리적으로 인접하지 않거나 여러 모듈에 분산되어있을 수도 있습니다. 링커가 메모리에 배치하는 가장 작은 엔티티입니다.

목록 파일의 경우 : 목록 파일을 읽거나 출력하는 지침은 MPLAB® X IDE 사용자 가이드 (127 페이지의 섹션 5.16) : Window> Debugging> Output> DisassemblyListingFile에 다소 언급되어 있습니다. 또한, 목록 파일로 출력 할 수 /MyProject/disassembly/listing.disasm (안 *에서 .LST에 삽입하여 마이크로 칩 포럼 또는 가이드가 제안!와 같은 형식) -code=0h -Wa,-a/ 그림 - asLinker / CustomLinkerOptions에게 ProjectProperties (언급이없는 나 XC8 명령 줄에서 컴파일하는 예제를 제공하는 MPLAB® XC8 PIC Assembler User 's Guide for Embedded Engineers ) 를 읽고 어디에 삽입해야할지 추측 합니다. IDE에서 생성 된 목록 파일은 모든 세부 정보를 제공하지 않습니다. 명령어의 벡터 주소도 표시하지 않습니다!

Disassembly Listing for FooProject
Generated From:
/Users/*******/Desktop/Foo/dist/default/production/Foo.production.elf


---  /Users/*******/Desktop/Foo/FooFile.asm  ------------------------------------------------------------
                                                  1:     PROCESSOR 16F84A
                                                  2:     #include <xc.inc>
                                                  3:     PSECT code
                                                  4:         ; a commend
                                                  5:        org     00
01FF  0103     CLRW                               6:     loop:  clrw
                                                  7:        end     loop
 

나는 내 대답을 받아들이지 않을 것이다. 누군가가 내 발견 사항을 해결하는 데 도움을 주거나 psect 가 왜 거기에 있는지, 벡터 주소를 표시하기 위해 목록 파일을 얻는 방법을 설명 할 수 있다면 나는 그 / 그녀의 대답을 받아 들일 것입니다.

[편집] -Wa, -a 옵션을 사용하여 MPLabX 5.4 또는 X8 (pis-as) CLI에서 목록 파일을 출력하려면.

// 컴파일러가 C 전처리기를 전처리하려면 소스 파일이 * .S 확장자로 끝나야합니다. $ sudo pic-as -mcpu = 16F84A -Wa, -a SourceFileName.S -o OutputFolderName / OutputFileName