24/05/2018, 18:26

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 đ

0