汇编语言是否有非特定于处理器的指令?

时间:2019-11-25 14:54:38

标签: assembly pic

我刚刚开始编程汇编,有些事情我不理解。我知道大多数指令都是特定于处理器的,因此我将使用PIC处理器数据手册中的指令编写汇编程序。但是,当我看这个示例程序时,我重新调校了数据手册中的大多数指令,但其中的一些指令并未提及。

我说的是list, #include, equ, ORGEND命令。我知道他们在做什么,但我不知道他们来自哪里。这是非特定于处理器的指令,还是不称为指令,在哪里可以找到有关它们的文档。

这是示例代码。

;***********************************************************
; File Header
;***********************************************************

list p=18F25k50, r=hex, n=0
#include <p18f25k50.inc>

X1 equ  0x00
Y1 equ  0x01
C1 equ  0x03
C2 equ  0x04
C3 equ  0x05

;***********************************************************
; Reset Vector
;***********************************************************

    ;ORG   0x000  ; DEBUG Reset Vector
    ORG    0x1000  ; LOAD
         ; When debugging:0x000; when loading: 0x1000
    GOTO    START


;***********************************************************
; Interrupt Vector
;***********************************************************



    ;ORG    0x008
    ORG     0x1008  ; Interrupt Vector  HIGH priority
    GOTO    inter_high  ; When debugging:0x008; when loading: 0x1008
    ;ORG    0x018
    ORG     0x1018  ; Interrupt Vector  HIGH priority
    GOTO    inter_low   ; When debugging:0x018; when loading: 0x1018



;***********************************************************
; Program Code Starts Here
;***********************************************************

    ORG     0x1020      ; When debugging:0x020; when loading: 0x1020
    ;ORG    0x020
START
    movlw   0x80        ; load value 0x80 in work register
    movwf   OSCTUNE     
    movlw   0x70        ; load value 0x70 in work register
    movwf   OSCCON      
    movlw   0x10        ; load value 0x10 to work register
    movwf   OSCCON2     
    clrf    PORTA       ; Initialize PORTA by clearing output data latches
    movlw   0x00        ; Value used to initialize data direction
    movwf   TRISA       ; Set PORTA as output
    movlw   0x00        ; Configure A/D for digital inputs 0000 1111
    movwf   ANSELA      ;
    movlw   0x00        ; Configure comparators for digital input
    movwf   CM1CON0
    clrf    PORTB       ; Initialize PORTB by clearing output data latches
    movlw   0x00        ; Value used to initialize data direction
    movwf   TRISB       ; Set PORTB as output
    clrf    PORTC       ; Initialize PORTC by clearing output data latches
    movlw   0x01        ; Value used to initialize data direction
    movwf   TRISC       ; Set RC0 as input

    bcf     UCON,3      ; to be sure to disable USB module    
    bsf     UCFG,3      ; disable internal USB transceiver

main
    clrf    X1          ; clear registers
    clrf    Y1
    movlw   0x01        ; move 0x01 to Register X1
    movwf   X1

ifstart 
    btfss   PORTC,0          ; check RC0, if it?s equal ?1? continue
    goto    shifter          ; else go back
    goto    delay        ; wait so proces is visable for humans
    postdelay
    goto    ifstart

shifter                  ; Linear Feedback Shift Register
    movf    X1,0             ; move X1 into W register
    movff   X1,Y1            ; move X1 value to Y1
    rlcf    Y1               ; shift 1bit to left
    xorwf   Y1,1             ; xor W with Y1, store the result in Y1
    btfsc   Y1,3             ; test if Y1bit 3 is 0,skip to the State2
    goto    state1
    goto    state2

state1
    rlcf    X1                ; shift 1 bit to left
    bsf     X1,0              ; set bit 0 to 1
    movf    X1,0              ; move X1 to PORTB
    movwf   PORTA
    goto    ifstart

state2
    rlcf    X1
    bcf     X1,0
    movf    X1,0
    movwf   PORTA
    goto    ifstart

inter_high
    nop
    RETFIE
inter_low
    nop
    retfie

delay
    incfsz  C1          ; wait 256 (P = 6.4us)
    goto    delay       ; go back
    incfsz  C2          ; wait 256*256 = 65536 (P = 1.6ms)
    goto    delay       ; go back
    incf    C3          ; wait 256*256*64 = 10223616 (P = 0.255s)
    btfss   C3, 5 
    goto    delay       ; go back
    goto    postdelay       ; delay is over 
END

1 个答案:

答案 0 :(得分:1)

汇编语言是一种与其他语言一样的编程语言,只是另一种编程语言。但是,不同于C或C ++或类似的语言是由汇编程序定义的,而不是由某些标准机构读取它的程序。因此,即使对于特定目标的特定指令集,也可能存在不同的汇编语言。不讨论AT&T与Intel,所有语法都是该语言的一部分。如所示,大多数汇编语言程序都是助记符和操作数,它们代表机器指令,但是有些百分比是您所要询问的标签和指令。像C中的#include,#define,#typedef,void,unsigned等。在同一目标的汇编程序之间发现最多差异的地方在于指令,而不是代表指令的行。有些有

.section .text

其他

SECTION TEXT

例如。

对于汇编器而言,最重要的是,如果他们想编写一种汇编语言而不是

,则使机器代码正确无误。
mov r0,r1
add r2,r2,r1

他们期望

bob apple,orange
joe banana,banana,orange

那么他们可能不会吸引很多用户,并不意味着它不能产生适当的机器代码。

为此,正如您所评论的,每种指令集体系结构是不同的x86与arm完全不兼容,而arm与pic完全不兼容。因此,汇编语言自然会有所不同,有时您会看到mov和cmp是相同的助记符,但是寄存器的既定名称等等。

因此,正如Jester在上面的评论中所回答的那样,您需要查阅汇编程序(与正在使用的特定程序一样)文档。说虽然可悲的是这几天(例如,对于TASM来说不是这样),但对于汇编程序来说,文档通常很薄弱。 YMMV。