Assembly language and addressing modes · Langage assembleur et modes d'adressage
| English | Français |
|---|---|
| assembler/əˈsemblə/ | assembleur |
| mnemonic/nɪˈmɒnɪk/ | mnémonique |
| instruction set/ɪnˈstrʌkʃn set/ | ensemble d'instructions |
| machine code/məˈʃiːn kəʊd/ | code machine |
| assembly language/əˈsemblɪ ˈlæŋɡwɪdʒ/ | langage assembleur |
| operand/ˈɒpərænd/ | opérande |
| opcode/ˈɒpkəʊd/ | opcode |
| symbol table/ˈsɪmbl ˈteɪbl/ | table des symboles |
| label/ˈleɪbl/ | étiquette |
| forward references/ˈfɔːwəd ˈrefrənsɪz/ | références vers l'avant |
| addressing mode/əˈdresɪŋ məʊd/ | mode d'adressage |
| immediate addressing/ɪˈmiːdɪət əˈdresɪŋ/ | adressage immédiat |
| direct addressing/daɪˈrekt əˈdresɪŋ/ | adressage direct |
| indirect addressing/ɪndaɪˈrekt əˈdresɪŋ/ | adressage indirect |
| indexed addressing/ˈɪndekst əˈdresɪŋ/ | adressage indexé |
| relative addressing/ˈrelətɪv əˈdresɪŋ/ | adressage relatif |
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.
Trente-et-une instructions sur une rangée de commutateurs
- En 1949, l'ordinateur EDSAC de Cambridge démarrait avec 31 instructions paramétrées sur des commutateurs, écrites par David Wheeler et appelées les "initial orders".
- Leur seule tâche consistait à lire des lettres comme A et S depuis une bande perforée et à les convertir en nombres que la machine comprenait réellement : le premier assembleur 汇编器.
- Les programmeurs écrivent des mnémoniques au lieu de motifs de bits depuis lors, et l'ensemble d'instructions de l'examen est un descendant direct.
- Cette leçon porte sur cette traduction, tracer un programme à la main, et les cinq façons dont une instruction peut indiquer où se trouve ses données.
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
Code machine et langage assembleur
- Le processeur exécute le code machine 机器码 : motifs de bits, spécifiques à une architecture, chacun étant un opcode et un opérande.
- Le langage assembleur 汇编语言 est la forme lisible. Chaque instruction est écrite avec un mnemonic 助记符 tel que
LDD,ADDouJMP, et chaque instruction assembleur devient exactement une instruction de code machine. - L'assembleur le traduit. La relation est un pour un, ce qui rend l'assembleur différent d'un langage de haut niveau, où une instruction devient plusieurs instructions.

Chaque mnemonic devient un opcode ; chaque adresse symbolique devient un nombre
Assembly language is: · Le langage assembleur est :
Assembly uses mnemonics and maps one-to-one to machine code; an assembler translates it. · Le langage assembleur utilise des mnemoniques et se mappent un-à-un au code machine ; un assembleur le traduit.
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.
L'assembleur à deux passages
- Passage 1 lit la source et construit une table des symboles 符号表 : chaque fois qu'une étiquette 标签 telle que
LOOP:apparaît, son adresse est enregistrée. Aucun code n'est produit. - Passage 2 relit la source et génère le code, remplaçant chaque mnemonic par son opcode 操作码 et chaque adresse symbolique par le nombre de la table des symboles.
- Deux passages sont nécessaires en raison des références futures 前向引用 :
JMP LOOPpeut apparaître avant que la ligneLOOP:n'ait été vue, donc son adresse n'est pas connue lors du premier passage.
What does pass 1 of a two-pass assembler do? · Que fait le passage 1 d'un assembleur à deux passages ?
Pass 1 records where each label is (the symbol table); pass 2 then generates code, using the table to resolve label references. · Le passage 1 enregistre l'emplacement de chaque étiquette (la table de symboles) ; le passage 2 génère ensuite le code, en utilisant la table pour résoudre les références aux étiquettes.
Put the two-pass assembler's work in order. · Mettez le travail de l'assembleur à deux passages dans l'ordre.
Pass 1 finds all the labels first, so pass 2 can resolve even a jump to a label defined later. · Le passage 1 trouve toutes les étiquettes d'abord, afin que le passage 2 puisse résoudre même un saut vers une étiquette définie plus tard.
Why does the assembler need two passes? · Pourquoi l'assembleur a-t-il besoin de deux passages ?
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 saut peut cibler une étiquette qui apparaît plus tard dans la source ; le passage 1 trouve toutes les étiquettes d'abord afin que le passage 2 puisse les résoudre.
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.
Exemple résolu : application des deux passages
- Le programme commence à l'adresse 100.
100 LDD COUNT
101 LOOP: DEC ACC
102 CMP #0
103 JPN LOOP
104 END
105 COUNT: 5
- Passage 1 compte l'adresse de chaque ligne et enregistre les étiquettes :
LOOP= 101,COUNT= 105. Rien d'autre n'est écrit. - Passage 2 traduit ligne par ligne.
LDD COUNTdevient l'opcode pourLDDavec opérande 操作数 105 ;JPN LOOPdevient l'opcode pourJPNavec opérande 101. Sans passage 1, la première ligne n'aurait pas pu être traduite.
How a two-pass assembler works · Comment fonctionne un assembleur à deux passages
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. · Parcourez-le. L'assembleur lit votre code deux fois : le passage 1 trouve simplement l'emplacement de chaque étiquette, afin que le passage 2 puisse remplir les adresses — c'est ainsi qu'un saut vers une étiquette définie plus tard fonctionne encore.
In the worked example, pass 1 records the label LOOP with the address ____ in the symbol table. · Dans l'exemple résolu, le passage 1 enregistre l'étiquette LOOP avec l'adresse ____ dans la table de symboles.
The program starts at 100, so the second line, LOOP: DEC ACC, occupies 101. COUNT, on the sixth line, is 105. · Le programme commence à 100, donc la deuxième ligne, LOOP: DEC ACC, occupe 101. COUNT, sur la sixième ligne, est 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.
L'ensemble d'instructions
- L'ensemble d'instructions 指令集 de Cambridge possède un registre universel, l'accumulateur ACC, et un registre d'index IX. Un opérande
#nest décimal,Bnbinaire,&nhexadécimal, et<address>un numéro d'emplacement ou une étiquette. - Mouvement de données :
LDM #n,LDD <address>,LDI <address>,LDX <address>,LDR #n,MOV IX,STO <address>. Entrée et sortie :IN,OUT. - Arithmétique :
ADD,SUB,INC,DEC. Comparaison :CMP,CMI. Sauts :JMPinconditionnel,JPEetJPNconditionnel. Manipulation de bits :AND,OR,XOR,LSL,LSR. PuisEND. - "Les instructions sont groupées" : nommer les groupes et donner une instruction de chacun.
Which of these are groups in the instruction set? Select all · tout that apply. · Lequel de ces éléments sont des groupes dans l'ensemble d'instructions ? Sélectionnez tous ceux qui s'appliquent.
Data movement, input/output, arithmetic, compare, conditional and unconditional jumps, and bit manipulation. A spreadsheet is application software, far above this level. · Mouvement de données, E/S, arithmétique, comparaison, sauts conditionnels et inconditionnels, et manipulation de bits. Un tableur est un logiciel d'application, bien au-dessus de ce niveau.
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.
Exemple résolu : tracer un programme
- Dessiner un tableau avec une colonne pour l'ACC et pour chaque emplacement mémoire utilisé par le programme, puis le mettre à jour ligne par ligne jusqu'à
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
- Passage 1 de la boucle : ACC 0 → 5 (TOTAL = 5), COUNT 3 → 2, comparatif non égal, saut. Passage 2 : TOTAL = 10, COUNT = 1, saut. Passage 3 : TOTAL = 15, COUNT = 0, comparatif égal, pas de saut,
END. - Valeurs finales : TOTAL = 15, COUNT = 0, ACC = 0. Écrire une nouvelle ligne uniquement quand une valeur change, et ne jamais sauter la comparaison.
In the traced program, what is the value of TOTAL when END is reached? · Dans le programme tracé, quelle est la valeur de TOTAL lorsque END est atteint ?
The loop adds 5 to TOTAL once for each of the three passes: 5, 10, 15. · La boucle ajoute 5 à TOTAL une fois pour chacun des trois passages : 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
Modes d'adressage
- Le mode d'adressage 寻址方式 dit comment le processeur trouve l'opérande.
| Mode | Où se trouve l'opérande | Exemple |
|---|---|---|
| adressage immédiat 立即寻址 | la valeur est dans l'instruction elle-même | LDM #10 charge 10 |
| adressage direct 直接寻址 | l'instruction contient une adresse ; utiliser la valeur stockée là | LDD 200 charge le contenu de 200 |
| adressage indirect 间接寻址 | l'adresse contient une autre adresse, qui contient les données | LDI 200 |
| adressage indexé 变址寻址 | adresse effective = l'adresse donnée + le registre d'index | LDX 200 avec IX |
| adressage relatif 相对寻址 | l'adresse est un décalage par rapport à l'instruction actuelle | sauts |

*Le même champ opérande, quatre significations différentes
In immediate addressing (e.g. LDM #10), the operand is: · En adressage immédiat (par ex. LDM #10), l'oprande est :
Immediate addressing uses the literal value in the instruction (here, 10). · L'adressage immédiat utilise la valeur littérale dans l'instruction (ici, 10).
Match each addressing mode to its meaning. · Associez chaque mode d'adressage à sa signification.
Immediate = value; direct = address of the value; indirect = address of an address; indexed = base + index. · Immédiat = valeur ; direct = adresse de la valeur ; indirect = adresse d'une adresse ; indexé = base + index.
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.
Exemple résolu : un opérande, quatre réponses
- Mémoire : l'emplacement 200 contient 300, l'emplacement 300 contient 7, l'emplacement 202 contient 9. Le registre d'index IX contient 2.
LDM #200met 200 dans l'ACC : immédiat, le nombre lui-même.LDD 200met 300 dans l'ACC : direct, le contenu de 200.LDI 200met 7 dans l'ACC : indirect, le contenu de l'adresse trouvée à 200.LDX 200ajoute IX à 200 et charge le contenu de 202 : 9. Même opérande écrit quatre façons, quatre valeurs différentes.
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.
Pourquoi l'adressage indexé existe
- Un tableau est une série d'emplacements consécutifs.
LDX 200avec IX = 0, 1, 2, … lit l'élément 0, 1, 2, … sans changer l'instruction. - Le modèle de boucle :
LDR #0pour mettre l'index à zéro,LDX ARRAYpour récupérer un élément, faire quelque chose,INC IX, comparer avec la longueur,JPNrevenir en arrière. - L'adressage direct nécessiterait une instruction séparée pour chaque élément ; l'adressage indexé n'en nécessite qu'une.
Indexed addressing is most useful for: · L'adressage indexé est le plus utile pour :
The effective address is base address + index register, so increasing the index walks through an array. · L'adresse effective est adresse de base + registre d'index, donc augmenter l'index parcourt un tableau.
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.
Comparer et sauter
CMP #nouCMP <address>compare l'ACC avec une valeur et définit le drapeau. Il ne modifie pas l'ACC.JPE <address>saute si la dernière comparaison a trouvé les valeurs égales ;JPN <address>saute si elles étaient inégales ;JMP <address>saute toujours.- Un
IFdans un langage de haut niveau devient unCMPsuivi d'un saut conditionnel ; une boucle devient une comparaison et un saut vers une étiquette.
CMP #0 changes the value held in the accumulator. · CMP #0 modifie la valeur stockée dans l'accumulateur.
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. · Une comparaison ne définit que l'indicateur que le prochain saut conditionnel lira. Le ACC reste inchangé, c'est pourquoi le trace ne montre aucune nouvelle valeur ACC sur une ligne 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.
Pièges qui font perdre des points
LDM #10charge le nombre 10 ;LDD 10charge le contenu de l'emplacement 10. Le#est toute la différence.#est décimal,Best binaire,&est hexadécimal.AND &0FetAND B00001111sont le même masque ;AND #15aussi.CMPne laisse pas l'ACC inchangé ; il définit seulement le drapeau.JPNsaute lorsque les valeurs ne sont pas égales.- Le passage 1 de l'assembleur n'écrit aucun code. Sa sortie est la table des symboles, et les références avant sont la raison de son existence.
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
Vous avez compris
- Le code machine est un motif de bits ; l'assemblage utilise des mnémoniques, correspondance un pour un, traduites par un assembleur
- Deux passages : le passage 1 construit la table des symboles des adresses des étiquettes, le passage 2 génère le code ; nécessaire pour les références vers l'avant
- Trace avec une table de l'ACC et de chaque emplacement, une ligne par changement ; CMP définit le drapeau, JPE/JPN le lisent
- adressage : immédiat
#nla valeur · direct le contenu de l'adresse · indirect l'adresse de l'adresse · indexé adresse + IX (tableaux) · relatif un décalage