Assembly language and addressing modes · Linguagem Assembly e modos de endereçamento
| English | Português |
|---|---|
| assembler/əˈsemblə/ | montador |
| mnemonic/nɪˈmɒnɪk/ | mnemônico |
| instruction set/ɪnˈstrʌkʃn set/ | conjunto de instruções |
| machine code/məˈʃiːn kəʊd/ | código de máquina |
| assembly language/əˈsemblɪ ˈlæŋɡwɪdʒ/ | linguagem assembleira |
| operand/ˈɒpərænd/ | operando |
| opcode/ˈɒpkəʊd/ | opcode |
| symbol table/ˈsɪmbl ˈteɪbl/ | tabela de símbolos |
| label/ˈleɪbl/ | rótulo |
| forward references/ˈfɔːwəd ˈrefrənsɪz/ | referências futuras |
| addressing mode/əˈdresɪŋ məʊd/ | modo de endereçamento |
| immediate addressing/ɪˈmiːdɪət əˈdresɪŋ/ | endereçamento imediato |
| direct addressing/daɪˈrekt əˈdresɪŋ/ | endereçamento direto |
| indirect addressing/ɪndaɪˈrekt əˈdresɪŋ/ | endereçamento indireto |
| indexed addressing/ˈɪndekst əˈdresɪŋ/ | endereçamento indexado |
| relative addressing/ˈrelətɪv əˈdresɪŋ/ | endereçamento 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.
Trinta e uma instruções em uma fileira de chaves
- Em 1949, o computador EDSAC em Cambridge inicializou-se a partir de 31 instruções definidas em chaves, escritas por David Wheeler e chamadas de "ordens iniciais".
- Sua função inteira era ler letras como A e S de fita de papel e transformá-las nos números que a máquina realmente entendia: o primeiro ensambledor 汇编器.
- Desde então, programadores usam mnemônicos em vez de padrões de bits, e o próprio conjunto de instruções do exame é um descendente direto.
- Esta lição trata dessa tradução, rastreamento manual de um programa e as cinco formas pelas quais uma instrução pode indicar onde estão seus dados.
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 de máquina e linguagem assembleira
- O processador executa código de máquina 机器码: padrões de bits, específicos para uma arquitetura, cada um sendo um código de operação e um operando.
- Linguagem assembly 汇编语言 é a forma legível. Cada instrução é escrita com um mnemônico 助记符 como
LDD,ADDouJMP, e cada instrução assembly torna-se exatamente uma instrução de código de máquina. - O ensambledor traduz. A relação é um para um, o que diferencia a assembleira de uma linguagem de alto nível, onde uma declaração torna-se várias instruções.

Cada mnemônico torna-se um opcode; cada endereço simbólico torna-se um número
Assembly language is: · A linguagem Assembly é:
Assembly uses mnemonics and maps one-to-one to machine code; an assembler translates it. · Assembly usa mnemônicos e mapeia um-para-um com o código de máquina; um ensamblificador o traduz.
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.
O ensambledor de duas passagens
- Passagem 1 lê a fonte e constrói uma tabela de símbolos 符号表: toda vez que um rótulo 标签 como
LOOP:aparece, seu endereço é registrado. Nenhum código é produzido. - Passagem 2 lê a fonte novamente e gera o código, substituindo cada mnemônico por seu opcode 操作码 e cada endereço simbólico pelo número da tabela de símbolos.
- Duas passagens são necessárias devido às referências futuras 前向引用:
JMP LOOPpode aparecer antes que a linhaLOOP:tenha sido vista, então seu endereço não é conhecido na primeira passagem.
What does pass 1 of a two-pass assembler do? · O que a passada 1 de um ensamblificador de duas passadas faz?
Pass 1 records where each label is (the symbol table); pass 2 then generates code, using the table to resolve label references. · A passada 1 registra onde cada label está (a tabela de símbolos); a passada 2 então gera código, usando a tabela para resolver referências a labels.
Put the two-pass assembler's work in order. · Coloque o trabalho do ensamblificador de duas passadas em ordem.
Pass 1 finds all the labels first, so pass 2 can resolve even a jump to a label defined later. · A passada 1 encontra todas as labels primeiro, para que a passada 2 possa resolver até mesmo um jump para uma label definida depois.
Why does the assembler need two passes? · Por que o ensamblificador precisa de duas passadas?
A jump may target a label that appears later in the source; pass 1 finds all labels first so pass 2 can resolve them. · Um jump pode apontar para uma label que aparece depois na fonte; a passada 1 encontra todas as labels primeiro para que a passada 2 possa resolvê-las.
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.
Exemplo resolvido: aplicando as duas passagens
- O programa começa no endereço 100.
100 LDD COUNT
101 LOOP: DEC ACC
102 CMP #0
103 JPN LOOP
104 END
105 COUNT: 5
- Passagem 1 conta o endereço de cada linha e registra os rótulos:
LOOP= 101,COUNT= 105. Nada mais é escrito. - Passagem 2 traduz linha por linha.
LDD COUNTtorna-se o opcode paraLDDcom operando 操作数 105;JPN LOOPtorna-se o opcode paraJPNcom operando 101. Sem a passagem 1, a primeira linha não poderia ter sido traduzida.
How a two-pass assembler works · Como funciona um ensamblificador de duas passadas
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. · Passe passo a passo. O ensamblificador lê seu código duas vezes: a passada 1 apenas encontra onde cada label está, para que a passada 2 possa preencher os endereços — é assim que um jump para uma label definida depois ainda funciona.
In the worked example, pass 1 records the label LOOP with the address ____ in the symbol table. · No exemplo resolvido, a passada 1 registra a label LOOP com o endereço ____ na tabela de símbolos.
The program starts at 100, so the second line, LOOP: DEC ACC, occupies 101. COUNT, on the sixth line, is 105. · O programa começa em 100, então a segunda linha, LOOP: DEC ACC, ocupa 101. COUNT, na sexta linha, é 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.
O conjunto de instruções
- O conjunto de instruções 指令集 de Cambridge tem um registrador de propósito geral, o acumulador ACC, e um registrador de índice IX. Um operando
#né decimal,Bnbinário,&nhexadecimal, e<address>um número de localização ou um rótulo. - Movimento de dados:
LDM #n,LDD <address>,LDI <address>,LDX <address>,LDR #n,MOV IX,STO <address>. Entrada e saída:IN,OUT. - Aritmética:
ADD,SUB,INC,DEC. Comparar:CMP,CMI. Saltos:JMPincondicional,JPEeJPNcondicional. Manipulação de bits:AND,OR,XOR,LSL,LSR. DepoisEND. - "As instruções são agrupadas": nomeie os grupos e dê uma instrução de cada um.
Which of these are groups in the instruction set? Select all · todos that apply. · Quais destes são grupos no conjunto de instruções? Selecione todos os que se aplicam.
Data movement, input/output, arithmetic, compare, conditional and unconditional jumps, and bit manipulation. A spreadsheet is application software, far above this level. · Movimentação de dados, entrada/saída, aritmética, comparação, jumps condicionais e incondicionais, e manipulação de bits. Uma planilha é software de aplicação, muito acima desse nível.
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.
Exemplo resolvido: rastreando um programa
- Desenhe uma tabela com uma coluna para o ACC e para cada local de memória usado pelo programa, depois atualize linha por linha até
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
- Passagem 1 do loop: ACC 0 → 5 (TOTAL = 5), COUNT 3 → 2, comparação diferente, salto. Passagem 2: TOTAL = 10, COUNT = 1, salto. Passagem 3: TOTAL = 15, COUNT = 0, comparação igual, sem salto,
END. - Valores finais: TOTAL = 15, COUNT = 0, ACC = 0. Escreva uma nova linha apenas quando um valor mudar, e nunca pule a comparação.
In the traced program, what is the value of TOTAL when END is reached? · No programa rastreado, qual é o valor de TOTAL quando END é alcançado?
The loop adds 5 to TOTAL once for each of the three passes: 5, 10, 15. · O loop adiciona 5 ao TOTAL uma vez para cada uma das três passagens: 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 endereçamento
- O modo de endereçamento 寻址方式 diz como o processador encontra o operando.
| Modo | Onde o operando está | Exemplo |
|---|---|---|
| endereçamento imediato 立即寻址 | o valor está na própria instrução | LDM #10 carrega 10 |
| endereçamento direto 直接寻址 | a instrução contém um endereço; use o valor armazenado lá | LDD 200 carrega o conteúdo de 200 |
| endereçamento indireto 间接寻址 | o endereço contém outro endereço, que contém os dados | LDI 200 |
| endereçamento indexado 变址寻址 | endereço efetivo = o endereço dado + o registrador de índice | LDX 200 com IX |
| endereçoamento relativo 相对寻址 | o endereço é um deslocamento em relação à instrução atual | saltos |

*O mesmo campo de operando, quatro significados diferentes
In immediate addressing (e.g. LDM #10), the operand is: · No endereçamento imediato (ex. LDM #10), o operando é:
Immediate addressing uses the literal value in the instruction (here, 10). · O endereçamento imediato usa o valor literal na instrução (aqui, 10).
Match each addressing mode to its meaning. · Combine cada modo de endereçamento com seu significado.
Immediate = value; direct = address of the value; indirect = address of an address; indexed = base + index. · Imediato = valor; direto = endereço do valor; indireto = endereço de um endereço; 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.
Exemplo resolvido: um operando, quatro respostas
- Memória: local 200 contém 300, local 300 contém 7, local 202 contém 9. O registrador de índice IX contém 2.
LDM #200coloca 200 no ACC: imediato, o próprio número.LDD 200coloca 300 no ACC: direto, o conteúdo de 200.LDI 200coloca 7 no ACC: indireto, o conteúdo do endereço encontrado em 200.LDX 200soma IX a 200 e carrega o conteúdo de 202: 9. Mesmo operando escrito de quatro maneiras, quatro 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 que existe o endereçamento indexado
- Uma matriz é uma sequência de locais consecutivos.
LDX 200com IX = 0, 1, 2, … lê o elemento 0, 1, 2, … sem alterar a instrução. - O padrão de loop:
LDR #0para zerar o índice,LDX ARRAYpara buscar um elemento, fazer algo,INC IX, comparar com o comprimento,JPNvoltar. - O endereçamento direto precisaria de uma instrução separada para cada elemento; o endereçamento indexado precisa de uma.
Indexed addressing is most useful for: · O endereçamento indexado é mais útil para:
The effective address is base address + index register, so increasing the index walks through an array. · O endereço efetivo é endereço base + registrador índice, então aumentar o índice percorre uma 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 e saltar
CMP #nouCMP <address>compara o ACC com um valor e define a flag. Não altera o ACC.JPE <address>salta se a última comparação encontrou os valores iguais;JPN <address>salta se não eram iguais;JMP <address>sempre salta.- Um
IFem uma linguagem de alto nível torna-se umCMPseguido por um salto condicional; um loop torna-se uma comparação e um salto de volta para um rótulo.
CMP #0 changes the value held in the accumulator. · CMP #0 muda o valor mantido no 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. · Uma comparação apenas define a flag que o próximo jump condicional lê. O ACC permanece inalterado, que é por que o rastro mostra nenhum novo valor de ACC em uma linha 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.
Marcas que escapam
LDM #10carrega o número 10;LDD 10carrega o conteúdo do local 10. O#é a diferença inteira.#é decimal,Bé binário,&é hexadecimal.AND &0FeAND B00001111são a mesma máscara;AND #15também.CMPnão altera o ACC; apenas define a flag.JPNsalta quando os valores são diferentes.- A Passada 1 do assembler não gera código. Sua saída é a tabela de símbolos, e as referências futuras são a razão para sua existência.
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
Entendeu?
- código de máquina são padrões de bits; assembly são mnemônicos, um para um, traduzidos por um assembler
- duas passadas: passada 1 constrói a tabela de símbolos de endereços de rótulos, passada 2 gera o código; necessário para referências futuras
- trace com uma tabela do ACC e de cada local, uma linha por mudança; CMP define a flag, JPE/JPN leem-na
- endereçamento: imediato
#no valor · direto o conteúdo do endereço · indireto o endereço do endereço · indexado endereço + IX (arrays) · relativo um offset