asxxxx es una serie de cross assemblers para varias arquitecturas. En particular, el asx8051 es para el 8051. Todo lo que escribo funciona len Linux, no tengo idea si en Windows es igual, pero debería funcionar. Para ensamblar -------------- asx8051 -los archivo.asm Las opciones l, o y s crean archivo.lst, archivo.rel y archivo.sym, respectivamente. El más importante es el archivo objeto: archivo.rel. Para linkear ------------ El linker es medio raro, creo que la mejor forma de ejecutarlo es: 1) crear un archivo prog.lnk que contiene la lista de los archivos .rel que se van a linkear. Por ejemplo, si queremos linkear prog1.rel y prog2.rel: ------------ prog.lnk ------------- prog1 prog2 -im ----------------------------------- Al final pongo -i para que genere la salida en formato Intel HEX (que después se convierte a binario con HEX2BIN) y la opción m para que genere prog.map (información). 2) Ejecutar: aslink -f prog.lnk La otra opción es hacer 'aslink -c' y escribirle a continuación exactamente lo mismo que iría en el archivo prog.lnk. Instrucción genérica -------------------- [label:] Operator Operand [;Comment(s)] Instrucciones y operandos para el asx8051 ----------------------------------------- K.1 8051 REGISTER SET The following is a list of the 8051 registers used by AS8051: a,b - 8-bit accumulators r0,r1,r2,r3 - 8-bit registers r4,r5,r6,r7 dptr - data pointer sp - stack pointer pc - program counter psw - status word c - carry (bit in status word) K.2 8051 INSTRUCTION SET The following tables list all 8051 mnemonics recognized by the AS8051 assembler. The following list specifies the format for each addressing mode supported by AS8051: #data immediate data byte or word data r,r1,r2 register r0,r1,r2,r3,r4,r5,r6, or r7 @r indirect on register r0 or r1 @dptr indirect on data pointer @a+dptr indirect on accumulator plus data pointer @a+pc indirect on accumulator plus program counter addr direct memory address bitaddr bit address label call or jump label The terms data, addr, bitaddr, and label may all be expressions. Note that not all addressing modes are valid with every in- struction. Refer to the 8051 technical data for valid modes. K.2.1 Inherent Instructions nop K.2.6 Move Instructions mov a,#data mov a,addr mov a,r mov a,@r mov r,#data mov r,addr mov r,a mov addr,a mov addr,#data mov addr,r mov addr,@r mov addr1,addr2 mov bitaddr,c mov @r,#data mov @r,addr mov @r,a mov c,bitaddr mov dptr,#data movc a,@a+dptr movc a,@a+pc movx a,@dptr movx a,@r movx @dptr,a movx @r,a K.2.8 Single Operand Instructions clr a clr c clr bitaddr cpl a cpl c cpl bitaddr setb c setb bitaddr da a rr a rrc a rl a rlc a swap a dec a dec r dec @r inc a inc r inc dptr inc @r div ab mul ab pop addr push addr K.2.8 Two Operand Instructions add a,#data add a,addr add a,r add a,@r addc a,#data addc a,addr addc a,r addc a,@r subb a,#data subb a,addr subb a,r subb a,@r orl a,#data orl a,addr orl a,r orl a,@r orl addr,a orl addr,#data orl c,bitaddr orl c,/bitaddr anl a,#data anl a,addr anl a,r anl a,@r anl addr,a anl addr,#data anl c,bitaddr anl c,/bitaddr xrl a,#data xrl a,addr xrl a,r xrl a,@r xrl addr,a xrl addr,#data xrl c,bitaddr xrl c,/bitaddr xch a,addr xch a,r xch a,@r xchd a,@r K.2.3 Call and Return Instructions acall label lcall label ret reti K.2.4 Jump Instructions ajmp label cjne a,#data,label cjne a,addr,label cjne r,#data,label cjne @r,#data,label djnz r,label djnz addr,label jbc bitadr,label jb bitadr,label jnb bitadr,label jc label jnc label jz label jnz label jmp @a+dptr ljmp label sjmp label Parece que no se puede usar simplemente 'jmp' o 'call', y hay que elegir una de 'acall', 'lcall', 'ljmp', 'sjmp', etc. Labels ------ Caracteres aceptados: A-Z a-z 0-9 (menos el primer caracter - ver local symbols) . (Period) $ (Dollar sign) _ (underscore) El label puede ser de cualquier tamaño, pero sólo los primeros 8 caracteres son significativos. Ejemplos: aaaa: add A,B _aq: nop $abc: sjmp aaaa gl:: sub A,B 'gl' es un label global, porque tiene dos ':'. Puede ser referenciado en otros módulos. Local Symbols ------------- Son labels locales al bloque en el que son definidos (creo que un label común comienza un nuevo bloque). Genéricamente son del tipo n$, donde n es un número de 0 a 255. Ejemplos: 1$: 27$: 167$: 255$: Ejemplo de uso: a: ldx #atable ;get table address lda #0d48 ;table length 1$: clr ,x+ ;clear deca bne 1$ b: ldx #btable ;get table address lda #0d48 ;table length 1$: clr ,x+ ;clear deca bne 1$ Algunas tablas -------------- Table 3 Assembler Operators ---------------------------------------------------------------- # Number sign Immediate expression indicator. . Period Current location counter. ( Left parenthesis Expression delimiter. ) Right parenthesis Expression delimeter. ---------------------------------------------------------------- Table 4 Unary Operators ---------------------------------------------------------------- < Left bracket Right bracket >FEDC Produces the upper byte value of the expression. (FE) + Plus sign +A Positive value of A - Minus sign -A Produces the negative (2's complement) of A. ~ Tilde ~A Produces the 1's comple- ment of A. ' Single quote 'D Produces the value of the character D. " Double quote "AB Produces the double byte value for AB. \ Backslash '\n Unix style characters \b, \f, \n, \r, \t or '\001 or octal byte values. ---------------------------------------------------------------- Table 5 Binary Operators ---------------------------------------------------------------- << Double 0800 << 4 Produces the 4 bit Left bracket left-shifted value of 0800. (8000) >> Double 0800 >> 4 Produces the 4 bit Right bracket right-shifted value of 0800. (0080) + Plus sign A + B Arithmetic Addition operator. - Minus sign A - B Arithmetic Subtraction operator. * Asterisk A * B Arithmetic Multiplica- tion operator. (signed 16-bit) / Slash A / B Arithmetic Division operator. (signed 16-bit quotient) & Ampersand A & B Logical AND operator. | Bar A | B Logical OR operator. % Percent sign A % B Modulus operator. (16-bit value) ^ Up arrow or A ^ B EXCLUSIVE OR operator. circumflex ---------------------------------------------------------------- Location Counter ---------------- El símbolo . (punto) representa la dirección de la instrucción. Ejemplos: sjmp #. sjmp #.+0x10 (También se puede usar 'sjmp .', sin el #). Constantes ---------- En lugar de la directiva 'equ' se usa un '=': LABEL = EXPRESSION Ejemplos: NUM = 10 A = NUM + 0x12 G == 3 El label G es global, porque está definido con '=='. Números ------- Por defecto, los números se expresan en decimal. Si se expresa un número negativo, el ensamblador utiliza complemento a 2. Table 6 Temporary Radix Operators ---------------------------------------------------------------- $%, 0b, 0B Binary radix operator. $&, 0o, 0O, 0q, 0Q Octal radix operator. $#, 0d, 0D Decimal radix operator. $$, 0h, 0H, 0x, 0X Hexidecimal radix operator. ---------------------------------------------------------------- Directivas ---------- .byte y .db Generan bytes sucesivos de datos binarios en el módulo objeto. Format: .byte exp ;Stores the binary value .db exp ;of the expression in the ;next byte. .byte exp1,exp2,expn ;Stores the binary values .db exp1,exp2,expn ;of the list of expressions ;in successive bytes. where: exp, represent expressions that will be exp1, truncated to 8-bits of data. . Each expression will be calculated . as a 16-bit word expression, . the high-order byte will be truncated. . Multiple expressions must be expn separated by commas. .word y .dw Idem, pero 16-bits. .ds, .blkb y .blkw Reservan bloques de espacio. .blkw reserva bloques de 16 bits. Format: .ds N ; reserva N bytes .blkb N ; idem .blkw N ; reserva N words .ascii, .ascis y .asciz Genera texto en el módulo objeto. Si se usa .ascis, el último caracter tiene el MSB en 1. Si se usa .asciz, se añade un caracter '\0' al final. Format: .ascii /string/ where: string is a string of printable ascii characters. / / represent the delimiting characters. These delimiters may be any paired printing characters, as long as the characters are not contained within the string itself. If the delimiting characters do not match, the .ascii directive will give the (q) error. .area Define un segmento de código o datos. Format: .area name [(options)] where: name represents the symbolic name of the program sec- tion. This name may be the same as any user-defined symbol as the area names are in- dependent of all symbols and labels. options specify the type of program or data area: ABS absolute (automatically invokes OVR) REL relocatable OVR overlay CON concatenate PAG paged area The .area directive provides a means of defining and separat- ing multiple programming and data sections. The name is the area label used by the assembler and the linker to collect code from various separately assembled modules into one section. The name may be from 1 to 8 characters in length. The options are specified within parenthesis and separated by commas as shown in the following example: .area TEST (REL,CON) ;This section is relocatable ;and concatenated with other ;sections of this program area. .area DATA (REL,OVR) ;This section is relocatable ;and overlays other sections ;of this program area. .area SYS (ABS,OVR) ;(CON not allowed with ABS) ;This section is defined as ;absolute. Absolute sections ;are always overlayed with ;other sections of this program ;area. .area PAGE (PAG) ;This is a paged section. The ;section must be on a 256 byte ;boundary and its length is ;checked by the linker to be ;no larger than 256 bytes. ;This is useful for direct page ;areas. Las opciones por defecto son (REL,CON). El area _CODE está definida por defecto y es REL,CON. Específico para asx8051 ----------------------- Se agregan las siguientes opciones para la directiva .area: CODE for codespace DATA for internal data BIT for internal bit-addressable XDATA for external data. These will typically be used as follows (names are examples): .area IDATA (DATA) .area IBIT (BIT) .area MYXDATA (REL,CON,XDATA) .area MYCODE (REL,CON,CODE) ATENCION -------- The default segment, _CODE, should not be used for the 8051. For compatibility reasons, _CODE is allocated in "DATA" space. You should always define an area in the CODE space. .org Válido solo en un area absoluta. Especifica la posición actual en el area. .include Incluye un archivo. Format: .include "file"