Ngôn ngữ assembly và các chế độ địa chỉ
Đã giới thiệu| English | Ý nghĩa |
|---|---|
| assembler/əˈsemblə/ | Trình biên dịch assembly |
| mnemonic/nɪˈmɒnɪk/ | mã ghi nhớ |
| instruction set/ɪnˈstrʌkʃn set/ | danh sách lệnh |
| machine code/məˈʃiːn kəʊd/ | mã máy |
| assembly language/əˈsemblɪ ˈlæŋɡwɪdʒ/ | ngôn ngữIOException |
| operand/ˈɒpərænd/ | tham số toán học |
| opcode/ˈɒpkəʊd/ | lệnh toán học |
| symbol table/ˈsɪmbl ˈteɪbl/ | bảng ký hiệu |
| label/ˈleɪbl/ | nhãn |
| forward references/ˈfɔːwəd ˈrefrənsɪz/ | tham chiếu về phía trước |
| addressing mode/əˈdresɪŋ məʊd/ | chế độ định địa chỉ |
| immediate addressing/ɪˈmiːdɪət əˈdresɪŋ/ | định địa chỉ ngay lập tức |
| direct addressing/daɪˈrekt əˈdresɪŋ/ | định địa chỉ trực tiếp |
| indirect addressing/ɪndaɪˈrekt əˈdresɪŋ/ | định địa chỉ gián tiếp |
| indexed addressing/ˈɪndekst əˈdresɪŋ/ | định địa chỉ theo chỉ mục |
| relative addressing/ˈrelətɪv əˈdresɪŋ/ | định địa chỉ tương đối |
Ba mươi mốt lệnh trên hàng công tắc
- Năm 1949, máy tính EDSAC tại Cambridge khởi động từ 31 lệnh được thiết lập bằng công tắc, do David Wheeler viết và gọi là "lệnh ban đầu".
- Công việc của họ là đọc các ký tự như A và S từ băng giấy và chuyển đổi chúng thành các con số mà máy thực sự hiểu: trình biên dịch assembler đầu tiên.
- Từ đó, các lập trình viên đã viết các ký hiệu thay vì các mẫu bit, và tập lệnh của bài thi cũng là hậu duệ trực tiếp của nó.
- Bài học này nói về quá trình dịch chuyển đó, theo dõi chương trình bằng tay, và năm cách mà một lệnh có thể chỉ ra nơi chứa dữ liệu của nó.
Mã máy và ngôn ngữIOException
- Bộ xử lý chạy mã máy: các mẫu bit, đặc thù cho một kiến trúc cụ thể, mỗi mẫu là một mã lệnh và một toán hạng.
- Ngôn ngữ Assembly là dạng dễ đọc. Mỗi lệnh được viết bằng một ký hiệu như
LDD,ADDhoặcJMP, và mỗi lệnh assembly trở thành đúng một lệnh mã máy. - Trình biên dịch assembler dịch chuyển nó. Mối quan hệ là một đối một, đây chính là điểm khác biệt giữa assembly và ngôn ngữ cấp cao, nơi một câu lệnh trở thành nhiều lệnh.

Mỗi ký hiệu trở thành một mã lệnh; mỗi địa chỉ biểu tượng trở thành một con số
Ngôn ngữ assembly là:
Difficulty 1/5 · 100 coins + a small bonus on first completion today
Ngôn ngữ assembly sử dụng các ký hiệu viết tắt và ánh xạ một-một sang mã máy; trình biên dịch assembly sẽ chuyển đổi nó.
Trình biên dịch assembler hai lượt
- Lượt 1 đọc nguồn và xây dựng bảng ký hiệu: mỗi lần xuất hiện một dấu label như
LOOP:, địa chỉ của nó được ghi lại. Không có mã nào được tạo ra. - Lượt 2 đọc nguồn một lần nữa và sinh mã, thay thế mỗi ký hiệu bằng mã lệnh của nó và mỗi địa chỉ biểu tượng bằng con số từ bảng ký hiệu.
- Cần hai lượt vì tham chiếu tiến tới:
JMP LOOPcó thể xuất hiện trước khi dòngLOOP:đã được xem xét, nên địa chỉ của nó chưa được biết trong lượt đầu tiên.
Lượt 1 của trình biên dịch assembly hai lượt làm gì?
Difficulty 1/5 · 100 coins + a small bonus on first completion today
Lượt 1 ghi nhận vị trí của mỗi nhãn (bảng ký hiệu); sau đó lượt 2 tạo mã, sử dụng bảng này để giải quyết các tham chiếu đến nhãn.
Sắp xếp công việc của trình biên dịch assembly hai lượt theo thứ tự.
Difficulty 3/5 · 200 coins + a small bonus on first completion today
Lượt 1 tìm thấy tất cả các nhãn trước, để lượt 2 có thể giải quyết ngay cả phép nhảy đến một nhãn được định nghĩa sau đó.
Tại sao trình biên dịch assembly cần hai lượt?
Difficulty 1/5 · 100 coins + a small bonus on first completion today
Phép nhảy có thể trỏ đến một nhãn xuất hiện sau trong nguồn; lượt 1 tìm thấy tất cả các nhãn trước để lượt 2 có thể giải quyết chúng.
Ví dụ minh họa: áp dụng hai lượt
- Chương trình bắt đầu ở địa chỉ 100.
100 LDD COUNT
101 LOOP: DEC ACC
102 CMP #0
103 JPN LOOP
104 END
105 COUNT: 5
- Lượt 1 đếm địa chỉ của từng dòng và ghi nhận các label:
LOOP= 101,COUNT= 105. Không có gì khác được viết ra. - Lượt 2 dịch chuyển từng dòng.
LDD COUNTtrở thành mã lệnh choLDDvới toán hạng 105;JPN LOOPtrở thành mã lệnh choJPNvới toán hạng 101. Nếu không có lượt 1, dòng đầu tiên sẽ không thể được dịch chuyển.
Cách hoạt động của trình biên dịch assembly hai lượt
Hãy xem xét từng bước. Trình biên dịch đọc mã nguồn của bạn hai lần: lượt 1 chỉ xác định vị trí của mọi nhãn, để lượt 2 có thể điền đầy đủ các địa chỉ — đó là cách một lệnh nhảy đến một nhãn được định nghĩa sau vẫn hoạt động.
Trong ví dụ minh họa, lượt 1 ghi nhận nhãn LOOP với địa chỉ ____ trong bảng ký hiệu.
Difficulty 1/5 · 100 coins + a small bonus on first completion today
Chương trình bắt đầu tại 100, do đó dòng thứ hai, LOOP: DEC ACC, chiếm 101. COUNT, ở dòng thứ sáu, là 105.
Tập lệnh
- Tập lệnh của Cambridge có một thanh ghi mục đích chung, thanh ghi tích lũy ACC, và một thanh ghi chỉ mục IX. Toán hạng
#nlà thập phân,Bnnhị phân,&nthập lục phân, và<address>là số vị trí hoặc một label. - Di chuyển dữ liệu:
LDM #n,LDD <address>,LDI <address>,LDX <address>,LDR #n,MOV IX,STO <address>. Nhập và xuất:IN,OUT. - Cộng trừ:
ADD,SUB,INC,DEC. So sánh:CMP,CMI. Nhảy:JMPkhông điều kiện,JPEvàJPNcó điều kiện. Xử lý bit:AND,OR,XOR,LSL,LSR. Sau đó làEND. - "Các lệnh được nhóm lại": hãy nêu tên các nhóm và đưa ra một ví dụ về lệnh trong mỗi nhóm.
Trong số những lựa chọn sau, cái nào thuộc về tập lệnh? Chọn tất cả các phương án đúng.
Difficulty 2/5 · 140 coins + a small bonus on first completion today
Di chuyển dữ liệu, nhập/xuất, số học, so sánh, nhảy có điều kiện và không có điều kiện, cũng như thao tác bit. Một bảng tính là phần mềm ứng dụng, nằm cao hơn mức độ này rất nhiều.
Ví dụ minh họa: theo dõi chương trình
- Vẽ bảng có cột cho ACC và cho mọi vị trí bộ nhớ mà chương trình sử dụng, sau đó cập nhật nó từng dòng cho đến khi
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
- Lượt 1 của vòng lặp: ACC 0 → 5 (TOTAL = 5), COUNT 3 → 2, so sánh không bằng, nhảy. Lượt 2: TOTAL = 10, COUNT = 1, nhảy. Lượt 3: TOTAL = 15, COUNT = 0, so sánh bằng, không nhảy,
END. - Giá trị cuối cùng: TOTAL = 15, COUNT = 0, ACC = 0. Chỉ viết một dòng mới khi giá trị thay đổi, và tuyệt đối không bỏ qua bước so sánh.
Trong chương trình đã được theo dõi, giá trị của TOTAL khi đạt đến END là gì?
Difficulty 2/5 · 140 coins + a small bonus on first completion today
Vòng lặp thêm 5 vào TOTAL một lần cho mỗi lần lặp trong ba vòng: 5, 10, 15.
Chế độ trỏ địa chỉ
- Chế độ trỏ địa chỉ cho biết bộ xử lý tìm toán hạng như thế nào.
| Chế độ | Nơi chứa toán hạng | Ví dụ |
|---|---|---|
| trỏ ngay lập tức | giá trị nằm trong chính lệnh đó | LDM #10 tải 10 |
| trỏ trực tiếp | lệnh chứa một địa chỉ; sử dụng giá trị được lưu tại đó | LDD 200 tải nội dung của 200 |
| trỏ gián tiếp | địa chỉ chứa một địa chỉ khác, chứa dữ liệu | LDI 200 |
| trỏ chỉ mục | địa chỉ hiệu dụng = địa chỉ được cung cấp + thanh ghi chỉ mục | LDX 200 với IX |
| trỏ tương đối | địa chỉ là độ lệch so với lệnh hiện tại | 跳跃 |

Cùng một trường toán hạng, bốn ý nghĩa khác nhau
Trong định址 ngay (ví dụ: LDM #10), toán hạng là:
Difficulty 1/5 · 100 coins + a small bonus on first completion today
Định址 ngay sử dụng giá trị nguyên văn có trong câu lệnh (ở đây là 10).
Gắn mỗi chế độ định址 với ý nghĩa của nó.
Difficulty 2/5 · 140 coins + a small bonus on first completion today
Ngay lập tức = giá trị; trực tiếp = địa chỉ của giá trị; gián tiếp = địa chỉ của một địa chỉ; theo chỉ mục = cơ sở + chỉ mục.
Ví dụ minh họa: một toán hạng, bốn đáp án
- Bộ nhớ: vị trí 200 chứa 300, vị trí 300 chứa 7, vị trí 202 chứa 9. Thanh ghi chỉ mục IX chứa 2.
LDM #200đưa 200 vào ACC: ngay lập tức, chính con số đó.LDD 200đưa 300 vào ACC: trực tiếp, nội dung của 200.LDI 200đưa 7 vào ACC: gián tiếp, nội dung của địa chỉ được tìm thấy tại 200.LDX 200cộng IX với 200 và tải nội dung của 202: 9. Cùng một toán hạng được viết bốn cách, bốn giá trị khác nhau.
Tại sao chế độ trỏ chỉ mục tồn tại
- Một mảng là chuỗi các vị trí liên tiếp.
LDX 200với IX = 0, 1, 2, … đọc phần tử 0, 1, 2, … mà không cần thay đổi lệnh. - Mô hình vòng lặp:
LDR #0để đặt chỉ số về không,LDX ARRAYđể lấy một phần tử, thực hiện hành động,INC IX, so sánh với độ dài,JPNquay lại. - Địa chỉ trực tiếp sẽ cần một lệnh riêng cho mỗi phần tử; địa chỉ theo chỉ số chỉ cần một lệnh duy nhất.
Chỉ định theo chỉ mục hữu ích nhất cho việc:
Difficulty 1/5 · 100 coins + a small bonus on first completion today
Địa chỉ hiệu dụng là địa chỉ cơ sở + thanh ghi chỉ mục, do đó tăng chỉ mục sẽ duyệt qua mảng.
So sánh và nhảy
CMP #nhoặcCMP <address>so sánh ACC với một giá trị và đặt cờ. Nó không thay đổi nội dung của ACC.JPE <address>nhảy nếu phép so sánh cuối cùng thấy các giá trị bằng nhau;JPN <address>nhảy nếu chúng không bằng nhau;JMP <address>luôn nhảy.- Một lệnh
IFtrong ngôn ngữ cấp cao trở thành một lệnhCMPkèm theo lệnh nhảy có điều kiện; một vòng lặp trở thành một phép so sánh và một lệnh quay lại nhãn.
CMP #0 thay đổi giá trị được lưu trong bộ tích lũy.
Difficulty 1/5 · 100 coins + a small bonus on first completion today
So sánh chỉ thiết lập cờ mà lệnh nhảy có điều kiện tiếp theo đọc. Bộ tích lũy không thay đổi, đó là lý do tại sao bản ghi hiển thị không có giá trị ACC mới trên dòng CMP.
Điểm số dễ mất
LDM #10tải số 10;LDD 10tải nội dung của vị trí 10. Sự khác biệt#nằm ở toàn bộ ý nghĩa.#là thập phân,Blà nhị phân,&là thập lục phân.AND &0FvàAND B00001111là mặt nạ giống nhau;AND #15cũng vậy.CMPgiữ nguyên ACC; nó chỉ thiết lập cờ.JPNnhảy khi các giá trị không bằng nhau.- Lệnh thông dịch lần 1 viết không có mã. Kết xuất của nó là bảng ký hiệu, và tham chiếu tới trước là lý do tồn tại của nó.
Bạn đã nắm vững
- mã máy là các mẫu bit; lệnhIOException là các từ viết tắt, tương ứng một-một, được dịch bởi lệnh thông dịch
- hai lần thông dịch: lần 1 xây dựng bảng ký hiệu các địa chỉ nhãn, lần 2 sinh mã; cần thiết cho tham chiếu tới trước
- trace (gián đoạn) với bảng ACC và mọi vị trí, một hàng cho mỗi thay đổi; CMP thiết lập cờ, JPE/JPN đọc nó
- địa chỉ: ngay lập tức
#ngiá trị · trực tiếp nội dung của địa chỉ · theo chỉ số gián tiếp địa chỉ của địa chỉ · theo chỉ số địa chỉ + IX (mảng) · tương đối một độ lệch