Bài giảng Cấu trúc máy tính - Chương 6: Toán tử. Toán hạng. Các phép định địa chỉ . Tập lệnh
Mục tiêu
Hiểu cách dùng toán tử trong ASM.
Nắm được tập lệnh của CPU 8086/8088.
Biết cách định địa chỉ thông qua toán hạng.
Biết vận dụng các kỹ năng trên vào vấn đề cần giải quyết và hiện thực thành chương trình.
ịnh vị bằng thanh ghi Toán hạng là Reg Lệnh sẽ được thực hiện nhanh hơn 11/9/2021 13 Chuong 7 Cac phep dinh vi dia chi Toán hạng tức thời là dữ liệu 8 bit hay 16 bit nằm ngay trong câu lệnh. Dữ liệu xử lý được lưu ngay trong lệnh Ex : MOV CL, 61h ; toán hạng tức thời Mã máy của lệnh trên là B161h ĐỊNH VỊ TỨC THỜI Lệnh sẽ được thực hiện nhanh vì dữ liệu được lấy cùng với lệnh. 11/9/2021 14 Chuong 7 Cac phep dinh vi dia chi ĐỊNH VỊ THANH GHI Giá trị của tốn hạng được truy xuất nằm ngay trong thanh ghi của CPU. Ex : MOV AX,BX ; chuyển nội dung của thanh ghi BX vào thanh ghi AX 11/9/2021 15 Chuong 7 Cac phep dinh vi dia chi Định vị gián tiếp thanh ghi : địa chỉ toán hạng không chứa trực tiếp trong lệnh mà gián tiếp thông qua một thanh ghi. ĐỊNH VỊ BỘ NHỚ Lấy dữ liệu từ vùng nhớ Ex : SUB DX, [BX] ; Khác với lệnh SUB DX, BX Trong chế độ này, địa chỉ Offset của ơ nhớ chứa nộI dung của tốn hạng nằm trong các thanh ghi BX,BP,SI,DI. Địa chỉ segment ngầm định chứa trong DS nếu dùng BX,SI,DI Địa chỉ segment ngầm định chứa trong ES nếu dùng BP 11/9/2021 16 Chuong 7 Cac phep dinh vi dia chi EX1 : MOV AX, [SI] Nạp nội dung của ơ nhớ mà địa chỉ Offset lưu trong BP và địa chỉ đoạn lưu trong ES vào AX. EX2 : MOV AX, [BP] Nạp nội dung của ơ nhớ mà địa chỉ Offset lưu trong SI và địa chỉ đoạn lưu trong DS vào AX. Định vị gián tiếp thanh ghi : 11/9/2021 17 Chuong 7 Cac phep dinh vi dia chi ĐỊNH VỊ TRỰC TIẾP Địa chỉ Offset của ơ nhớ chứa dữ liệu tốn hạng nằm trực tiếp trong câu lệnh cịn địa chỉ segment ngầm định chứa trong DS. Ex : MOV BX, [1234] Nạp nộI dung ơ nhớ cĩ địa chỉ DS:1234 BX 11/9/2021 18 Chuong 7 Cac phep dinh vi dia chi ĐỊNH VỊ CƠ SỞ Địa chỉ Offset của tốn hạng được tính là tổng của nộI dung thanh ghi BX hoặc BP và 1 độ dịch. Độ dịch là 1 số nguyên âm hoặc dương. Địa chỉ đọan là đoạn hiện tại. 11/9/2021 19 Chuong 7 Cac phep dinh vi dia chi ĐỊA CHỈ HIỆU DỤNG Toán hạng bộ nhớ dùng trong tập lệnh vi xử lý 86 sử dụng phương pháp định địa chỉ tổng hợp được gọi là địa chỉ hiệu dụng. Địa chỉ hiệu dụng là tổ hợp của 3 nhóm sau đặt trong dấu [ ]. Nhóm thanh ghi chỉ số : SI , DI Nhóm thanh ghi nền : BX, BP Địa chỉ trực tiếp : số 16 bit Các thanh ghi trong cùng 1 nhóm không được xuất hiện trong cùng 1 địa chỉ hiệu dụng. 11/9/2021 20 Chuong 7 Cac phep dinh vi dia chi ĐỊA CHỈ HIỆU DỤNG Địa chỉ hiệu dụng hợp lệ : Một số thí dụ [1000h] [SI], [DI] , [BX] , [BP] [SI+BX], [SI+BP] , [DI+BX] , [DI+BP] , [SI+1000h], [DI+100h] [SI] [BX] [1000h], [SI+BP+1000h] , [DI+BX][1000h], [DI+1000h]+[BP] Địa chỉ hiệu dụng không hợp lệ : [70000], [AX] , [SI+DI+1000h], [BX] [BP] 11/9/2021 21 Chuong 7 Cac phep dinh vi dia chi ĐỊA CHỈ HIỆU DỤNG (tt) Địa chỉ hiệu dụng chính là phần offset của địa chỉ luận lý bộ nhớ. Segment của địa chỉ hiệu dụng được mặc định như sau :nếu không sử dụng BP trong địa chỉ hiệu dụng thì mặc định theo DS.nếu có sử dụng BP trong địa chỉ hiệu dụng thì mặc định theo ES. 11/9/2021 22 Chuong 7 Cac phep dinh vi dia chi Địa chỉ hiệu dụng (tt) Qui ước Để thuận tiện trong vấn đề giải thích lệnh, ta qui ước sau : Dữ liệu 8 bit bộ nhớ : [ địa chỉ ] Dữ liệu 16 bit bộ nhớ : [ địa chỉ +1, địa chỉ ] Để xác định rõ hoạt động của bộ nhớ , ta phải dùng thêm toán tử PTR như sau : 8 bit : BYTE PTR [1000H] Tham khảo 1 byte bộ nhớ ở địa chỉ 1000h 16 bit : WORD PTR [1000H] Tham khảo 2 byte bộ nhớ liên tiếp ở địa chỉ 1000h và 1001h 11/9/2021 23 Chuong 7 Cac phep dinh vi dia chi Ex : Tính tổng 1 array có 5 phần tử MOV BX, OFFSET LIST MOV AX, 0 MOV AL, [BX] ADD AL , [BX+1] ADD AL , [BX+2] ADD AL , [BX+3] ADD AL , [BX+4] MOV SUM , AX LIST DB 10h, 20h, 40h, 2h, 5h SUM DW 0 Cách thực hiện : Lấy địa chỉ của List vào BX Dựa vào BX để xác định các phần tử của array. Khi tính tổng xong, đưa tổng vào biến SUM. 11/9/2021 24 Chuong 7 Cac phep dinh vi dia chi Ex : Tính tổng 1 array có 5 phần tử A 100 MOV BX, 0120 MOV AX, 0 MOV AL, [BX] ADD AL , [BX+1] ADD AL , [BX+2] ADD AL , [BX+3] ADD AL , [BX+4] MOV [0125], AX -A 120 DB 10, 20, 40, 2, 5 DW 0 CHẠY CT này bằng DEBUG 11/9/2021 25 Chuong 7 Cac phep dinh vi dia chi Tập lệnh Lệnh MOV : Ý nghĩa : copy giá trị từ toán hạng nguồn toán hạng đích Cú pháp : MOV dest , source Yêu cầu : Dest và source cùng kiểu Dạng lệnh : MOV reg , reg MOV mem , reg MOV reg, mem MOV reg16, segreg MOV segreg, reg16 MOV reg, immed MOV mem, immed MOV mem16, segreg MOV segreg, mem16 11/9/2021 26 Chuong 7 Cac phep dinh vi dia chi Minh hoạ lệnh MOV MOV AX, CX MOV DL, BH MOV [SI+1000h], BP ; [SI+1000h, SI+1001h] BP MOV DX, [1000h] ; DX [1000h, 1001h] MOV DI, 12h MOV AL, 12h MOV BYTE PTR [1000h], 12h MOV WORD PTR [2000h] , 1200h MOV [BX] , DS MOV SS, [2000h] 11/9/2021 27 Chuong 7 Cac phep dinh vi dia chi Lệnh MOV không làm ảnh hưởng đến cờ. Không thể chuyển dữ liệu trực tiếp giữa 2 toán hạng bộ nhớ với nhau, muốn chuyển phải dùng thanh ghi trung gian. Không thể chuyển 1 giá trị tức thời vào thanh ghi đoạn, muốn chuyển phải dùng thanh ghi trung gian. Không thể chuyển trực tiếp giữa 2 thanh ghi đoạn Chú ý 11/9/2021 28 Chuong 7 Cac phep dinh vi dia chi Minh họa lệnh MOV Ex1 : Cho table là 1 mảng gồm 10 phần tử dạng byte Table DB 3,5,6,9,10, 29,30,46,45,90 Truy xuất phần tử đầu , phần tử thứ 2 và thứ 5 của mảng: MOV AL, TABLE hay MOV AL, TABLE[0] MOV AL, TABLE+1 hay MOV AL, TABLE[1] MOV AL, TABLE+4 hay MOV AL, TABLE[4] 11/9/2021 29 Chuong 7 Cac phep dinh vi dia chi Minh họa lệnh MOV Ex2 : MOV AX, DS : [100h] Ex3 : MOV AX, [100h] ; chuyển NỘI DUNG Ơ NHỚ 100h vào Reg AX. ; chép nội dung 16 bit tại địa chỉ 100h trong đoạn chỉ bởi DS vào Reg AX. 11/9/2021 30 Chuong 7 Cac phep dinh vi dia chi Áp dụng Viết chương trình chuyển nội dung vùng nhớ bắt đầu tại địa chỉ 700h sang vùng nhớ có địa chỉ bắt đầu là 1000h. Biết chiều mỗi vùng nhớ là 9 bytes và dữ liệu đang khảo sát trong đoạn được chỉ bởi DS. Cho vùng nhớ MEM có chiều dài 9 bytes gồm các ký tự ‘abcdefghi’ trong đoạn chỉ bởi DS. Viết chương trình đảo ngược vùng nhớ MEM. 11/9/2021 31 Chuong 7 Cac phep dinh vi dia chi Lệnh LEA (Load Effective Address) Cú pháp : LEA REG | MEM ý nghĩa : nạp địa chỉ Offset vào thanh ghi để khởi động Reg. Ex : MOV DX, OFFSET MES Tương đương với LEA DX, MES Ex : LEA BX, [1000h] ; BX 1000h LEA SI, [DI][BX][2000h] ; SI DI + BX + 2000h 11/9/2021 32 Chuong 7 Cac phep dinh vi dia chi Lệnh XCHG (XCHANGE) Cú pháp : XCHG DEST , SOURCE ý nghĩa : hoán chuyển nội dung 2 Reg, Reg và ô nhớ Yêu cầu : 2 toán hạng phải cùng kiểu 2 toán hạng không thể là 2 biến bộ nhớ. Muốn hoánđổi trị của 2 biến phải dùng Reg trung gian. Ex : XCHG AH, BL MOV VAR1, VAR2 ; không hợp lệ, phải dùng Reg tạm 11/9/2021 33 Chuong 7 Cac phep dinh vi dia chi Lệnh PUSH Cú pháp : PUSH REG16 PUSH MEM16 PUSH SEGREG Đẩy toán hạng nguồn 16 bit vào STACK Ex : PUSH DI ; [SS :SP+1, SS :SP] DI Ex : PUSH CS ; [SS :SP+1, SS :SP] CS 11/9/2021 34 Chuong 7 Cac phep dinh vi dia chi Lệnh POP Cú pháp : POP REG16 POP MEM16 POP SEGREG Lấy dữ liệu từ đỉnh STACK vào toán hạng địch. Ex : POP AX ; AX [SS :SP+1, SS :SP] Ex : POP [BX+1] ; [BX+2, BX+1] [SS :SP+1, SS :SP] 11/9/2021 35 Chuong 7 Cac phep dinh vi dia chi Lệnh IN Cú pháp : IN ACCUM, IMMED8 IN ACCUM, DX nhập dữ liệu từ cổng xuất nhập vào thanh ghi tích luỹ AL hay AX. Trường hợp AX sẽ nhập byte thấp trước, byte cao sau. Ex : IN AL ,61h IN AX, 40h Dạng lệnh có Reg DX dùng Để cho cổng có địa chỉ 16 bit Ex : MOV DX, 378H IN AL, DX 11/9/2021 36 Chuong 7 Cac phep dinh vi dia chi SUMMARY Dùng DEBUG để hợp dịch và chạy chương trình sau :Chép 3 số nguyên kiểu Word ở địa chỉ 0120h vào địa chỉ 0130h. Cho biết giá trị của AX sau khi các lệnh sau được thực thi : MOV AX, ARRAY1INC AXADD AH, 1SUB AX, ARRAY1 ARRAY1 DW 10h, 20h 11/9/2021 37 Chuong 7 Cac phep dinh vi dia chi SUMMARY Giả sử biến VAL1 ở địa chỉ offset 0120h và PTR1 ở địa chỉ 0122h. Cho biết giá trị của các thanh ghi AX, BX khi mỗi lệnh sau được thực thi : .CODE MOV AX, @DATA MOV DS, AX MOV AX, 0 MOV AL, BYTE PTR VAL1 ; AX = ? MOV BX, PTR1 ; BX = ? XCHG AX, BX ; BX = ? SUB AL,2 ; AX = ? MOV AX, PTR2 ; AX = ? .DATA VAL1 DW 3Ah PTR1 DW VAL1 PTR2 DW PTR1 11/9/2021 38 Chuong 7 Cac phep dinh vi dia chi Cho biết giá trị của các thanh ghi ở bên phải, khi mỗi lệnh của đoạn chương trình sau được thực thi. Giả sử FIRST ở offset 0H MOV AL, BYTE PTR FIRST+1 ; AL = MOV BX, WORD PTR SECOND+2 ; BX = MOV DX, OFFSET FIRST + 2 ; DX = MOV AX, 4C00H INT 21H . FIRST DW 1234h SECOND DW 16385 THIRD DB 10,20,30,40 11/9/2021 39 Chuong 7 Cac phep dinh vi dia chi Bài tập Lập trình Bài 1 : Viết chương trình nhập 1 ký tự. Hiển thị ký tự đứng trước và ký tự đứng sau ký tự đã nhập theo thứ tự mã ASCII. Kết quả có dạng : Nhập một ký tự : B Ký tự đứng trước : A Ký tự đứng sau : C Bài 2 : Viết chương trình nhập 2 ký tự và hiển thị ký tự thứ 3 có mã ASCII là tổng của mã 2 ký tự đã nhập. Kết quả có dạng : 11/9/2021 40 Chuong 7 Cac phep dinh vi dia chi
File đính kèm:
- bai_giang_cau_truc_may_tinh_chuong_6_toan_tu_toan_hang_cac_p.ppt