Assembly language and addressing modes · Lenguaje ensamblador y modos de direccionamiento
| English | Español |
|---|---|
| assembler/əˈsemblə/ | ensamblador |
| mnemonic/nɪˈmɒnɪk/ | mnemotécnico |
| instruction set/ɪnˈstrʌkʃn set/ | juego de instrucciones |
| machine code/məˈʃiːn kəʊd/ | código máquina |
| assembly language/əˈsemblɪ ˈlæŋɡwɪdʒ/ | lenguaje ensamblador |
| operand/ˈɒpərænd/ | operando |
| opcode/ˈɒpkəʊd/ | opcode (código de operación) |
| symbol table/ˈsɪmbl ˈteɪbl/ | tabla de símbolos |
| label/ˈleɪbl/ | etiqueta |
| forward references/ˈfɔːwəd ˈrefrənsɪz/ | referencias hacia adelante |
| addressing mode/əˈdresɪŋ məʊd/ | modo de direccionamiento |
| immediate addressing/ɪˈmiːdɪət əˈdresɪŋ/ | direccionamiento inmediato |
| direct addressing/daɪˈrekt əˈdresɪŋ/ | direccionamiento directo |
| indirect addressing/ɪndaɪˈrekt əˈdresɪŋ/ | direccionamiento indirecto |
| indexed addressing/ˈɪndekst əˈdresɪŋ/ | direccionamiento indexado |
| relative addressing/ˈrelətɪv əˈdresɪŋ/ | direccionamiento relativo |
Thirty-one instructions on a row of switches
- In 1949 the EDSAC computer in Cambridge started up from 31 instructions set on switches, written by David Wheeler and called the "initial orders".
- Their whole job was to read letters such as A and S from paper tape and turn them into the numbers the machine actually understood: the first assembler 汇编器.
- Programmers have written mnemonics instead of bit patterns ever since, and the exam's own instruction set is a direct descendant.
- This lesson is about that translation, tracing a program by hand, and the five ways an instruction can say where its data is.
Treinta y una instrucciones en una fila de interruptores
- En 1949, la computadora EDSAC de Cambridge se encendió a partir de 31 instrucciones configuradas en interruptores, escritas por David Wheeler y llamadas "órdenes iniciales".
- Su única tarea era leer letras como A y S desde una cinta de papel y convertirlas en los números que la máquina realmente entendía: el primer ensamblador.
- Desde entonces, los programadores han escrito mnemotécnicos en lugar de patrones de bits, y el conjunto de instrucciones del examen es un descendiente directo.
- Esta lección trata sobre esa traducción, el seguimiento manual de un programa y las cinco formas en que una instrucción puede indicar dónde se encuentra su dato.
Machine code and assembly language
- The processor runs machine code 机器码: bit patterns, specific to one architecture, each one an operation code and an operand.
- Assembly language 汇编语言 is the readable form. Each instruction is written with a mnemonic 助记符 such as
LDD,ADDorJMP, and each assembly instruction becomes exactly one machine-code instruction. - The assembler translates it. The relationship is one to one, which is what makes assembly different from a high-level language, where one statement becomes many instructions.
Each mnemonic becomes one opcode; each symbolic address becomes a number
Código máquina y lenguaje ensamblador
- El procesador ejecuta código máquina: patrones de bits, específicos de una arquitectura, donde cada uno es un código de operación y un operando.
- El lenguaje ensamblador es la forma legible. Cada instrucción se escribe con un mnemotécnico tal como
LDD,ADDoJMP, y cada instrucción de ensamblador se convierte en exactamente una instrucción de código máquina. - El ensamblador lo traduce. La relación es uno a uno, lo cual es lo que diferencia al ensamblador de un lenguaje de alto nivel, donde una sola declaración se convierte en muchas instrucciones.

Cada mnemotécnico se convierte en un opcode; cada dirección simbólica se convierte en un número
Assembly language is: · El lenguaje ensamblador es:
Assembly uses mnemonics and maps one-to-one to machine code; an assembler translates it. · El ensamblador usa mnemotécnicos y mapea uno a uno al código máquina; un ensamblador lo traduce.
The two-pass assembler
- Pass 1 reads the source and builds a symbol table 符号表: every time a label 标签 such as
LOOP:appears, its address is recorded. No code is produced. - Pass 2 reads the source again and generates the code, replacing each mnemonic by its opcode 操作码 and each symbolic address by the number from the symbol table.
- Two passes are needed because of forward references 前向引用:
JMP LOOPmay appear before the lineLOOP:has been seen, so its address is not known on the first pass.
El ensamblador de dos pasadas
- Paso 1: lee el código fuente y construye una tabla de símbolos: cada vez que aparece un etiqueta tal como
LOOP:, se registra su dirección. No se produce código. - Paso 2: lee el código fuente nuevamente y genera el código, reemplazando cada mnemotécnico por su código de operación y cada dirección simbólica por el número correspondiente en la tabla de símbolos.
- Se necesitan dos pasadas debido a las referencias hacia adelante:
JMP LOOPpuede aparecer antes de que se haya visto la líneaLOOP:, por lo que su dirección no es conocida en la primera pasada.
What does pass 1 of a two-pass assembler do? · ¿Qué hace la pasada 1 de un ensamblador de dos pasadas?
Pass 1 records where each label is (the symbol table); pass 2 then generates code, using the table to resolve label references. · La pasada 1 registra dónde está cada etiqueta (la tabla de símbolos); luego la pasada 2 genera código, usando la tabla para resolver referencias de etiquetas.
Put the two-pass assembler's work in order. · Ordena el trabajo del ensamblador de dos pasadas.
Pass 1 finds all the labels first, so pass 2 can resolve even a jump to a label defined later. · La pasada 1 encuentra todas las etiquetas primero, para que la pasada 2 pueda resolver incluso un salto a una etiqueta definida más tarde.
Why does the assembler need two passes? · ¿Por qué el ensamblador necesita dos pasadas?
A jump may target a label that appears later in the source; pass 1 finds all labels first so pass 2 can resolve them. · Un salto puede apuntar a una etiqueta que aparece más tarde en el origen; la pasada 1 encuentra todas las etiquetas primero para que la pasada 2 pueda resolverlas.
Worked example: applying the two passes
- The program starts at address 100.
- Pass 1 counts the address of each line and records the labels:
LOOP= 101,COUNT= 105. Nothing else is written. - Pass 2 translates line by line.
LDD COUNTbecomes the opcode forLDDwith operand 操作数 105;JPN LOOPbecomes the opcode forJPNwith operand 101. Without pass 1, the first line could not have been translated.
Ejemplo resuelto: aplicación de las dos pasadas
- El programa comienza en la dirección 100.
100 LDD COUNT
101 LOOP: DEC ACC
102 CMP #0
103 JPN LOOP
104 END
105 COUNT: 5
- Paso 1: cuenta la dirección de cada línea y registra las etiquetas:
LOOP= 101,COUNT= 105. No se escribe nada más. - Paso 2: traduce línea por línea.
LDD COUNTse convierte en el opcode paraLDDcon operando 105;JPN LOOPse convierte en el opcode paraJPNcon operando 101. Sin el paso 1, la primera línea no podría haberse traducido.
How a two-pass assembler works · Cómo funciona un ensamblador de dos pasadas
Step through it. The assembler reads your code twice: pass 1 just finds where every label lives, so pass 2 can fill in the addresses — that is how a jump to a label defined later still works. · Paso a paso. El ensamblador lee tu código dos veces: la pasada 1 solo encuentra dónde vive cada etiqueta, para que la pasada 2 pueda rellenar las direcciones; así es como un salto a una etiqueta definida más tarde todavía funciona.
In the worked example, pass 1 records the label LOOP with the address ____ in the symbol table. · En el ejemplo resuelto, la pasada 1 registra la etiqueta LOOP con la dirección ____ en la tabla de símbolos.
The program starts at 100, so the second line, LOOP: DEC ACC, occupies 101. COUNT, on the sixth line, is 105. · El programa comienza en 100, por lo tanto la segunda línea, LOOP: DEC ACC, ocupa 101. COUNT, en la sexta línea, es 105.
The instruction set
- Cambridge's instruction set 指令集 has one general-purpose register, the accumulator ACC, and an index register IX. An operand
#nis denary,Bnbinary,&nhexadecimal, and<address>a location number or a label. - Data movement:
LDM #n,LDD <address>,LDI <address>,LDX <address>,LDR #n,MOV IX,STO <address>. Input and output:IN,OUT. - Arithmetic:
ADD,SUB,INC,DEC. Compare:CMP,CMI. Jumps:JMPunconditional,JPEandJPNconditional. Bit manipulation:AND,OR,XOR,LSL,LSR. ThenEND. - "Instructions are grouped": name the groups and give one instruction from each.
Conjunto de instrucciones
- El conjunto de instrucciones de Cambridge tiene un registro de propósito general, el acumulador ACC, y un registro de índice IX. Un operando
#nes decimal,Bnbinario,&nhexadecimal, y<address>un número de ubicación o una etiqueta. - Movimiento de datos:
LDM #n,LDD <address>,LDI <address>,LDX <address>,LDR #n,MOV IX,STO <address>. Entrada y salida:IN,OUT. - Aritmética:
ADD,SUB,INC,DEC. Comparar:CMP,CMI. Saltos:JMPincondicional,JPEyJPNcondicional. Manipulación de bits:AND,OR,XOR,LSL,LSR. LuegoEND. - "Las instrucciones están agrupadas": nombre los grupos y dé una instrucción de cada uno.
Which of these are groups in the instruction set? Select all · todos that apply. · ¿Cuáles de estos son grupos en el conjunto de instrucciones? Selecciona todos los que correspondan.
Data movement, input/output, arithmetic, compare, conditional and unconditional jumps, and bit manipulation. A spreadsheet is application software, far above this level. · Movimiento de datos, entrada/salida, aritmética, comparación, saltos condicionales e incondicionales, y manipulación de bits. Una hoja de cálculo es software de aplicación, muy por encima de este nivel.
Worked example: tracing a program
- Draw a table with a column for the ACC and for every memory location the program uses, then update it line by line until
END.
- Pass 1 of the loop: ACC 0 → 5 (TOTAL = 5), COUNT 3 → 2, compare not equal, jump. Pass 2: TOTAL = 10, COUNT = 1, jump. Pass 3: TOTAL = 15, COUNT = 0, compare equal, no jump,
END. - Final values: TOTAL = 15, COUNT = 0, ACC = 0. Write a new row only when a value changes, and never skip the compare.
Ejemplo resuelto: seguimiento de un programa
- Dibuje una tabla con una columna para el ACC y para cada ubicación de memoria que utiliza el programa, luego actualícela línea por línea hasta
END.
100 LDM #0
101 STO TOTAL
102 LDD TOTAL
103 ADD #5
104 STO TOTAL
105 LDD COUNT
106 DEC ACC
107 STO COUNT
108 CMP #0
109 JPN 102
110 END
111 TOTAL: 0
112 COUNT: 3
- Paso 1 del bucle: ACC 0 → 5 (TOTAL = 5), COUNT 3 → 2, comparación no igual, salto. Paso 2: TOTAL = 10, COUNT = 1, salto. Paso 3: TOTAL = 15, COUNT = 0, comparación igual, sin salto,
END. - Valores finales: TOTAL = 15, COUNT = 0, ACC = 0. Escriba una nueva fila solo cuando cambie un valor, y nunca omita la comparación.
In the traced program, what is the value of TOTAL when END is reached? · En el programa rastreado, ¿cuál es el valor de TOTAL cuando se alcanza END?
The loop adds 5 to TOTAL once for each of the three passes: 5, 10, 15. · El bucle suma 5 a TOTAL una vez por cada una de las tres pasadas: 5, 10, 15.
Addressing modes
- The addressing mode 寻址方式 says how the processor finds the operand.
| Mode | Where the operand is | Example |
|---|---|---|
| immediate addressing 立即寻址 | the value is in the instruction itself | LDM #10 loads 10 |
| direct addressing 直接寻址 | the instruction holds an address; use the value stored there | LDD 200 loads the contents of 200 |
| indirect addressing 间接寻址 | the address holds another address, which holds the data | LDI 200 |
| indexed addressing 变址寻址 | effective address = the address given + the index register | LDX 200 with IX |
| relative addressing 相对寻址 | the address is an offset from the current instruction | jumps |
The same operand field, four different meanings
Modos de direccionamiento
- El modo de direccionamiento dice cómo el procesador encuentra el operando.
| Modo | Dónde está el operando | Ejemplo |
|---|---|---|
| direccionamiento inmediato | el valor está en la propia instrucción | LDM #10 carga 10 |
| direccionamiento directo | la instrucción contiene una dirección; use el valor almacenado allí | LDD 200 carga el contenido de 200 |
| direccionamiento indirecto | la dirección contiene otra dirección, que contiene los datos | LDI 200 |
| direccionamiento indexado | dirección efectiva = la dirección dada + el registro de índice | LDX 200 con IX |
| direccionamiento relativo | la dirección es un desplazamiento respecto a la instrucción actual | saltos |

El mismo campo de operando, cuatro significados diferentes
In immediate addressing (e.g. LDM #10), the operand is: · En el direccionamiento inmediato (p. ej., LDM #10), el operando es:
Immediate addressing uses the literal value in the instruction (here, 10). · El direccionamiento inmediato usa el valor literal en la instrucción (aquí, 10).
Match each addressing mode to its meaning. · Asocia cada modo de direccionamiento con su significado.
Immediate = value; direct = address of the value; indirect = address of an address; indexed = base + index. · Inmediato = valor; directo = dirección del valor; indirecto = dirección de una dirección; indexado = base + índice.
Worked example: one operand, four answers
- Memory: location 200 holds 300, location 300 holds 7, location 202 holds 9. The index register IX holds 2.
LDM #200puts 200 in the ACC: immediate, the number itself.LDD 200puts 300 in the ACC: direct, the contents of 200.LDI 200puts 7 in the ACC: indirect, the contents of the address found at 200.LDX 200adds IX to 200 and loads the contents of 202: 9. Same operand written four ways, four different values.
Ejemplo resuelto: un operando, cuatro respuestas
- Memoria: la ubicación 200 contiene 300, la ubicación 300 contiene 7, la ubicación 202 contiene 9. El registro de índice IX contiene 2.
LDM #200coloca 200 en el ACC: inmediato, el número en sí.LDD 200coloca 300 en el ACC: directo, el contenido de 200.LDI 200coloca 7 en el ACC: indirecto, el contenido de la dirección encontrada en 200.LDX 200suma IX a 200 y carga el contenido de 202: 9. Mismo operando escrito de cuatro formas, cuatro valores diferentes.
Why indexed addressing exists
- An array is a run of consecutive locations.
LDX 200with IX = 0, 1, 2, … reads element 0, 1, 2, … without changing the instruction. - The loop pattern:
LDR #0to zero the index,LDX ARRAYto fetch an element, do something,INC IX, compare with the length,JPNback. - Direct addressing would need a separate instruction for every element; indexed addressing needs one.
Por qué existe el direccionamiento indexado
- Un array es una secuencia de ubicaciones consecutivas.
LDX 200con IX = 0, 1, 2, … lee el elemento 0, 1, 2, … sin cambiar la instrucción. - El patrón de bucle:
LDR #0para inicializar el índice a cero,LDX ARRAYpara obtener un elemento, hacer algo,INC IX, comparar con la longitud,JPNde vuelta. - El direccionamiento directo necesitaría una instrucción separada para cada elemento; el direccionamiento indexado necesita solo una.
Indexed addressing is most useful for: · El direccionamiento indexado es más útil para:
The effective address is base address + index register, so increasing the index walks through an array. · La dirección efectiva es dirección base + registro de índice, por lo que aumentar el índice recorre una matriz.
Compare and jump
CMP #norCMP <address>compares the ACC with a value and sets the flag. It does not change the ACC.JPE <address>jumps if the last compare found the values equal;JPN <address>jumps if they were not equal;JMP <address>always jumps.- An
IFin a high-level language becomes aCMPfollowed by a conditional jump; a loop becomes a compare and a jump back to a label.
Comparar y saltar
CMP #noCMP <address>compara el ACC con un valor y establece la bandera. No cambia el ACC.JPE <address>salta si la última comparación encontró que los valores eran iguales;JPN <address>salta si no eran iguales;JMP <address>siempre salta.- Un
IFen un lenguaje de alto nivel se convierte en unCMPseguido de un salto condicional; un bucle se convierte en una comparación y un salto de vuelta a una etiqueta.
CMP #0 changes the value held in the accumulator. · CMP #0 cambia el valor contenido en el acumulador.
A compare only sets the flag that the next conditional jump reads. The ACC is unchanged, which is why the trace shows no new ACC value on a CMP line. · Una comparación solo establece la bandera que leerá el próximo salto condicional. El ACC permanece sin cambios, que es por qué el rastreo muestra ningún nuevo valor de ACC en una línea CMP.
Marks that slip away
LDM #10loads the number 10;LDD 10loads the contents of location 10. The#is the whole difference.#is denary,Bis binary,&is hexadecimal.AND &0FandAND B00001111are the same mask;AND #15is too.CMPleaves the ACC alone; it only sets the flag.JPNjumps when the values are not equal.- Pass 1 of the assembler writes no code. Its output is the symbol table, and forward references are the reason it exists.
Puntos que se pierden fácilmente
LDM #10carga el número 10;LDD 10carga el contenido de la ubicación 10. El#es toda la diferencia.#es decimal,Bes binario,&es hexadecimal.AND &0FyAND B00001111son la misma máscara;AND #15también lo es.CMPdeja el ACC intacto; solo establece la bandera.JPNsalta cuando los valores no son iguales.- El paso 1 del ensamblador no escribe código. Su salida es la tabla de símbolos, y las referencias hacia adelante son la razón de su existencia.
You've got it
- machine code is bit patterns; assembly is mnemonics, one to one, translated by an assembler
- two passes: pass 1 builds the symbol table of label addresses, pass 2 generates code; needed for forward references
- trace with a table of ACC and every location, one row per change; CMP sets the flag, JPE/JPN read it
- addressing: immediate
#nthe value · direct the contents of the address · indirect the address of the address · indexed address + IX (arrays) · relative an offset
Ya lo tienes
- código máquina son patrones de bits; ensamblador son mnemotécnicos, uno a uno, traducidos por un ensamblador
- dos pasadas: paso 1 construye la tabla de símbolos de direcciones de etiquetas, paso 2 genera código; necesario para referencias hacia adelante
- seguir con una tabla de ACC y cada ubicación, una fila por cambio; CMP establece la bandera, JPE/JPN la leen
- direccionamiento: inmediato
#nel valor · directo el contenido de la dirección · indirecto la dirección de la dirección · indexado dirección + IX (arrays) · relativo un desplazamiento