Phụ lục B

Giải các bài tập củng cố

 

  BÀI TẬP SỐ 1:

1.1/ Viết chương trình sử dụng lệnh SUB

Tương tự  chương trình trên nhưng ta sử dụng lệnh SUB thay cho lệnh ADD để trừ 2 số và kết quả được lưu vào thanh ghi AL.

; chương trình trừ 2 số Hex

CLO

MOV           AL,2

MOV           BL,2

SUB           AL, BL

END                                ; kết thúc chương trình .

         

1.2/ Viết chương trình sử dụng lệnh MUL

Tương tự  chương trình trên nhưng ta sử dụng lệnh MUL để nhân 2 số và kết quả được lưu vào thanh ghi AL

; chương trình nhân 2 số Hex

CLO

MOV           AL,2

MOV           BL,2

MUL          AL, BL

END                               ; kết thúc chương trình .

 

1.3/ Viết chương trình chia 2 số sử dụng lệnh DIV

; chương trình chia 2 số Hex

CLO

MOV           AL,2

MOV           BL,2

DIV            AL, BL

END                         ; kết thúc chương trình . 

 

1.4/ Viết chương trình chia cho 0

 

; chương trình chia cho 0

MOV                    AL,10

MOV                    BL,0

DIV                    AL,BL

 

BÀI TẬP SỐ 2:

Sử dụng help page trong số Hex và số nhị phân. Tìm ra những số Hex sẽ làm hoạt động của đèn thay đổi. Từ đó hãy sửa đổi chương trình của đèn giao thông để hoạt động theo trình tự trong thực tế.

Giảng giải:

Ðể thực hiện chương trình . ta phải xem các bit nào làm cho đèn sáng theo trình tự thực tế thì cho lên 1, các bit còn lại bằng 0, 2 bit LSB không sử dụng thì cho bằng 0. Từ đó tìm ra số Hex tương ứng để viết chương trình .

; chương trình điều khiển đèn giao thông thực tế

CLO                      ; đóng tất cả các cửa sổ không cần thiết

Start :

MOV           AL, 84          ; chuyển 84h vào thanh ghi AL

OUT           01                ; xuất ra port 1

MOV           AL, 88          ; chuyển 88h vào thanh ghi AL

OUT           01                ; xuất ra port 1

MOV           AL,30          ; chuyển 30h vào thanh ghi AL

OUT           01                ; xuất ra port 1

MOV           AL,50          ; chuyển 50h vào thanh ghi AL

OUT           01                ; xuất ra port1

JMP           Start            ; nhảy về nhãn Start để thực hiện lại

END                           ; kết thúc chương trình

 

BÀI TẬP SỐ 3:

Viết chương trình hiển thị chữ  HELLO.

Hãy tra bảng mã ASCII của các mẫu tự H,E,L,L,O và copy những giá trị này vào bộ nhớ C0, C1,C2,C3,C4. Ðây là việc đơn giản và có phần thô trong việc hiển thị văn bản, trong việc sắp xếp bộ nhớ để hiển thị.

Giảng giải:

Ðể viết chương trình trên, đầu tiên ta phải tra cứu mã ASCII của các mẫu tự H,E,L,L,O và đưa các mã ASCII đến địa chỉ RAM [C0],[C1],[C2],[C3], [C4]. Chạy chương trình và xem văn bản xuất hiện như thế nào trong việc mô phỏng trên màn hình hiển thị VDU. Ðiều này là những gì xãy ra trong PC của IBM khi đang chạy trong hệ điều hành MS DOS.

Bạn nên làm bài tập này và nếu bạn đang học lập trình ngôn ngữ thấp thì bạn sẽ học có hiệu quả hơn và có nhiều cách linh động hơn để giải quyết vấn đề.

Chương trình :

CLO                               ; đóng các cửa sổ không cần thiết

Start:

MOV           AL,48                  ; đưa 48 vào thanh ghi AL

MOV           [C0], AL              ; đưa dữ liệu trong AL ra màn hình

MOV           AL,45       

MOV           [C1],AL

MOV           AL,4C

MOV           [C2],Al

MOV           AL,4C

MOV           [C3],AL

MOV           AL,4F

MOV           [C4],AL

END.                             ; kết thúc chương trình

 

BÀI TẬP SỐ 4:

    4.1/ Viết chương trình đếm lùi lại sử dụng DEC BL.

; chương trình đếm lùi

MOV BL, 40

Rep :

DEC     BL                         ; giảm BL xuống 1

JMP    Rep

END

 

4.2/ Viết chương trình đếm lên 3 sử dụng lệnh Add BL,3

; chương trình đếm lên 3

MOV  BL, 40

Rep :

Add       BL,3                              ; cộng thêm 3 vào BL

JMP    Rep

END

 

4.3/ Viết chương trình đếm 1,2,4,8,16 sử dụng lệnh MUL BL,2

; chương trình đếm 1, 2, 4, 8, 16

MOV           BL,01

Rep :

MUL         BL,2                     ; nhân 2 vào BL

JMP           Rep

END

 

4.4/Viết chương trình đếm theo dãy số sau 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89,  tràn bộ nhớ .

; Ðếm theo dãy số trên kết quả hiển thị trên ô nhớ [40] và [70] trên RAM        MOV AL,0     ; Giá trị khởi điểm thứ nhất lưu trong AL        MOV BL,1    ; Giá trị khởi điểm thứ hai lưu trong BLRep:         MOV [70],AL        MOV [40],BL        ADD AL,BL        ADD BL,AL        JMP Rep         ; Lặp lại phép cộngEND                        ; _____ Kết thúc chương trình________________________________________ 

 

BÀI TẬP SỐ 5

5.1/ Viết chương trình hiển thị mỗi ký tự tại vị trí đầu bên trái của màn hình VDU bằng việc copy tất cả chúng tới địa chỉ [C0]

Thí dụ ta muốn đưa chữ H ra vị trí đầu bên trái màn hình VDU thì ta phải tra mã ASCII của chữ H và mov vào thanh ghi AL, rồi từ đó copy vào [CO]

Chương trình:

CLO

START :

MOV    AL, 48

MOV    [C0], AL

END

 

5.2/ Viết chương trình sử dụng thanh ghi BL để chỉ tới địa[C0] và tăng BL sau mỗi lần phím nhấn theo thứ tự để thấy được văn bản bạn gõ.

Chương trình:

;Chương trình hiện chữ khi nhấn, nhấn Enter kết thúc chương trình

MOV              BL,C0

Start:

          IN               00

          CMP           AL,0D

          JZ                Stop

          MOV           [BL],AL

          INC             BL

          JMP            Start

Stop:

          END

 

            5.3/ Viết chương trình nhập mã số để mở máy với yêu cầu cụ thể như sau: khi chương trình đã khởi động muốn thoát khỏi chương trình phải tuần tự gỏ đúng thứ tự ba chữ cái A,N,H (đúng cã thứ tự); nếu gỏ sai chương cứ chạy lẩn quẩn không thoát ra được.

; Nhập phím nhấn từ bàn phím cho đến khi phím enter được nhấn ------------

CLO

Rep :

IN      00           ;Kiểm tra có phải chữ A không?

CMP  AL,0D    

JNZ   Rep         

                         

IN      00           ; Có phải chữ N không?

CMP  AL,0D    

JNZ   Rep         

 

IN      00           ; Có phải chữ H không?

CMP  AL,0D    

JNZ   Rep

; Nếu đúng là ba chữ A,N,H nhập theo thứ tự thì thoát khỏi chương trình        

 

END

 

BÀI TẬP SỐ 6:

 Viết chương trình đèn giao thông và sử dụng thủ tục này để thiết lập thời gian trì hoãn giống thực tế.

Ðể hiển thị đèn giao thông đúng thực tế ta cho Ðỏ: 10s, Xanh: 8s, Vàng 2s.

;chương trình hiển thị đèn giao thông theo thực tế

CLO

Start:

MOV           AL,84                  ;đỏ 1 + xanh 2

OUT            01                          ;xuất ra port 1

MOV           AL,8                     ;trì hoãn 8s

CALL       30                          ;gọi thủ tục tại địa chỉ [30]

 

MOV           AL,88                  ;đỏ 1 + vàng 2

OUT            01               

MOV           AL,2                     ;trì hoãn 2s

CALL       30

 

MOV           AL,30                  ;xanh 1 + đỏ 2

OUT            01

MOV           AL,8                     ;trì hoãn 8s

CALL       30

 

MOV           AL,50                  ;vàng 1 + đỏ 2

OUT            01

MOV           AL,2                     ;trì hoãn 2s

CALL       30

JMP          Start                               ;nhảy về nhãn Start

;thủ tục trì hoãn được lưu ở địa chỉ [30]

ORG          30

PUSH       AL

PUSHF

Rep:

DEC          AL

JNZ          REP

POPF

POP          AL

RET

END

 

BÀI TẬP SỐ 7:7.1/ Viết một chương trình sử dụng 3 thủ tục. Bao gồm thủ tục đọc văn bản từ bàn phím và cất vào RAM, thủ tục thứ 2 nên chuyển đổi trường hợp các ký tự chữ hoa trong văn bản thành chữ thường. Thủ tục 3 nên hiển thị văn bản trên màn hình VDU.

; --------------------------------------------------------------; Chương trình chính

MOV         BL,70    ; [70]là địa chỉ mã ASCII của ký tự đầu tiên trên VDU.CALL 10                 ; goi� thủ tục nhập chuỗi ký tựCALL 90                 ; goi� thủ tục chuyển chữ thường thành chữ hoa   CALL 40                 ; goi� thủ tục hiển thị chuỗi ký tự trên VDUHALT     ;  không được dùng END tại đây; --------------------------------------------------------------;  goi thủ tục nhập chuỗi ký tựORG 10                 ; khởi đầu thủ tục tại địa chỉ [10]PUSH AL              ;  lưu trữ trạng thái thanh ghiPUSH BL PUSHF Rep:IN 00                    ; nhập ký tự từ bàn phímCMP AL,0D         ; có phải phím Enter không?JZ Stop                 ; nếu phải nhảy đến StopMOV [BL],AL     ; Nhập phím nhấn vào RAM tại ô nhớ được chỉ ra bởi BLINC BL                ; BL chỉ ra vị trí kế tiếp mà ký tự sẽ nhập vàoJMP Rep              ; Nhảy về Rep ( chuẩn bị nhập phím kế tiếp)Stop:MOV AL,0             ; Nhập khoảng trắngMOV [BL],AL        POPF                 ; phục hồi trạng thái thanh ghiPOP BL POP AL RET                    ; kết thúc thủ tục; --------------------------------------------------------------; CHUYỂN CHỮ THƯỜNG THÀNH CHỮ HOAORG 90        PUSH AL        PUSH BL        PUSHFCHUYEN:MOV         AL,[BL] ; Có ký tự nào nhập và tại ô nhớ [BL]?

CMP         AL,0        ; nếu không thoát ra NGUNGJZ              NGUNGSUB             AL,20    ;nếu có, chuyển sang chữ hoaMOV         [BL],ALINC             BLJMP          CHUYENNGUNG:        POPF                ; khôi phục trạng thái thanh ghi        POP BL        POP ALRET;---------------------------------------------------------------; THỦ TỤC HIỂN THỊ KÝ TỰ TRÊN MÀN HÌNHORG 40 ; HERE:MOV CL,C0     ; XEM CHÚ GIẢI Ở BÀI TẬP 7    MOV BL,70          START:                 MOV AL,[BL]      CMP AL,0             JZ END1                MOV [CL],AL        INC CL                     INC BL                        JMP START             END1:    ; --------------------------------------------------------------END

 

BÀI TẬP SỐ :8.1/ Sử dụng bảng dữ liệu viết chương trình điều khiển đèn giao thông theo thực tế. Ta phải tìm số nhị phân nào làm cho đèn sáng tương ứng và sau đó đổi qua số hex

Ta có thể quy ước :

Ðỏ 1 - Xanh 2 sáng : 1000 0100

Ðỏ 1 - Vàng 2 sáng : 1000 1000

Xanh 1 - Ðỏ 2 sáng : 0011 0000

Vàng 1 - Ðỏ 2 sáng : 0101 0000

Chương trình:

;đèn  giao thông sáng theo thực tế

          JMP            Start

 

     DB       84

     DB       88

     DB       30

     DB       50

Start:

     MOV       BL,02

Rep:

     MOV       AL,[BL]

     OUT       01

     CMP        AL,50

     JZ      Start

     INC       BL

     JMB       Rep

      END  

 

8.2/ Viết chương trình điều khiển động cơ bước chạy bước

;động cơ bước chay bước

JMP START

DB 1

DB 3

DB 2

DB 6

DB 4

DB 0C

DB 8

DB 9

START:

MOV BL,02

REP:

MOV AL,[BL]

OUT       05

CMP        AL,9

JZ           STOP

INC       BL

JMP        REP

STOP:

END

 

BÀI TẬP SỐ 9:

            9.1/Viết thủ tục nhân đôi một số, cứ một tham số trong thủ tục thì sử dụng 1 thanh ghi. Sử dụng cùng thanh ghi để quay trở về lại kết quả.  

; Nhảy qua bảng thông số ----------------------------------------------------

    JMP Start         

    DB 00

    DB 00

Start:

    MOV     AL,5    ;giữ 1 byte của RAM tại địa chỉ 02

    MOV     BL,2    ;giữ 1 byte của RAM tại địa chỉ 03

    CALL       30   ;gọi thủ tục nhân đôi

;Thủ tục nhân đôi một số  ------------------------------------------------------

;Các tham số thông qua trong thủ tục sử dụng AL và BL

;Kết quả đưa vào AL

    ORG      30             ;bắt đầu tại địa chỉ 30

    MUL     AL,BL      ;nhân AL với 2, kết quả lưu trong AL

RET                           ;kết thúc chương trình con, quay trở về từ thủ tục

END                            ;kết thúc chương trình

;-----------------------------------------------------------------------------------

 

            9.2/ Viết thủ tục đảo tất cả các bit trong byte (tất cả số 0 thành 1, số 1 thành 0). Chuyển giá trị được xử lý vào thủ tục bằng cách sử dụng vị trí RAM. Quay trở về kết quả trong cùng vị trí RAM.

; Nhảy qua bảng thông số ----------------------------------------------------

    JMP Start         

    DB 00

Start:

;sử dụng vị trí RAM để đưa các tham số vào trong 1 thủ tục

      MOV        AL,3

      MOV        [02],AL

      CALL        40        ;gọi thủ tục đảo dấu

;Thủ tục đảo tất cã các bit ---------------------------------------------------

;Các tham số thông qua trong thủ tục sử dụng vị trí RAM

;Kết quả lưu vào vị trí RAM

    ORG     40                ;bắt đầu tại địa chỉ 40

    PUSH    CL              ;lưu các thanh ghi và các cờ vào ngăn xếp

    PUSHF

    MOV     CL,[02]        ;tìm nạp tham số từ RAM

    NOT      CL

    POPF                          ;khôi phục lại thanh ghi ban đầu và giá trị cờ

    POP CL

RET                                ;kết thúc chương trình con

END                              ;kết thúc chương trình

;-----------------------------------------------------------------------------------

 

BÀI TẬP SỐ 10:

            Viết một chương trình ngắt nạp phím nhấn và lưu vào RAM.

; --------------------------------------------------------------; Ngắt mềm

;---------------------------------------------------------------Jmp Start         ; nhảy qua bảng dữ liệu của ảng vector ngắtDB 51             ; vector tại ô nhớ 02 chỉ tới địa chỉ  51Start:INT 02           ; ngắt 02; --------------------------------------------------------------ORG 50DB 70; ----------------------------------------------------------------; Nhập văn bảng vào từ bàn phím, việc nhập kết thúc khi nhấn ENTER.; ----------------------------------------------------------------MOV     BL,C0 ; định địa chỉ sẽ hiển thị trên VDU (góc trái màn hình)Start1:IN 00                 ; Nhập từ bàn phím vào thanh ghi AL.CMP AL,0D     ; Có phải phím ENTER ? JZ     Stop          ; Nếu phải thì nhảy về Stop.MOV [BL],AL ; Chuyển ký tự vừa nhập trong AL vào VDU ở                           ; địa chỉ mà BL chỉ đếnINC     BL         ; BL chỉ ra vị trí kế tiếp trên VDU.JMP     Start      ; Trở về lại nhãn start.Stop:IRETEND

 

BÀI TẬP 11

1/ Viết chương trình kiểm tra bộ định thời tạo xung ngắt trong chương trình mô phỏng. ; --------------------------------------------------------------; Chương trình minh hoạ sự tác động của bộ định thời tạo tín hiệu ngắt cứng

; Trong Configuration Tab, khoảng thời gian là 5 ; nghĩa là sau mỗi 5 giây sẽ có một lệnh INT02 được gọi từ bộ định thời phần 

; cứng tác động lên chương trình Jmp StartDB 40Start:STIRep:NOPNOPNOPNOPNOPNOPJMP RepORG 40NOPNOPNOPNOPNOPNOPIRETEND

2/Dùng lệnh CLI và STI để kiểm tra sự tác động của ngắt cứng lên CPu trong chương trình mô phỏng.

; --------------------------------------------------------------; Sử dụng lệnh CLI và STI để xoá và đặt cờ I

; Chương trình kiểm tra chức năng của ngắt cứng 02; --------------------------------------------------------------JMP StartDB 40 ; Vector ngắt tại địa chỉ 02Start:nopnopnopclinopnopnopstijmp Start; --------------------------------------------------------------org 40NOPNOPNOPNOPNOPIRET; --------------------------------------------------------------end

;---------------------------------------------------------------

 

3/Viết chương trình điều khiển đồng thời đèn giao thông khi về khuya (chỉ có đèn vàng ở mỗi cột nhấp nháy) cùng mạch đếm từ 0 đến 9 lập đi lập lại nhiều lần, hiển thị kết quả trên một led 7 đoạn. Nếu bạn muốn phần cứng đếm từ 00 đến 99 thì sử dụng cả 2 led hiển thị cùng một lúc. 

; --------------------------------------------------------------Jmp Start ; nhảy qua bảng dữ liệuDB 50     ; vec tơ ngắt cứngDB FA    ; Bảng dữ liệu bắt đầu ở địa chỉ [03]DB 0ADB B6DB 9EDB 4EDB DCDB FCDB 8ADB FEDB CE ; dữ liệu cuối cùng trong bảng.DB 03 ; Ðịa chỉ bắt đầu của bảng dữ liệu; --------------------------------------------------------------Start:STI                 ; Cho phép ngắt cứng tác động

Mov BL,03     ; BL chứa địa chỉ khởi đầu của bảng dữ liệuRep:MOV AL,[BL] ; chuyển dữ liệu từ bảng vào ALOUT 02             ; hiển thị LED

CMP AL,CE     ; Có phải cuối bảng chưaJZ Start             ; Nếu cuối, nhảy đến StartINC BL             ; vị trí kế tiếp của bảngJMP Rep            ; Nhảy trở về và thực hiện với con số kế tiếpJMP Start; --------------------------------------------------------------ORG 50push al ;lưu trữ trạng thái thanh ghipush bl ;pushf ;  Jmp PastDataDB 40 ; vàng trái sángDB 08 ; vàng phải sángDB 57 ; qua bảngPastData:MOV BL,[59]           ; BL chỉ đến bảng dữ liệuMOV AL,[BL]         ; chuyển dữ liệu từ bảng vào ALOUT 01                     ; hiển thị đèn giao thôngCMP AL,08              ; Có phải dữ liệu cuối cùng của bảngJZ Reset                    ; Nếu cuối,  đến ResetINC BL                     ; BL chỉ đến vị trí kế tiếpMOV [59],BL           ; Lưu giá trị con trỏ lệnh vào RAMJMP StopReset:MOV BL,57             ; Ðến địa ch3 khởi điểm của bản dữ liệuMOV [59],BL          ; Lưu con trỏ lệnh vào ô nhớ 54 trên RAM Stop:popf                            ; phục nguyên trang thái thanh ghipop bl pop al IRET; --------------------------------------------------------------END; --------------------------------------------------------------

Lời giải phần bài tập tổng hợp

   

BÀI TẬP 1.1

        Ứng dụng vòng lập.

        CLO            ; --------------------------------------------------------

Start:           MOV    AL,84            OUT     01

LOOP1:

            INC    AL            CMP    AL,8a            JNZ    LOOP1            MOV    AL,88            OUT    01LOOP2:

            INC    AL            CMP    AL,8a            JNZ    LOOP2            MOV    AL,30            OUT     01LOOP3:

            INC    AL            CMP    AL,39            JNZ    LOOP3            MOV    AL,50            OUT     01LOOP4:

            INC    AL            CMP    AL,53            JNZ    LOOP4            JMP    StartEND

;-----------------------------------------------------------------------------------    

   

BÀI TẬP 1.2:

Sử dụng thủ tục định thời.

;chương trình hiển thị đèn giao thông 

CLO

Start:

MOV      AL,84                  ;đỏ 1 + xanh 2

OUT            01                    ;xuất ra port 1

MOV      AL,8                    ;trì hoãn 8s

CALL          30                    ;gọi thủ tục tại địa chỉ [30]

MOV      AL,88                   ;đỏ 1 + vàng 2

OUT            01               

MOV      AL,2                     ;trì hoãn 2s

CALL          30

MOV      AL,30                  ;xanh 1 + đỏ 2

OUT            01

MOV          AL,8                    ;trì hoãn 8s

CALL         30

MOV     AL,50                  ;vàng 1 + đỏ 2

OUT      01

MOV     AL,2                     ;trì hoãn 2s

CALL        30

JMP     Start                       ;nhảy về nhãn Start

;thủ tục trì hoãn được lưu ở địa chỉ [30]

ORG          30

PUSH       AL

PUSHF

Rep:

DEC          AL

JNZ          REP

POPF

POP          AL

RET

END

;------------------------------------------------------------------------------

 

BÀI TẬP 1.3:   

Sử dụng bảng dữ liệu.

Ta có thể quy ước :

Ðỏ 1 - Xanh 2 sáng : 1000 0100

Ðỏ 1 - Vàng 2 sáng : 1000 1000

Xanh 1 - Ðỏ 2 sáng : 0011 0000

Vàng 1 - Ðỏ 2 sáng : 0101 0000 

Chương trình:

       JMP     Start

            DB       84

     DB       88

     DB       30

     DB       50

Start:

     MOV       BL,02

Rep:

     MOV       AL,[BL]

     OUT         01

     CMP         AL,50

     JZ              Start

     INC          BL

     JMP         Rep

END

   

BÀI TẬP 2.2:

;GHI VÀO MÀN HÌNH VDU---------------------------------------------

CLO                                           ;đóng các cửa sổ khác lại

JMP         HERE                         ;nhảy qua bảng dữ liệu

DB         "HELLO WORLD"    ;nạp chuỗi ký tự vào RAM

DB           0        ;kết thúc chuỗi ký tự hiển thị đoạn văn bản

HERE:

MOV     CL,C0             ;định ra địa chỉ đầu tiên trên màn hình

MOV     BL,03              ;địa chỉ bắt đầu của đoạn văn bản

START:

MOV     AL,[BL]         ;đưa ký tự trong chuỗi vào AL

CMP         AL,0            ;kết thúc chuỗi ký tự chưa?

JZ             END            ;nếu đã kết thúc nhảy ra khỏi vòng lặp đến END

MOV     CL,[AL]          ;nếu chưa kết thúc lưu ký tự vừa hiển thị vào VDU

INC          CL                ;định ra vị trí kế cận ký tự vừa hiển thị xong

INC          BL                ;đưa ký tự kế tiếp trong chuỗi vào BL

JMP     START             ;trở về start

END1:

; ----- XOÁ MÀN HÌNH VDU -----------------------------------        MOV CL,C0          ;định ra địa chỉ đầu tiên trên màn hình VDU        MOV BL,0C           ; địa chỉ bắt đầu xoá  

        MOV AL,20             ; chèn khoảng trốngREP:        MOV [CL],AL          ; Xoá từng chữ

        INC CL         DEC BL                   ; Giảm dần BL        JNZ REP                 ; thoát khi xoá hoàn tất        JMP HERE             ; trở về lại từ đầu; -------------------------------------------------------------- END; -------------------------------------------------------------- 

  

BÀI TẬP 3.1:

Viết chương trình điều khiển động cơ bước quay thuận với mỗi bươc quay là 5 độ (quay 1/2 bước).

Start :

          MOV           AL,1

          OUT             05

          MOV           AL,3

          OUT              05

          MOV           AL,2

          OUT              05

          MOV          AL,06

          OUT              05

          MOV          AL,04

          OUT              05

          MOV           AL,0C

          OUT              05

          MOV             08

          OUT                05

          MOV            AL,09

          OUT                05         

          JMP               Start

          END�

Chương trình sẽ ngắn hơn khi sử dụng bảng dữ liệu.

BÀI TẬP 3.2:

Viết chương trình điều khiển động cơ bước quay thuận 90 độ; nghịch 35 độ sau đó dừng lại.

Giải tương tự như bài 3.1 nhưng dừng ở 1/2 bước cuối lúc quay nghịch 35 độ.

  

 

 BÀI TẬP 4.1:

            Ở đây ta sử dụng port 04, gửi giá trị FF đến thanh ghi AL để xác lập lại rắn. Lên, xuống bên trái và bên phải được điều khiển bởi 4 bit trái. Bốn bit phải điều khiển quãng đường di chuyển.

Chương trình:

ORG    30        ;bảng dữ liệu để rắn chạy trong ma trận: thiết bị lái

DB        4F       ;xuống 0B

DB        1D       ;phải 3

DB        8B       ;lên 8

DB        1D       ;phải 3

DB        4E        ;xuống 6

DB        1E        ;phải 3

DB        8E        ;lên 9

DB        2F        ;trái 5

DB        8C        ;lên 3

DB        1F         ;phải 8

DB        4E         ;xuống 0C

ORG     40          ;bảng dữ liệu để rắn chạy trong ;ma trận: khoảng cách

DB        0B         ;xuống 0B

DB        3            ;phải 3

DB        8            ;lên 8

DB        3            ;phải 3

DB        6            ;xuống 6

DB        3            ;phải 3

DB        9            ;lên 9

DB        5            ;trái 5

DB                3            ;lên 3

                        DB        8            ;phải 8

DB        0C         ;xuống 0C

START:

MOV      AL,FF

OUT             04

MOV      CL,30

MOV      DL,40

MORE:

 MOV      AL,[CL]

  MOV      BL,[DL]

  CMP        AL,0

  JZ            START

REP:

        OUT           04

        DEC           BL

        JNZ            REP

        INC           CL

        INC           DL

        JMP     MORE

END

 

 

BÀI TẬP 4.2

        Gợi ý lập trình tương tự bài tập 11.3, thay thế hai chương trình thành phần bằng chương trình điều khiển rắn trong mê cung và đóng điên lò sấy.

    

BÀI TẬP 5 

       Hãy viết chương trình đều khển thang máy theo các nút nhấn lên xuống có trong giao diện phần cứng ở port 06.

;Chương trình điều khiển thang máy

MOV     AL,0

OUT         06

LOOP:

IN             06                             ;kiểm tra thang máy tại đỉnh hầm thang máy

PUSH       AL

POP         BL

AND         BL,5                     ;kiểm tra động cơ và nút nhấn đi lên

CMP         BL,5

JZ             StopTop

 

IN             06                     ;kiểm tra vị trí dưới hầm thang máy

PUSH         AL

POP           BL

AND         BL,A         ;kiểm tra động cơ và công tắc nhấn đi xuống

CMP         BL,A

JZ             StopBot

 

PUSH        AL

POP         BL

AND        BL,10               ; kiểm tra nút gọi xuống

JNZ     CallDown

 

PUSH       AL

POP          BL

AND         BL,20               ; kiểm tra nút gọi lên

JNZ     CallUp

                                 JMP      LOOP

 StopTop:

AND         AL,DE        ; ngừng môtơ và nút gọi

OUT          06

JMP      LOOP

StopBot:

AND          AL,ED         ;ngừng môtơ và nút gọi

OUT           06

JMP      LOOP

 CallDown:

IN              06                       ;thang máy đã sẵn sàng đi xuống chưa?

AND          AL,8

CMP          AL,8

JZ              errDown       ;không khởi động môtơ

MOV     AL,12

OUT          06

JMP      LOOP

errDown:

MOV      AL,0

OUT            06

JMP       LOOP

CallUp:

IN                 06                               ; thang máy đã sẵn sàng đi lên chưa?

AND             AL,4

CMP             AL,4

JZ              errUp                                                    ; không khởi động môtơ

MOV      AL,21

OUT            06

JMP       LOOP

errUp:

MOV       AL,0

OUT             06

JMP       LOOP

END

 

BÀI TẬP 6

        Hãy viết chương trình không chế nhiệt độ lò sấy theo nguyên lý so sánh cửa sổ để nhiệt độ lò được không chế ở 20 độ C.

;Chương trình bật tắt lò sấy

MOV     BL,80

PUSH       BL

Main:

POP         AL

XOR     AL,80

PUSH      AL

OUT         03             ; gởi dữ liệu đến lò sấy

MOV     AL,30          ; trì hoãn 30 lần

CALL       90             ; gọi thủ tục trì hoãn

;----------------------------------------------------------------------------------------

;chạy vòng lập này 20 lần

MOV     CL,20 ;coi thanh ghi CL như một bộ đếm

Bang:

DEC         CL

JZ             Main

IN             03

CMP         AL,80

JZ             turnOn

CMP         AL,81

JZ             turnOff

CMP         AL,0

JZ             turnOn

turnOff:

MOV     AL,0

OUT         03

JMP      Bang

turnOn:

MOV     AL,80

OUT         03

JMP     Bang

;-------------------------------------------------------------------------------------

      ORG          90     ; thời gian trì hoãn được định bởi giá trị trong AL

PUSH       AL

delay:

DEC         AL

JNZ     delay

POP         AL

RET

;--------------------------------------------------------------------------------------

END

 

 

BÀI TẬP 7.1:

Thiết kế chương trình đếm tuần tự liên tục từ 0 đến 9 hiển thị trên LED 7 đoạn bên phải.

BÀI TẬP 7.2

 Thiết kế hai chương trình đếm độc lập nhau :

  • LED trái hiển thị theo số xung Clock của CPU.
  • LED phải hiển thị theo số xung phát ra bởi bộ định thời ngắt phần cứng.

; Chương trình hiển thị Led 7 đoạn

Jmp Start                    ; Nhay qua bang du lieu.

 

            DB            30              ; Vector dinh thoi ngat phan cung 

                                               ; chi toi ma tai [30]

            DB            FA            ; Bang du lieu bat dau tai dia chi[03]

            DB            0A

            DB            B6

            DB            9E

            DB            4E

            DB            DC

            DB            FC

            DB            8A

            DB            FE

            DB            CE            ; nhap du lieu cuoi vao.

 

            DB            03            ; vi tri RAM nay chi toi bang du lieu Location points to the data

                                            ; ma ngat su dung dia chi nay de kiem tra viec no thuc hien suot

                                            ; bang du lieu .

; --------------------------------------------------------------

; CHUONG TRINH CHINH

 

Start:

            STI                  ; Cho phep cac ngat dinh thoi phan cung

            MOV   BL,03            ; BL chua dia chi bat dau cua bang du lieu

Rep:

            MOV   AL,[BL]        ; chuyen du lieu tu bang vao AL

            OUT    02                 ; chuyen du lieu ra hien thi

            CMP    AL,CE          ; kiem tra gia tri cuoi trong bang

            JZ        Start              ; neu gia tri den cuoi thi nhay ve Start

            INC     BL                ; chi den vi tri ke tiep

            JMP     Rep              ; nhay ve va thuc thi tri so ke

; --------------------------------------------------------------

; INTERRUPT HANDLER. 

 

            ORG      30            ; ma bat dau tai dia chi [30]

 

            PUSH    AL            ; luu AL vao ngan xep

            PUSH    BL            ; luu BL vao ngan xep

            PUSHF                   ; luu co CPU vao ngan xep

 

            MOV      BL,[0D]        ; vi tri RAM 0D chua con tro chi den bang du lieu

            MOV      AL,[BL]        ; tim du lieu tu bang

            OR         AL,1            ; thiet lap LSB len 1.

            OUT       02               ; chuyen du lieu ra hien thi

            CMP       AL,CF       ; kiem tra gia tri cuoi cung

            JZ            Reset          ; nhay ve reset

            INC       BL                ; vi tri ke tiep trong bang

            MOV     [0D],BL          ; luu vi tri nay vao RAM

            JMP       Done            ; nhay ra khoi vong lap

Reset:

            MOV     BL,03            ; 03 la dia chi bat dau cua bang

            MOV     [0D],BL          ; luu con tro nay vao RAM

Done:                         

            POPF                          ; khoi phuc cac co CPU tu ngan xep

            POP            BL            ; khoi phuc BL tu ngan xep

            POP            AL            ; khoi phuc AL tu ngan xep

            IRET               ; ngat

; --------------------------------------------------------------

            END

           

 

 

Sau khi xem qua các bài giải

   CPU:

CPU là nơi thực hiện tất cả các phép toán số học và logic.

CPU là nơi có thể lưu trữ các vùng gọi là các thanh ghi ; CPU chứa các cờ, các cờ này dùng để xác định kết qủa là số (-), số 0 hoặc số bị tràn, sẽ thu nhận được nhiều tin tức hơn nếu có sự mô tả cấu trúc của hệ thống.

Thanh ghi bao gồm các tên : AL, BL, CD và DL, lần lượt có mã� là 00, 01, 02 và 03. Các thanh ghi được sử dụng để lưu trữ số nhị phân.

           Các con số được lưu trữ trong thanh ghi có thể được tạo ra từ phép toán số học và logic học, từ đó chuyển các mã nhị phân ra các thiết bị ngoại vi như điều khiển đèn giao thông. 

   Chú thích: Chương trình khi bắt đầu thường có lời chú thích .

          Những lời chú thích được sử dụng như là tài liệu trong một chương trình. Nó tiện ích trong các chương trình mới tạo ra vì người viết có thể quên các bước của chương trình.

          Lời chú thích hay là lời chú thích giải thích tại sao các việc sắp xảy ra, xảy ra như thế nào, lời chú thích không hay khi lặp lại qúa nhiều lần một việc vừa đơn giản lại vừa dễ hiểu.

   Ðịa chỉ RAM: Eg [ 7F  ] [ 22 ] [ AL ] [ CL ]

[ 7F ] : có nghĩa là chứa nội dung ô nhớ 7F thuộc RAM .

[ CL ]: có nghĩa lànội dung được chuyển đến từ thanh ghi CL .

 

   AND: nhân hai giá trị nhị phân

Ví dụ:

AND AL,12  ; thực hiện phép AND giữa AL và số 12,kết quả lưu vào AL

AND BL,CL ; thực hiện phép AND giữa CL và BL ,kết quả lưu vào BL

Mã máy tương ứng :

BA     00    12 ;AND 12 vcà Al , kết quả lưu vào AL

AA     00    02 ;AND CL và BL , kết quả lưu vào BL

 

Qui luật của phép AND :

Chỉ duy nhất trạng thái 1 AND 1 sẽ ra kết quả là 1, các trường hợp còn lại đều ra kết quả là 0.

Ví du� :

                   10101010

AND           00001111

Kết quả:      00001010

Lưu ý : 1 AND 1=1,4 bit bên trái sẽ có kết quả là 0

 

   LỆNH CALL VÀ RET: được sử dụng với các thủ tục

Không sử dụng các loại cờ trong CPU .

Ví dụ :

CALL 50              ; gọi thủ tục ở địa chỉ 50

Mã máy tương ứng

CA    50                ; gọi thủ tục ở địa chỉ 50

CPU chuyển lệnh con trỏ có giá trị  IP+2 vào ngăn xếp ,sau đó CPU sẽ quay lại địa chỉ này .

Lệnh con trỏ trong CPU sẽ được đặt ở địa chỉ 50, CPU tiếp tục thi hành các lệnh từ 50 đến khi gặp lệnh RET, sau đó giá trị được chuyển ra khỏi ngăn xếp bởi lệnh IP rồi chuyển đến địa chỉ 50 để tổng kết các công việc đã thực hiện.

 

    LỆNH CLI VÀ STI: được sử dụng với các ngắt

CLI : Xoá cờ "I" trong thanh ghi trạng thái

STI : Ðặt cờ "I" của lệnh ngắt trong thanh ghi trạng thái

Mã máy của CLI là FP ,mã máy của STI là FC

Nếu đặt cờ I thì CPU sẽ thực hiện việc ngắt

Sau đó bộ mô phỏng sẽ thực hiện việc ngắt phần cứng trong khoảng thời gian người viết chương trình mong muốn

Nếu đặt cờ "I" vào ,tại địa chỉ [02] thực hiện 1 vector ngắt thì CPU sẽ nhảy đến mã - nơi cần thực hiện việc ngắt đó.

 

      LỆNH CLO:  đóng các cửa sổ không cần thiết

CLO không sử dụng các cờ trong CPU ,mã máy của CLO là FE

CLO không thực hiện được trong chip 86. Khi sử dụng lệnh CLO thì cửa sổ các chuơng trình không sử dụng đến sẽ được đóng lại thay vì phải dùng chuột để đóng từng cửa sổ một.

 

           LỆNH CMP : so sánh

Lệnh CMP sử dụng các cờ trong CPU

Ví dụ: 

                               CMP         AL    ,OD          ; so sánh AL với OD

Mã máy tương ứng

                              DB             OO    OD          ; so sánh AL với OD

Nếu các gía trị so sánh có :

  •     Bằng nhau thì đặt cờ "Z"
  •     AL nhỏ hơn BL thì đặt cờ"S"
  •     AL lớn hơn BL thì không có cờ nào

    Ví dụ :             

          CMP CL,[20]                ; so sánh CL với 20

Mã máy tương ứng

          DC    02      20 

 Nếu các gía trị so sánh có :

Bằng nhau thì đặt cờ "Z"

CL có nội dung nhỏ hơn nội dung có trong địa chỉ 20 thì đặt cờ S .

CL  có nội dung lớn hơn nội dung có trong địa chỉ 20 thì không đặt cờ.

 

    LỆNH DB: định nghĩa byte

          Lệnh DB không sử dụng các cỡ trong CPU.

DB là một cách gởi trực tiếp các giá trị vào RAM, lệnh DB không có mã máy .

Những con số và dòng chữ sau DB điều được chuyển vào RAM.

          DB    22  ;  Ðây là một bảng dữ liệu được chuyể tủ vào RAM

          DB    33

          DB    44

          DB    0

          DB    "Hello world"; Mã ASCII của dòng chữ được chuyển vào RAM

DB    0        ; Kết thúc dòng chữ thì sử dụng lên NULL.

 

    Lệnh DEC và INC         : Tăng lên 1 và giảm đi 1

Lệnh DEC và INC thiết lập cờ trong CPU

 

   LỆNH DIV VÀ MOD:

Có các lệnh DIV từ chip  x86, nhưng lệnh MOD thì không có trong chip x86.

Chip  x86 : Lệnh DIV thực hiện cả hai công việc là: Div và MOD, kết qủa x2 lưu vào các thanh ghi khác nhau. Việc tách và đơn giản đối với 8 bit trong bộ mô phỏng khi sử dụng Mod và Div thì không thể thực hiện được .

8 DIV 3 bằng 3 (nhớ 2 )

8 MOD 3 bằng 2.

Ví dụ:        

DIV   AL,5           ; chiaAL cho 5; kết qủa lưu vào AL

          DIV   AL,BL        ; chia AL cho BL, kết qủa lưu vào AL

          MOD AL,5           ; Mod AL cho 5, kết qủa: phần dư đưa vào AL

          MOD AL,BL        ; Mod AL cho BL, phần dư chuyển vào AL

Mã máy :   

B3     00      05      ; chia AL cho 5, kết quả lưu vào AL

       A5     00      01      ; chia AL cho BC, kết quả lưu vào AL

       B6     00      05      ; Mod AL cho 5, kết quả lưu vào AL ( phần dư )

       A6     00      01      ; Mod AL cho BL, kết quả : phần dư đưa vào AL

 

 

    LỆNH END : không thiết lập các cờ trong CPU

END : dừng chương trình đang thực hiện. Mã máy của END và HALT là 00. bộ mô phỏng thực hiện được việc này do việc sử dụng đến hoạt động ngừng dao động trong CPU. Trình biên dịch sẽ không thực hiện việc biên dịch sau khi gặp lệnh END .

Trong 1 chương trình chỉ sử dụng 1 lệnh END duy nhất.

 

    LỆNH HALT: không thiết lập các cờ trong CPU

HALT : dừng chương trình đang thực hiện, mã máy lệnh HALT là 00. Bộ mô phỏng thực hiện được điều này khi CPU ngừng hoạt động. Có thể sử dụng vào lệnh HALT trong 1 chương trình.

 

    LỆNH  IN VÀ OUT : xuất - nhập

Giao tiếp với thiết bị ngoại vi , không thiết lập các cờ trong CPU

Lệnh xuất - nhập được sử dụng bởi các port

Ví dụ :   

MOV   AL,55       ; chuyển gia trị 0101 0101 vào AL

                   IN       01             ; gởi gía trị trên ra port 1

                   IN       03             ; được đọc từ port 3 chuyển qua AL

                   IN       00             ; 00  là bàn phím           

Mã máy tương ứng :

          DO    00      55      ; chuyển 0101 0101 vào AL

               F1     01               ; gởi 0101 0101 đến port 1 ( điều khiển đèn giao thông)

FO     03               ; được đọc từ port 3 vào AL

FO     00               ; 00 nhập từ bàn phím

 

    Lệnh INT và IRET : Sử dụng với các ngắt

Lệnh INT và IRET không thiết lập cờ tràn.

Ví dụ:    

INT   02      ;gọi lệnh ngắt

;bắt đầu bằng địa chỉ đã được lưu trữ

;tại địa chỉ 02, các địa chỉ 00 đến OF có thể sử ;dụng như vector ngắt

                   IRET          ;quay trở lại vị trí ngắt

Mã máy tương ứng

          CC    02      ; gọi việc ngắt.

                   CD              ; quay trở lại việc ngắt.

CPU đẩy gía trị IP + 2 bởi con trỏ lệnh vào ngăn xếp. Sau đó CPU sẽ quay trở lại địa chỉ này. Lệnh con trỏ được đặt vào địa chỉ này đến khi gặp lệnh IRET. CPU sẽ chuyển dữ liệu ra khỏi ngăn xếp nhờ lệnh từ địa chỉ này đến khi gặp lệnh IRET. CPU sẽ chuyển dữ liệu ra khỏi ngăn xếp nhờ lệnh IP và chuyển đến địa chỉ nơi mà nó đang thực hiện.

 

    Lệnh JMP

Ðặt một giá trị mới vào IP, không thiết lập các cờ trong CPU.

Ví dụ :    JMP  FOO           ; nhảy đến địa chỉ nhãn FOO.

Mã máy tương ứng

                   CO    12               ; nhảy 12 vị trí .

                   CO    FE               ; quay lại 12 vị trí .

Lệnh JMP thực hiện được nhờ việc cộng thêm 1 số vào lệnh IP. Số này có thể nằm trong khoảng - 128 đến 127, việc này xác định độ dài nhất có thể.

Lệnh JMP : nhảy không điều kiện, JMP không sử dụng trong CPU.

 

    Lệnh JNO: Jmp Not Overflow

JNO không thiết lập cờ CPU.

Ví dụ:

JNO    FOO         ; nhảy đến địa chỉ có nhản FOO

Mã máy tương ứng

                   C6     12      ; nhảy 12 khoảng cách

                   C6     FE     ; quay lại 2 khoảng cách

JNO làm việc bằng cách cộng 1 số vào CPU nhờ con trỏ lệnh IP , số này có thể đi từ -128. - . +127. Ðây là khoảng cách lớn nhất mà lệnh nhảy có thể thực hiện

JNO sẽ thực hiện nếu cờ " O"  trong CPU không đặt vào.

         

    Lệnh JNS : Jump Not Sign

JNS không thiết lập cờ CPU.

Ví dụ :    JNS   FOO ; nhảy về địa chỉ có nhãn FOO

Mã máy tương ứng

                   C4     12      ; nhảy 12 khoảng cách

                   C4     FE     ; quay lại 2 khoảng cách

     JNS làm việc bằng cách cộng thêm 1 số vào CPU nhờ con trỏ lệnh, số này có thể chuyển đổi từ -128 đến -127 , đây là khoảng cách lớn nhất có thể nhảy .

    Lệnh JNZ : Jump Not Zero

JNZ không thiết lập cờ CPU.

Ví dụ :   

JNZ       FOO       ; nhảy về nhãn FOO

Mã máy tương ứng

                   C2     12      ; nhảy 12 khoảng cách

                   C2     FE     ; quay lại 2 khoảng cách

JNZ làm việc dựa trên nguyên tắc tăng thêm 1 vào CPU nhờ con trỏ lệnh IP. Con số này thay đổi từ -128 đến +127, đây là khoảng cách lớn nhất có thể của lệnh nhảy.

JNZ sẽ thực hiện việc nhảy nếu cờ"Z" trong CPU không đặt vào

 

    Lệnh JO :

 Nhảy khi gặp sự tràn.

 JO không thiết lập cờ CPU.

Ví dụ:        

                   JO     FOO    ; nhảy đến địa chỉ nhãn FOO.

Mã máy tương ứng :

                   C5     12        ; nhảy 12 khoảng cách

                   C5     FE       ; quay lại hai khoảng cách.

          JO làm việc dự trên nguyên tắc tăng thêm một vào CPU nhờ con trỏ lệnh IP. Con số này thay đổi từ -128 đến +127 , đây là khoảng cách có thể nhảy lớn nhất.

JO sẽ thực hiện việc nhảy nếu trong CPU có đặt cờ "O".

 

    Lệnh JS:  Jump Sign

JS không thiết lập cờ CPU.

 Ví dụ :

     JS      FOO ; nhảy đến địa chỉ nhãn FOO

Mã máy tương ứng

C3     12     ; nhảy 12 khoảng cách

C3     FE    ; quay về lại hai khoảng cách.

JS làm việc dựa trên nguyên tắc tăng thêm một vào CPU nhờ IP. Con số này thay đổi từ -128 đến +127, đây là khoảng cách lớn nhất có thể nhảy.

 

    Lệnh JZ ( Jump Zero )

JZ không thiết lập cờ CPU.

Ví dụ :   

JZ      FOO  ; nhảy về địa chỉ nhãn FOO

Mã máy tương ứng

          C1     12      ; nhảy 12 khoảng cách

          C1     FE     ; quay lại hai khoảng cách

JZ làm việc dựa trên nguyên tắc tăng thêm một vào CPU, nhờ con trỏ lệnh. Con số này thay đổi từ -128 đến +127, đây là khoảng cách lớn nhất mà lệnh nhảy có thể thực hiện.

Lệnh  JZ sẽ thực hiện việc nhảy nếu cờ Z" được đặt vào CPU.       

 

    Lệnh MOV

Chuyển dữ liệu từ nơi này đến nơi khác.

Ví dụ :       

MOV   AL, 12     ; chuyển 12 hex vào AL

          MOV   BL, [2F]  ; chuyển nội dung trong ô nhớ [2F] vào BL

          MOV   [33], CL  ; chuyển dữ liệu từ thanh ghi CL vào ô nhớ [33]

          MOV   AL, [DL]; chuyển nội dung trong thanh ghi DL vào một ;vùng nhớ, từ vùng nhớ đó chuyển vào AL.

          MOV [BL], CL  ; chuyển nội dung trong thanh ghi BL vào ô nhớ ;có địa chỉ trong thanh ghi CL.

Mã máy tương ứng

          DU    00      12 ; chuyển 12 hex vào AL

          D1     01      2F ; chuyển nội dung ô nhớ 2F vào BL

          D2     33      02; chuyển dữ liệu từ CL đến ô nhớ [33]

          D3     00      03; chuyển dữ liệu từ DL đến ô nhớ, chuyển ô nhớ ; đến AL.

          D4     02      03; chuyển dữ liệu từ BL đến ô nhớ, sau đó chuyển ; ô nhớ đến CL.

 

    LỆNH MUL ( NHÂN - MULTIPLY )

Các lệnh MUL khác được thực hiện tại chip X86.

Lệnh X86 Mul đưa kết quả vào nhiều thanh ghi. Bộ mô phỏng không thể thực hiện lệnh MUL 8 bit một cách đơn giản được. Lệnh này bất lợi khi việc xuất hiện cờ tràn quá nhiều lần.

Ví dụ :   

MUL AL, 5 ; thực hiện nhân AL cho 5, kết qủa chuyển vào thanh ghi AL

Mã máy tương ứng

B2     00      05      ; nhân AL  với  5 ,kết quả chuyển vào AL

          A2     00      01      ; nhân AL với B2, kết qủa chuyển vào AL.

 

    LỆNH NOP: (No Operation) -  Không làm gì.

Khi gặp lệnh này , CPU sẽ ngưng làm việc trong 1 chu kỳ xung. Việc này rất cần thiết vi cần có khoảng thời gian để tạo sự đồng bộ giữa CPU và các mạch điện tử . CPU ngưng làm việc trước khi các mạch điện tử hiểu được câu lệnh . Mã máy của lệnh NOP là FF .

 

    LỆNH NOT

Ðảo ngược tất cả các bit .

Ví dụ:    

NOT      CL     ; đảo ngược các bit trong thanh ghi CL

Mã máy tương ứng

AD         02      ; đảo ngược các bit trong CL

Nếu CL chứa dữ liệu 01010101 trước khi sử dụng lệnh NOT thì không có gì thay đổi nhưng khi gặp lệnh NOT nó sẽ trở thành 10101010   

 

    LỆNH OR    

Dùng để OR 2 giá trị nhị phân.

Ví dụ :   

OR    AL, 12  ; OR 12 với AL, kết quả đưa vào AL

                   OR    BL, CL ; OR CL với BL, kết quả đưa vào BL

Mã máy tương ứng

                   BB    00   12 ; OR 12 với AL, kết quả đưa vào AL

                   AB    01   02 ; OR         CL với BL, kết quả đưa vào AL

Quy luật của lệnh OR : hai ngõ vào bằng 0 sẽ đưa ra kết quả là 0, các ngõ vào còn lại đều cho kết quả bằng 1. Ví dụ :

        10101010

or     00001111

kết quả      10101111

0 hoặc 0 = 0  4 bit phải ra kết quả là 1

 

 

    LỆNH ORG

     Ðặt mã gốc

                   ORG 50      ; mã được phát sinh từ địa chỉ 50

ORG không là một lệnh thuôc CPU. Nó là loại lệnh được đưa ra từ trình biên dịch có mã được phát sinh từ một địa chỉ đặc biệt, được sử dụng trong thủ tục và ngắt ORG được sử dụng trong các bộ nhớ đặc biệt như bảng dữ liệu, ở bảng dữ liệu thì không có mã máy tương ứng.

 

    LỆNH PUSH VÀ POP 

Lệnh ngăn xếp.

PUSH dùng lưu trữ một byte vào ngăn xếp, POP lấy ra khỏi ngăn xếp. Ngăn xếp là một vùng nhớ tuân theo quy luật LIFO. Nhăn xếp dùng để :

                   + Tạo  sự quay trở lại của lệnh gọi thủ tục

                   + Tạo sự quay trở lại địa chỉ của lệnh ngắt

                   + Gởi các tham số vào trong các thủ tục

                   + Nhận kết quả được lấy từ các thủ tục

                   + Lưu, phục hồi các thanh ghi và các cờ.

                   + Ðảo ngược thứ tự của dữ liệu

Ví dụ :       

PUSH         AL ; lưu AL và đưa vào ngăn xếp

                   POP  AL ; phục hồi AL được đưa ra từ ngăn xếp

Mã máy tương ứng

                   EO    00  ; lưu AL vào ngăn xếp

                   E1     00  ; phục hồi AL từ ngăn xếp

 

   LỆNH PUSHF, POPF

PUSHF : không thiết lập cờ CPU.

POPF : thiết lập cờ CPU

Ngăn xếp là vùng nhớ đặc biệt làm việc theo quy luật LIFO. Ngăn xếp có các công dụng :

                   + Tạo sự quay lại địa chỉ của lệnh gọi thủ tục.

                   + Tạo sự quay lại địa chỉ của lệnh ngắt.

                   + Gởi các tham số vào thủ tục.

                   + Lưu, phục hồi các thanh ghi và các cờ.

                   + Ðảo ngược thứ tự của dữ liệu.

Ví dụ :     PUSHF       ; lưu cờ trong CPU đưa vào ngăn xếp

                   POPF                   ; phục hồi cờ trong CPU đưa vào ngăn xếp

Mã máy tương ứng

                   EA              ; lưu cờ trong CPU chuyển ra ngăn xếp

                   EB              ; phục hồi cờ trong CPU chuyển ra ngăn xếp.

 

    LỆNH  ROL và ROR : Rotate all bits to the Right và Left.

Xoay bit sang trái, phải.

Ví dụ :   

ROL  AL ; xoay trái các bit một vị trí

                   ROL  DL ; xoay phải các bit một vị trí

Mã máy tương ứng

                   9A     00 ; xoay trái các bit một vị trí

                   9B     03 ; xoay phải các bit một vị trí

Sau khi xoay xong một bit thì chuyển đến xoay các bit còn lại cho đến hết.

-         Trước khi xoay      : 10000110

-         Sau khi xoay trái   : 00001101

-         Trước khi xoay      : 10000110

-         Sau khi xoay phải : 01000011

 

    LỆNH SHL VÀ SHR : Shift (Logically) Right và Left.

   Chuyển dịch các bit sang phải, trái .

SHL và SHR thiết lập cờ CPU.

 

Ví dụ :

SHL  AL    ; dịch các bit sang trái một vị trí

                   SHR  DL    ; dịch các bit sang phải một vị trí

          - Trước khi xoay : 10000110

          - Sau  khi xoay trái        : 00001100

          - Trước khi xoay  : 10000110

          - Sau khi xoay               : 01000011

 

    LỆNH SUB (Substract)

 Trừ 2 toán hạng.

  SUB không thiết lập cờ CPU

Ví dụ :       

SUB  AL, 12 ; trừ 12 trong thanh ghi AL, kết quả lưu vào AL.