我刚刚开始编程汇编,有些事情我不理解。我知道大多数指令都是特定于处理器的,因此我将使用PIC处理器数据手册中的指令编写汇编程序。但是,当我看这个示例程序时,我重新调校了数据手册中的大多数指令,但其中的一些指令并未提及。
我说的是list, #include, equ, ORG
和END
命令。我知道他们在做什么,但我不知道他们来自哪里。这是非特定于处理器的指令,还是不称为指令,在哪里可以找到有关它们的文档。
这是示例代码。
;***********************************************************
; 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
答案 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。