Phụ lục A
Mã ASCII có 128 kí tự chuẩn và hơn 128 mở rộng, chỉ sự chuyển đổi giữa các máy với nhau, giữa các nước với nhau. Mã ASCII thay thế cho mã 16 bit với 65536 kí tự mà mỗi kí tự tuơng ứng với các cách sử dụng. 128 kí tự ...
Mã ASCII có 128 kí tự chuẩn và hơn 128 mở rộng, chỉ sự chuyển đổi giữa các máy với nhau, giữa các nước với nhau.
Mã ASCII thay thế cho mã 16 bit với 65536 kí tự mà mỗi kí tự tuơng ứng với các cách sử dụng.
128 kí tự đầu tiên :
| DEC | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | |
| HEX | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F | |
| 000 | 00 | Nul | |||||||||||||||
| 016 | 10 | ||||||||||||||||
| 032 | 20 | Spa | ! | " | # | $ | : | & | � | ( | ) | * | + | , | - | . | / |
| 048 | 30 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | : | ; | < | = | > | ? |
| 064 | 40 | @ | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O |
| 080 | 50 | P | Q | R | S | T | U | V | W | X | Y | Z | [ | ] | ^ | _ | |
| 096 | 60 | ` | a | b | c | d | e | f | g | h | y | z | k | l | m | N | o |
| 112 | 70 | p | q | r | s | t | u | v | w | x | y | z | { | | | } | ~ | Nul |
Các mã từ 128 đến 255:
Các mã này được sử dụng với DOS, máy in, hoặc màn hình ANSI
| 0 | Nul | Kí tự NULL ( kết thúc một chuỗi ) |
| 7 | Bel | Kí tự Bell hoặc Beep |
| 8 | Bak | Kí tự delete hoặc Backspace |
| 9 | Tab | Kí tự Tab |
| 10 | Lf | Lime Feed (bắt đầu một dòng mới) |
| 13 | Cr | Mã Carriage Return |
| 26 | Eof | Mã Dos End Of File |
| 27 | Esc | Mã Escape |
| 32 | Spa | Kí tự Space |
| 255 | Nul | Thêm 1 ký tự Null |
Chuyển đổi giữa nhị phân và hex :
CPU làm việc với mã nhị phân, có thể tạo ra số nhị phân bằng cách dùng công tắc điều chỉnh nút ON và OFF, nhị phân gồm số 0 và số 1. Bit đơn hoặc Bit nhị phân được chuyển đến CPU. Thông thường dữ liệu gồm 1 byte hay nhiều byte, 1 byte gồm 8 bit.
Ví dụ : 1byte gồm 8 bit chỉ có số 0 và số 1 : 0100 1011
Cách sử dụng hệ thập lục phân trong việc đọc, nói,viết thì không tiện lợi bằng cách sử dụng hệ nhị phân, việc chuyển đổi giữa số nhị phân và số hex thì rất đơn giản, 1 byte sẽ được chia thành hai nhóm, mỗi nhóm gồm 4 bit.
Ví dụ :
Byte 01001011 được chia thành hai hóm bit : 0100 và 1011.
Hệ thống số :
| Nhị phân(Binary) | Thập lục phân (Hexadecimal) | Thập phân (Decimal) |
| 0000 | 0 | 0 |
| 0001 | 1 | 1 |
| 0010 | 2 | 2 |
| 0011 | 3 | 3 |
| 0100 | 4 | 4 |
| 0101 | 5 | 5 |
| 0110 | 6 | 6 |
| 0111 | 7 | 7 |
| 1000 | 8 | 8 |
| 1001 | 9 | 9 |
| 1010 | A | 10 |
| 1011 | B | 11 |
| 1100 | C | 12 |
| 1101 | D | 13 |
| 1110 | E | 14 |
| 1111 | F | 15 |
Ví dụ 1: phân chia 1 byte thành hai :
Kết quả là 4Bhex : 4 B
Ví dụ 2 : chuyển E7 thập phân sang nhị phân
7 ----------------------- 0111
Vậy : E7 -----------------------1110 01112
![]()
Bao gồm : lệnh số học, lệnh jump, lệnh move, lệnh compare, lệnh stack, procedures và interrupts, lệnh xuất - nhập, và các lệnh khác.
Các thanh ghi của CPU :
Gồm 4 thanh ghi được được dùng cùng một mục đích là AL, BL, CL và DL.
IP là con trỏ lệnh.
SP là con trỏ ngăn xếp.
SR là thanh ghi trạng thái, thanh ghi này gồm các loại cờ : I, S, O và Z.
Các loại cờ :
Dùng để biểu thị ngõ ra của máy tính thông qua CPU. Các bit đơn trong thanh ghi trạng thái được sử dụng làm các cờ. Trong bộ mô phỏng này sử dụng các loại cờ :
Cờ S: là một cờ được đặt vào nếu việc tính toán đưa ra kết quả là(-)
Cờ O: là một cờ tràn, cờ này được đặt vào nếu kết quả đưa ra lớn hơn 8 bit.
Cờ Z : là cờ O, được đặt vào nếu kết quả đưa ra lớn hơn 8 bit.
Cờ I : là việc ngắt phần cứng.
Trên thực tế thì CPU có hơn 4 loại cờ kể trên.
Thanh ghi và các mã máy :
Các loại thanh ghi và các mã máy tương ứng như sau :
Tên thanh ghi : AL BL CL DL
Mã máy : 00 01 02 03
Ví dụ : Cộng 1 vào thanh CL thì sử dụng lệnh như sau :
Mã biên dịch : INC CL
Mã máy hex : A4 02
Nhị phân : 1010 0100 0000 0010
A4 : chỉ lệnh máy đưa đến lệnh INC
02 : chỉ thanh ghi CL
Trong trình biên dịch không có sự linh hoạt, mov thì tương tự như MOV và Mov. Mã thập lục phân không sử dụng hai mức như nhị phân.
Hệ thống số Hex :
Hệ Hex bao gồm các con số như 15, 3C và FF.Khi biên dịch thì có thể chuyển tất cả các con số thành hệ hex. Các thanh ghi trong CPU thì sử dụng mã nhị phân, hex và thập phân, do đó cần xem chi tiết việc chuyển đổi qua lại giữa hex và nhị phân.
Hệ thống số âm :
Ví dụ như FE là 1 số (-).
Trong 1 byte thì 4 bit da số các bit bên trái được sử dụng như 1 bit sign, nó có giá trị là -128 . Các byte có thể thay đổi từ -128 đến 127 ( đối với số - ) và từ 0 đến 255
Lệnh chuyển đổi gián tiếp :
Ðược sử dụng khi cần chyển dữ liệu vào trong RAM, lúc đó dấu ngoặc vuông được bao ngoài dữ liệu cần chuyển.
Ví du :
[15] : chỉ dữ liệu tại địa chỉ 15 hex được chuyển vào RAM. Khi chuyển dữ liệu vào thanh ghi thì cũng sử dụng dấu ngoặc vuông
Ví du� :
[BL] : đưa dữ liệu có trong thanh ghi BL chuyển vào RAM. Việc chuyển đổi này rất quan trọng và được sử dụng thường xuyên, thay vì đưa trực tiếp dữ liệu hoặc giá trị vào thanh ghi thì chuyển gián tiếp đến RAM. Việc di chuyển này được sử dụng thông qua con trỏ.
So sánh với chip 80X86 :
Ở một mức độ nhớ các lệnh của hệ mô phỏng này thì được xem như các mã nhớ của trình biên dịch. Các chương trình trở nên thực tế hơn nhờ việc thực hiện các lệnh, nhưng lệnh set thì không thực hiện được. Trong bộ mô phỏng này thì các lệnh sử dụng theo CPU 8 bit, còn các loại CPU còn lại thì không dùng để mô phỏng. Trong phiên bản các lệnh CALL, RET, INT, RET và việc ngắt phần cứng không qua các thủ tục và việc ngắt thì vẫn có thể thực hiện được.
Người soạn thảo chương trình mong muốn các lệnh trong bộ mô phỏng này tương tự như các lệnh trong chip 80X86, lệnh MUL và DIV thì đơn giản hơn chip 80X86. Sự bất lợi khi tiếp cận bộ mô phỏng là kết quả tạo ra cờ tràn quá nhiều. Việc sử dụng lệnh ADD và SUB trong bộ mô phỏng này có thể thực hiện được.
Trong 80X86 thì khi tính toán việc sử dụng lệnh DIV bao gồm cả lệnh DIV và MOD nhưng trong bộ mô phỏng thì sử dụng hai lệnh đó riêng biệt nhau.
Việc tạo ra mã máy của chip 80X86 và bộ mô phỏng tương tự nhau, hai loại mã máy thì khác nhau, mã máy của bộ mô phỏng đơn giản và gọn hơn.
Với loại 80X86, thì lệnh MOV AL, 15 gồm hai byte; byte thứ nhất chứa MOV AL còn giá trị 15 đưa vào một byte khác, điều này tạo ra sự khác nhau khi kết nối các lệnh MOV với các thanh ghi và nó khác nhiều khi sử dụng mã OP.
Bộ mô phỏng này cần 3 byte, MOV sử dụng 1 byte, loại mã OP, AL sử dụng 1 byte có mã 00. Dữ liệu 15 được đưa vào 1 byte, việc này tuy không hiệu quả nhưng rất đơn giản.
Các lệnh :
� ADD Cộng
� SUD Trừ
� MUL Nhân
� DIV Chia
� MOD Chia lấy phần dư
� AND Và
� OR Hoặc
� XOR So sánh
� INC Tăng lên 1
� DEC Giảm đi 1
� NOT Phủ định
� ROL Xoay các bit qua trái
� ROR Xoay các bit qua phải
� SHL Dịch chuyển các bit qua trái.
� SHR Dịch chuyển các bit qua phải.
Các ví dụ trực tiếp:
Mã biên dịch Mã máy
ADD AL, BL A0 00 01
SUB CL, DL A1 02 03
MUL AL, CL A2 00 02
DIV BL, DL A3 01 03
MOD DL, BL A6 03 01
AND CL, AL AA 02 00
OR CL, DL AB 02 03
XOR BL, AL AC 01 00
Các ví dụ tức thời :
ADD AL, 15 B0 00 15
SUB BL, 05 B1 01 05
MUL AL, 10 B2 00 10
DIV BL, 04 B3 01 04
MOD DL, 20 B6 03 20
AND CL, 55 BA 02 55
OR CL, AA BB 02 AA
XOR BL, FF BC 01 FF
Ví dụ :
ADD CL, AL ; cộng thanh ghi AL và CL sau đó kết quả đưa vào CL
ADD AL, 22 ; cộng 22 vào thanh ghi AL sau đó kết quả đưa vào AL.
Kết quả sau khi thực hiện phép cộng luôn luôn đưa vào thanh ghi đầu tiên.
DEC BL ; giảm 1 trong thanh ghi BL và kết quả đưa vào BL.
Các cờ :
+ Ðặt cờ Z khi kết quả tính toán ra 0.
+ Ðặt cờ S khi kết quả tính toán ra (-).
+ Ðặt cờ O khi kết quả là tràn.
Việc tràn xảy ra khi kết quả việc tính toán lớn hơn số bit đưa vào thanh ghi. Với thanh ghi 8 bit thì số lớn nhất có thể là : -128 đến + 127.
Với tập này, không sử dụng các loại cờ như Z, S hoặc O.
+ Tập lệnh : JMP JZ JNZ JS JNS JO JNO
+ Mã máy tương ứng : CO C1 C2 C3 C4 C5 C6
. JMP Jump : lệnh nhảy không có điều kiện.
. JZ Jump Zero : nhảy nếu cờ Z được đặt vào.
. JNZ Jump Not Zoro : nhảy nếu cờ Z không được đặt vào.
. JS Jump Sign : nhảy nếu có cờ Sign.
. JNS Jump Not Sign : nhảy nếu cờ Sign không đặt vào.
. JO Jump Overflow : nhảy nếu có cờ tràn (O) được đặt vào.
. JNO Jump Not Overflow : nhảy nếu cờ tràn (O) không được đặt vào.
� Ví dụ :
JMP HERE ; mã của trình biên dịch
CO ?? ; đây là mã máy tương ứng
; ?? địa chỉ mà người biên dịch cần tính toán
HERE : ; nhãn mà ngưòi biên dịch sử dụng
; khi việc tính toán đã hoàn chỉnh thì nhảy về địa chỉ
Lệnh JMP là một trong tập lệnh của thanh ghi con trỏ, việc tính toán được thực hiện bởi người biên dịch, dùng lệnh này có thể nhảy tới hoặc nhảy về lại trong độ dài +127 đến - 128 đó chính là nguyên nhân tại sao các con số lớn nhất lại có thể được lưu trữ trong 8 bit của vùng nhớ.
Các lệnh Jump khác thì làm việc tương tự, với điều kiện các cờ được đặt vào hoặc không.
HERE : ; một loại nhãn hợp yêu cầu
HERE : : ; không sử dụng được, chỉ cần một dấu hai chấm
1234 : ; không sử dụng được, nhãn phải là ký tự chữ hoặc là dấu "_".
Lệnh Move thực hiện giữa các thanh ghi với nhau .
Dữ liệu được di chuyển từ thanh ghi này đến thanh ghi khác.
Bộ mô phỏng thì không hỗ trợ loại lệnh này.
Cú pháp của lệnh MOV này :
MOV AL, BL
Lệnh này sử dụng gọn hơn việc sử dụng hai dòng lệnh :
PUSH AL
POP BL
Lệnh Move tức thời :
- Sử dụng khi cần di chuyển một số nào đó vào một thanh ghi.
Ví dụ :
Lệnh : MOV BL, 45
Mã máy : DO 01, 45
Trong đó :
DO : mã máy của lệnh MOVE tức thời
01 : thanh ghi BL
45 : số cần chuyển vào thanh ghi BL
Lệnh Move gián tiếp :
Dữ liệu được chuyển đổi giữa các thanh ghi và các vùng nhớ trong RAM.
Dữ liệu được đưa đến từ thanh ghi hoặc từ RAM, các địa chỉ trong RAM sử dụng lệnh này, ví dụ :
Lệnh : MOV BL, [15]
Mã máy : D1 01 15.
Trong đó :
D1 : mã máy của lệnh move gián tiếp
01 : thanh ghi BL
15 : địa chỉ RAM
Dữ liệu được chuyển từ địa chỉ [15] trong RAM đến thanh ghi BL.
Ðể chuyển dữ liệu từ 1 thanh ghi vào RAM.
Ví dụ :
Lệnh : MOV [13],BL
Mã máy : D2 13 01
Trong đó :
D2 : chỉ mã máy cho một lệnh Move gián tiếp
01 : thanh ghi BL
13 : địa chỉ RAM
Dữ liệu được di chuyển từ thanh ghi BL vào địa chỉ [13] trong RAM.
Lệnh Move gián tiếp dùng trong thanh ghi :
Một thanh ghi thường chứa các dữ liệu cần chuyển, một thanh ghi khác được lưu trữ trong vùng RAM.
Ví dụ :
Lệnh : MOV DL,[AL]
Mã máy : D3 03 00
Trong đó :
D3 : chỉ mã lệnh của lệnh Move gián tiếp dùng trong thanh ghi.
03 : thanh ghi DL
00 : thanh ghi AL
Thanh ghi AL có dữ liệu được chứa trong RAM, dữ liệu được chuyển từ RAM sang thanh ghi DL.
Dữ liệu cũng có thể di chuyển theo một hướng khác, ví dụ như :
Lệnh MOV [DL], AL
Mã máy D4 03 00
Trong đó :
D4 : mã lệnh của thanh ghi sử dụng lệnh Move gián tiếp.
03 : thanh ghi D2
00 : thanh ghi AL
Thanh ghi DL chứa dữ liệu có địa chỉ trong RAM. Dữ liệu được di chuyển từ thanh ghi DL vào RAM
- Khi bộ mô phỏng cần so sánh hai giá trị với nhau thì dùng lệnh CMP.
- Lệnh CMP sẽ thực hiện việc so sánh sau khi trừ hai giá trị đó với nhau.
- Nếu hai giá trị bằng nhau, lúc đo phép trừ có kết quả bằng 0, trường hơp này cờ Z sẽ được đặt vào.
- Nếu số bị trừ nhỏ hơn số trừ, thì sẽ không đặt cờ vào.
- Nếu số bị trừ lớn hơn số trừ, kết quả sẽ ra một số (-), trường hợp này cờ sign sẽ được đặt vào.
- Có thể sử dụng lệnh JS, JS để kiểm tra lại kết quả khi sử dụng lệnh CMP.
Lệnh so sánh hai thanh ghi : sử dụng hai thanh ghi để so sánh .
Ví dụ :
Lệnh CMP Al, BL
Mã máy DA 00, 01
Trong đó :
DA : mã của lệnh so sánh hai thanh ghi.
00 : thanh ghi AL
01 : thanh ghi BL
. Nếu hai thanh ghi có giá trị bằng nhau, thì đặt cờ Z
. Nếu thanh ghi thứ nhất AL có giá trị lớn hơn thanh ghi thứ hai, thì đặt S
. Các trường hợp còn lại thì sẽ không đặt cờ vào.
Lệnh so sánh tức thời : so sánh giữa thanh ghi với một số bất kỳ.
Ví dụ :
Lệnh CMP AL, 0D
Mã máy DB 00, 0D
Trong đó :
DB : chỉ mã của lệnh CMP
00 : thanh ghi AL
0D : con số cần so sánh
. Nếu giá trị của thanh ghi bằng với số cần so sánh, thì đặt cờ Z.
. Nếu thanh ghi có giá trị lớn hơn số thì đặt cờ S.
. Không đặt cờ cho các trường hợp còn lại.
+ Lệnh so sánh gián tiếp : so sánh thanh ghi với một dữ liệu có địa chỉ chứa trong RAM
Ví dụ :
Lệnh CMP CL, [20]
Mã máy DC 02, 20
Trong đó :
DC : mã lệnh.
02 : thanh ghi CL.
20 : dữ liệu có địa chỉ trong RAM cần so sánh với thanh ghi.
- Nếu thanh ghi có giá trị bằng giá trị của con số, thì đặt cờ Z
- Nếu thanh ghi CL có giá trị lớn hơn giá trị của số cần so sánh thì đặt cờ.
- Các trường hợp còn lại thì không đặt cờ.
Các lệnh này không sử dụng việc đặt cờ Z, S hoặc O
Sau khi đưa các dữ liệu vào ngăn xếp, phải đặt đúng theo thứ tự đã bị đa ngược vì ngăn xếp làm việc theo quy tắc xử lý ngõ ra cuối cùng trước sau đó mới đến ngõ ra đầu tiên ( quy luật LIFO : last in first out ).
Ngăn xếp được sử dụng để :
+ Lưu nội dung của thanh ghi để sau đó khôi phục lại .
+ Ðưa các tham số vào thủ tục sau đó quay về kết quả
Nội dung của thanh ghi được lưu trữ trong ngăn xếp sau đó sẽ được khôi phục lại, ngăn xếp làm việc theo nguyên tắc LIFO ( vào sau cùng ra trước hết)
. Lệnh PUSH : được sử dụng để đặt dữ liệu vào ngăn xếp.
. Lệnh POP : được sử dụng để lấy dữ liệu ra khỏi ngăn xếp.
Ví dụ :
1) Lệnh PUSH BL
Mã máy E0 01
Trong đó : E0 : mã máy của lệnh PUSH
01 : thanh ghi BL
2) Lệnh POP BL
Mã máy E1 01
Trong đó :
E1 : mã lệnh POP
01 : thanh ghi BL
Ngăn xếp có thể lưu trữ và khôi phục lại các cờ của thanh ghi.
Ví dụ :
1) Lệnh PUSHF
Mã máy EA
Trong đó :
EA : mã máy của lệnh PUSHF
2) Lệnh POPF
Mã máy EB
Trong đó : EB mã của lệnh POPF

- Sử dụng các thanh ghi sẵn có.
- Không đặt cờ Z, O, S
Các cờ và thanh ghi được lưu bởi các thủ tục hay ngắt và được khôi phục lại sau khi thủ tục hay ngắt hoàn thành công việc của nó.
. Sử dụng lệnh PUSH và PUSHF để lưu
. Sử dụng lệnh POP và POPF để phục hồi.
Cách gọi một thủ tục:
Xem ví dụ sau :
Lệnh CALL 30
Mã máy CA 30
CA : mã lệnh CALL
30 : địa chỉ bắt đầu của thủ tục được gọi
Quay trở lại từ một thủ tục :
Lệnh RET
Mã máy CB
Kết thúc một thủ tục thì sử dụng lệnh RET và quay trở về chương trình tới lệnh sau lệnh CALL. Mã máy của lệnh RET là CB.
Cách gọi lệnh Interrup thông thường :
Lệnh INT 03
Mã máy CC 03
CC : mã lệnh của INT, 03 : địa chỉ của vectơ ngắt sử dụng bởi lệnh INT
03 : vectơ ngắt thuộc vùng lưu trữ RAM, đây là địa chỉ bắt đầu của mã ngắt. Chương trình nhảy về địa chỉ của mã ngắt và thực hiện việc ngắt.
Quay trở lại từ một lệnh ngắt :
Lệnh IRET
Mã máy CD
Mã ngắt sau cùng là lệnh IRET, quay trở lại chương trình sử dụng lệnh A. Mã máy của lệnh IRET là CD.
Quay trở lại địa chỉ mà chương trình chuyển đến sau khi thực hiện việc ngắt và lưu trong ngăn xếp.

Không đặt các cờ Z, S, O
Các port được nối đến bộ mô phỏng và đưa ra ngoài.
IN 00 : đọc từ bàn phím, nhập từ bàn phím
OUT 01 : xuất dữ liệu ra điều khiển đèn giao thông
Ví dụ :
Lệnh IN 00
Mã máy F0 00
FO : mã máy của lệnh IN, dữ liệu được đưa vào từ 1 port
00 : chỉ số port mã dữ liệu xuất ra.
Bộ mô phỏng gồm có các port : 0HEX đến 0FHEX
Lệnh OUT 01
Mã máy F1 01
F0 : mã máy của lệnh OUT, dữ liệu được đưa ra các port
01 : chỉ vị trí của port
Bao gồm : HALT, MOP, CLO, ORG, DB, CLI, STI
Các lệnh này không đặt các cờ Z, S, O
Chú ý :
CLI : lệnh xóa cờ I
SET : lệnh đặt cờ I
� Lệnh HALT : lệnh dừng chương trình
Lệnh HALT
Mã máy 00
00: mã lệnh của HALT
Chương trình sẽ ngừng nếu gặp lệnh HALT, chương trình sẽ chạy lại nếu hủy bỏ lệnh này. Bạn có thể sử dụng một vài lệnh HALT trong một chương trình và chỉ sử dụng đúng một lệnh END.
� Lệnh NOP : không làm gì trong một chu kỳ xung
Lệnh NOP
Mã máy FF
FF : chỉ mã của lệnh NOP.
Chương trình sẽ không làm gì cho một chu kỳ xung clock, sau đó chương trình sẽ hoạt động trở lại. NOP được sử dụng như một thủ tục delay cho phép giữa các mạch điện với CPU và khi đó gọi là "trạng thái chờ ".
� Lệnh CLO : đóng tất cả cửa sổ của các chương trình khác.
Lệnh CLO
Mã máy FE
FE : mã lệnh CLO
Chỉ được sử dụng mã này trong bộ mô phỏng, và dùng để đóng các cửa sổ của chương trình khác. Việc này rất cần thiết vì màn hình lúc đó sẽ không có chương trình khác, không tạo ra sự lẫn lộn.
� Lệnh ORG : Mã gốc
Mã được phát sinh từ một địa chỉ bắt đầu lớn hơn 0, việc này thì hữu dụng để đặt các thủ tục , các ngắt hay bảng dữ liệu tại địa chỉ trong vùng nhớ.
ORG 30
Không có mã máy nào đ