Manual de referencia de Pep/8 |
Pep/8 es una Computadora con Conjunto de Instrucciones Complejas de 16 bits (CISC). Está diseñado para enseñar arquitectura de computadoras y los principios de programación en lenguaje ensamblador. Sus 39 instrucciones están basadas en un código de operación y expansión; son ya sea unario (un byte) o nonunarias (tres bytes). Los ocho modos de direccionamiento están diseñados para la traducción directa entre C/C++ y el lenguaje ensamblador.
Temas:
Conjunto de instrucciones,
Estableciendo el bit C en la resta,
Estableciendo el bit N en CPr
,
Comandos de punto,
Modos de direccionamiento,
Campo del registro,
Etiquetas de seguimiento,
Resumen de la sintaxis del lenguaje ensamblador.
Especificador de la Instrucción | Mnemotécnico | Instrucción | Modos de direccionamiento | Bits de estado |
---|---|---|---|---|
0000 0000 | STOP | Detener ejecución | U | |
0000 0001 | RETTR | Retorno de la trampa | U | |
0000 0010 | MOVSPA | Mover SP a A | U | |
0000 0011 | MOVFLGA | Mover banderas NZVC a A | U | |
0000 010a | BR | Branch unconditional | i, x | |
0000 011a | BRLE | Branch if less than or equal to | i, x | |
0000 100a | BRLT | Branch if less than | i, x | |
0000 101a | BREQ | Branch if equal to | i, x | |
0000 110a | BRNE | Branch if not equal to | i, x | |
0000 111a | BRGE | Branch if greater than or equal to | i, x | |
0001 000a | BRGT | Branch if greater than | i, x | |
0001 001a | BRV | Branch if V | i, x | |
0001 010a | BRC | Branch if C | i, x | |
0001 011a | CALL | Call subroutine | i, x | |
0001 100r | NOTr | Bitwise invert r | U | N Z |
0001 101r | NEGr | Negate r | U | N Z V |
0001 110r | ASLr | Arithmetic shift left r | U | N Z V C |
0001 111r | ASRr | Arithmetic shift right r | U | N Z C |
0010 000r | ROLr | Rotate left r | U | C |
0010 001r | RORr | Rotate right r | U | C |
0010 01nn | NOPn | Unary no operation trap | U | |
0010 1aaa | NOP | Nonunary no operation trap | i | |
0011 0aaa | DECI | Decimal input trap | d, n, s, sf, x, sx, sxf | N Z V |
0011 1aaa | DECO | Decimal output trap | i, d, n, s, sf, x, sx, sxf | |
0100 0aaa | STRO | String output trap | d, n, sf | |
0100 1aaa | CHARI | Character input | d, n, s, sf, x, sx, sxf | |
0101 0aaa | CHARO | Character output | i, d, n, s, sf, x, sx, sxf | |
0101 1nnn | RETn | Return from call with n local bytes | U | |
0110 0aaa | ADDSP | Add to stack pointer (SP) | i, d, n, s, sf, x, sx, sxf | N Z V C |
0110 1aaa | SUBSP | Subtract from stack pointer (SP) | i, d, n, s, sf, x, sx, sxf | N Z V C |
0111 raaa | ADDr | Add to r | i, d, n, s, sf, x, sx, sxf | N Z V C |
1000 raaa | SUBr | Subtract from r | i, d, n, s, sf, x, sx, sxf | N Z V C |
1001 raaa | ANDr | Operación bit a bit AND a r | i, d, n, s, sf, x, sx, sxf | N Z |
1010 raaa | ORr | Operación bit a bit OR a r | i, d, n, s, sf, x, sx, sxf | N Z |
1011 raaa | CPr | Compara r | i, d, n, s, sf, x, sx, sxf | N Z V C |
1100 raaa | LDr | Carga r de la memoria | i, d, n, s, sf, x, sx, sxf | N Z |
1101 raaa | LDBYTEr | Carga byte r de la memoria | i, d, n, s, sf, x, sx, sxf | N Z |
1110 raaa | STr | Guarda r en la memoria | d, n, s, sf, x, sx, sxf | |
1111 raaa | STBYTEr | Guarda el byte r en la memoria | d, n, s, sf, x, sx, sxf |
Z80, x86 y SPARC tratan la bandera de acarreo como una "bandera prestada" al hacer una resta.
Al restar x - y, si x es menor que y (tratamiento de los dos operandos como sin signo),
la bandera de acarreo se establece porque se había "prestado".
A BRC after a SUBr
or CPr
instruction is equivalent to "branch if unsigned overflow" in this case.
On other processor families, such as ARM and PowerPC, the carry flag after a subtraction
is set to the adder carry output after computing (x + ~y + 1).
When subtracting x - y, if x is greater than or equal to y (treating both operands as unsigned), the carry flag is set.
A BRC after a SUBr
or CPr
instruction is equivalent to "branch if not unsigned overflow" in this case.
Previous versions of Pep/8 set the C bit on subtraction according to the first philosophy. However, starting with version 8.1.0, the C bit on subtraction is set according to the second philosophy. This is consistent with the section "The Carry Bit" in Chapter 3, and the adder/subtracter circuit in Figure 10.53 in the text.
En otras familias de procesadores, tales como ARM y PowerPC, la bandera de acarreo después de una sustracción se establece en el sumador de salida después de llevar a la computación (~ x + y + 1). Al restar x - y, si x es mayor o igual a y (tratamiento de los dos operandos como sin signo), se establece la bandera de acarreo. A BRC después de una instrucción SUBR o RCP es equivalente a "deriva cuando se desborda sin firmar" en este caso. Las versiones anteriores de Pep / 8 establece el bit C en la resta de acuerdo con la filosofía primera. Sin embargo, comenzando con la versión 8.1.0, el bit C en la resta se establece de acuerdo con la segunda filosofía. Esto es consistente con la sección "El bit de acarreo" en el Capítulo 3, y el circuito sumador / restador en la Figura 10.53 en el texto.
CPr
CPr
resta el operando en el Registro y establece los bits de estado sin almacenar
el resultado de la resta.
Mientras no hay desbordamiento cuando los operandos se interpretan como números enteros con signo, el bit N se establece apropiadamente para un
instrucción de ramificación condicional posterior.
Si el resultado de la sustracción produce un desbordamiento y el bit N se establecieron como de costumbre, la subsiguiente instrucción de ramificación condicional
podría ejecutar una rama errónea.
En consecuencia, si el CPr
resta desbordamientos de operación y establece el bit V, el bit N se invierte
de su valor normal y no duplica el bit de signo.
Con este ajuste, la operación de comparación se extiende el rango de comparaciones válidas. A pesar de que hay un desbordamiento, el bit N se establece como si no existiera el desbordamiento, de modo que una rama condicional subsiguiente operará como se esperaba.
Commando de punto/th> | Descripción |
---|---|
.ADDRSS símbolo | La dirección de un símbolo (dos bytes) |
.ASCII "cadena" | Una cadena de bytes ASCII |
.BLOCK n | Un blogue de n bytes |
.BURN 0xFFFF | Iniciado ROM quemar terminando en 0xFFFF |
Constante .BYTE | El valor de byte (un byte) |
.END | El centinela para el ensamblador |
Constante .EQUATE | Equiparar un símbolo al valor de una constante |
Constante .WORD | El valor de una palabra (dos bytes) |
Addressing Mode | aaa-field | Letters | Operand |
---|---|---|---|
Immediate | 000 | i | OprndSpec |
Direct | 001 | d | Mem [OprndSpec ] |
Indirect | 010 | n | Mem [Mem [OprndSpec ] ] |
Stack-relative | 011 | s | Mem [SP + OprndSpec ] |
Stack-relative deferred | 100 | sf | Mem [Mem [SP + OprndSpec ] ] |
Indexed | 101 | x | Mem [OprndSpec + X ] |
Stack-indexed | 110 | sx | Mem [SP + OprndSpec + X ] |
Stack-indexed deferred | 111 | sxf | Mem [Mem [SP + OprndSpec ] + X ] |
Modo de direccionamiento | campo-a | Letras | Operando |
---|---|---|---|
Inmediato | 0 | i | OprndSpec |
Indexado | 1 | x | Mem [OprndSpec + X ] |
Campo-r- | Registro |
---|---|
0 | Acumulador, A |
1 | Registro de indice, X |
Etiqueta | Formato |
---|---|
#1c | Caracteres de un byte |
#1d | Decimal de un byte |
#2d | Decimal de dos bytes |
#1h | Hexadecimal de un byte |
#2h | Hexadecimal de dos bytes |
#2d4a | Decimal de dos bytes, matriz de cuatro celdas (ejemplo) |
+
o -
opcional, seguido por un dígito decimal seguido de cero o más dígitos.
Un entero decimal que se utiliza .BYTE
tiene un rando de -128 a 255 bytes, de lo contrario desde -32768 hasta 65535.
Un entero hexadecimal comienza con 0x
o 0X
seguido de uno o más dígitos hexadecimales (mayúsculas o minúsculas).
Un entero hexadecimal con .BYTE
tiene un rango de 0 a FF, de lo contrario de 0 a FFFF.
Un solo caracter está encerrado entre comillas simples, como en 't'
.
Una cadena ASCII se encierra entre comillas dobles, como en "Mi cadena"
.
Un byte arbitrario puede ser incluido en una cadena o un carácter anteponiendo exactamente dos dígitos hexadecimales con \x
o \X
, como en "Nulo terminado \ x00"
.
A double quote is included in a string by prefixing it with \
, as in "She said, \"Hello\"."
.
A single quote is included in a character by prefixing it with \
, as in '\''
.
A backslash character is included in a string or character by prefixing it with \
, as in "My bash is \\."
and '\\'
.
The following letters, when preceded by \
, generate non printable charactersb
backspace, f
form feed, n
line feed (new line), r
carriage return, t
horizontal tab, v
vertical tabin string and character constants, as in "\n Starts on a new line."
and '\n'
.
A backslash character followed by any character other than b
, f
, n
, r
, t
, v
, x
, X
, "
, '
, or \
(except for the second of a pair of \
s) is an error.
Una comilla doble (") precedida de una barra invertida en un carácter que no es necesario, pero es válido y representa una comilla doble.
Una comilla simple (') precedida de una barra invertida en una cadena que no es necesaria, pero es válido y representa una única cotización.
Una constante utilizado como un especificador operando que ocupa menos de dos bytes se justifican a la derecha en el campo de dos bytes.
Una constante utilizado como un especificador operando que ocupa más de dos bytes es un error.