Kiến trúc và tổ chức máy tính - Chương 6: Lập trình hợp ngữ

1. Giới thiệu cấu trúc tập lệnh của CPU 2. Tập thanh ghi của 8086/8088 3. Các kiểu thao tác của tập lệnh 4. Tập lệnh họ 8086/8088

pdf31 trang | Chia sẻ: thuychi16 | Lượt xem: 1224 | Lượt tải: 1download
Bạn đang xem trước 20 trang tài liệu Kiến trúc và tổ chức máy tính - Chương 6: Lập trình hợp ngữ, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
bangtqh@utc2.edu.vn KIẾN TRÚC VÀ TỔ CHỨC MÁY TÍNH (Computer Organization and Architecture) Chương 6 Lập trình Hợp ngữ bangtqh@utc2.edu.vn Nội dung 1. Giới thiệu cấu trúc tập lệnh của CPU 2. Tập thanh ghi của 8086/8088 3. Các kiểu thao tác của tập lệnh 4. Tập lệnh họ 8086/8088 Chương 6 - Lập trình hợp ngữ 2 bangtqh@utc2.edu.vn 6.1. Giới thiệu tập lệnh của CPU Mỗi CPU có 1 tập lệnh xác định Tập lệnh có hàng chục hoặc hàng trăm lệnh. Intel 8086/8088 có tập lệnh khoảng 115 lệnh chia làm 5 nhóm Mỗi lệnh là một chuỗi số nhị phân mà CPU hiểu được và thực hiện 1 thao tác xác định Các lệnh được mô tả bằng ký hiệu gợi nhớ  Là các lệnh của hợp ngữ (Assembly) Chương 6 - Lập trình hợp ngữ 3 bangtqh@utc2.edu.vn Giản đồ trạng thái của Chu kỳ lệnh 4 Không kiểm tra ngắt TÝnh to¸n ®Þa chØ lÖnh Gi¶i m· thao t¸c lÖnh TÝnh to¸n ®Þa chØ to¸n h¹ng Xö lý d÷ liÖu TÝnh to¸n ®Þa chØ to¸n h¹ng NhËn lÖnh NhËn to¸n h¹ng CÊt to¸n h¹ng NhiÒu to¸n h¹ng NhiÒu kÕt qu¶ DL d¹ng x©u hoÆc vect¬ KÕt thóc lªnh, nhËn lÖnh tiÕp theo bangtqh@utc2.edu.vn Giản đồ trạng thái của chu kỳ lệnh 5 Có kiểm tra ngắt cuối mỗi chu kỳ lệnh TÝnh to¸n ®Þa chØ lÖnh Gi¶i m· thao t¸c lÖnh TÝnh to¸n ®Þa chØ to¸n h¹ng Xö lý d÷ liÖu TÝnh to¸n ®Þa chØ to¸n h¹ng NhËn lÖnh NhËn to¸n h¹ng CÊt to¸n h¹ng NhiÒu to¸n h¹ng NhiÒu kÕt qu¶ DL d¹ng x©u hoÆc vect¬ KÕt thóc lªnh, nhËn lÖnh tiÕp theo KiÓm tra ng¾t Ng¾t Kh«ng cã ng¾t bangtqh@utc2.edu.vn 6.2. Tập thanh ghi của 8086/8088  8086/8088 có 14 thanh ghi 16 bit chia làm 4 nhóm như hình vẽ  8086/8088 có bus địa chỉ 20 bit (1MB không gian địa chỉ)  sử dụng phương pháp đánh địa chỉ phân đoạn (segment addressing)  Địa chỉ vật lý = địa chỉ segment*16 + địa chỉ offset Chương 6 - Lập trình hợp ngữ 6 Nhóm thanh ghi đa năng Nhóm thanh ghi đoạn (segment) bangtqh@utc2.edu.vn Nhóm thanh ghi đa năng Còn gọi là nhóm thanh ghi công dụng chung (General purpose registers) Có thể dùng ½ mỗi thanh ghi như những thanh ghi độc lập 8086/8088 tự động sử dụng một số thanh ghi đa dụng vào một số mục đích cụ thể Chương 6 - Lập trình hợp ngữ 7 bangtqh@utc2.edu.vn Nhóm thanh ghi đoạn CS: chứa địa chỉ cơ sở đoạn mã lệnh của chương trình đang chạy DS: chứa địa chỉ đoạn của vùng dữ liệu chương trình đang thực hiện ES: (Extra segment) Chứa địa chỉ đoạn dữ liệu bổ sung (vùng chứa biến của chương trình) SS: Chứa địa chỉ bộ nhớ stack của chương trình đang chạy Chương 6 - Lập trình hợp ngữ 8 bangtqh@utc2.edu.vn Thanh ghi con trỏ và chỉ số  IP: (instruction pointer): luôn chỉ đến địa chỉ lệnh sắp được thi hành trong bộ do do CS đang trỏ tới  Cặp CS:IP chứa địa chỉ vật lý của lệnh trong bộ nhớ SP: luôn kết hợp với SS tạo thành cặp SS:SP để trỏ tới địa chỉ vùng nhớ stack của chương trình. SI và DI (Source index và Destination index): được thiết kế chuyên dụng trong các thao tác vận chuyển số liệu. Cặp DS:SI trỏ tới dữ liệu nguồn, ES:DI trỏ tới dữ liệu đích Chương 6 - Lập trình hợp ngữ 9 bangtqh@utc2.edu.vn Thanh ghi cờ của 8086/8088 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 X X X X OF DF IF TF SF ZF X AF X PF X CF Chương 6 - Lập trình hợp ngữ 10 bangtqh@utc2.edu.vn Ngắt (nhắc lại)  Ngắt là cơ chế mà BXL dừng chương trình đang thi hành để thực hiện 1 công việc khác – Ngắt cứng: thường xuất phát từ các thiết bị phần cứng ngoại vi, yêu cầu CPU giải quyết 1 công việc gì đó (vd: INT 2  báo sự cố phần cứng; INT 8: ngắt tín hiệu đồng hồ; INT 9  ngắt bàn phím.v.) – Ngắt mềm: là các chương trình con được gọi bằng lệnh INT của BXL. Số hiệu chương trình con là số hiệu của vector ngắt trong bảng vector ngắt. Chương trình con này thi hành 1 dịch vụ nào đó của DOS hoặc BIOS.  Khi gọi ngắt mềm, người lập trình thường phải truyền các tham số thông qua các thanh ghi và kết quả thu được sẽ có trong thanh ghi hoặc bộ nhớ.  Bảng vector ngắt chiếm 1KB vùng nhớ địa chỉ thấp từ 0:0000h đến 0:0400h trong đó cứ 4 byte tạo thành 1 vector chứa địa chỉ offset (word thấp) và địa chỉ segment (word cao) – Vd: INT 0 tại địa chỉ 0:0004h, INT 1 tại địa chỉ 0:0008h, INT 2 tại địa chỉ 0:000Ch Chương 6 - Lập trình hợp ngữ 11 bangtqh@utc2.edu.vn Tập lệnh 8086/8088 VXL 8086/8088 có khoảng 115 lệnh, chia làm 6 nhóm lệnh chính – Các lệnh vận chuyển số liệu (POP, PUSH, MOV,.) – Các lệnh số học (ADD, SUB, MUL, IMUL, DIV, CMP) – Các lệnh thao tác ở mức bit (AND, NOT, ROR, ROL) – Các lệnh thao tác với dãy byte (REP, CMPSB, REPZ) – Các lệnh điều khiển (CALL, INT, JE, JZ, LOOP,) – Các lệnh thao tác với cờ (flag) và điều khiển BXL (HLT,CLC, CLD, NOP, WAIT.) Chương 6 - Lập trình hợp ngữ 12 bangtqh@utc2.edu.vn Phân biệt EXE và COM  File *.COM – Nằm trên 1 segment  size tối đa chỉ 64KB – Nạp vào bộ nhớ và thực thi hanh hơn file EXE – Khi chạy file COM, DOS tạo vùng nhớ Program Segment Prefix (PSP) dài 256 Byte ở 0000h chứa các thông tin cần thiết, sau đó các mã lệnh sẽ được load vào từ vị trí 0100h và nạp giá trị 0 vào stack (2 byte), thanh ghi SP trỏ tới 0FFFEh  Size thực tế của chương trình COM chỉ là: 64KB – 256 Byte – 2 byte stack  File *.EXE – Nằm trên nhiều segment khác nhau – Size thường lớn 64KB – Có thể gọi được các chương trình con dạng near hoặc far Chương 6 - Lập trình hợp ngữ 13 bangtqh@utc2.edu.vn Khung một chương trình assembly Xét cụ thể 1 chương trình đơn giản Chương 6 - Lập trình hợp ngữ 14 Đoạn mã chứa lệnh của chương trình Đoạn khai báo dữ liệu Chương trình chính Chương trình con bangtqh@utc2.edu.vn Khung chương trình assembly (tt) Chỉ thị .MODEL – TINY: Mã lệnh và dữ liệu cùng nằm trong 1 segment – SMALL: Mã lệnh nằm trên 1 segment; Dữ liệu trên 1 segment khác – MEDIUM: Mã lệnh nằm trong nhiều segment; Dữ liệu nằm trên 1 segment – COMPACT: Mã lệnh nằm trên 1 segment; Dữ liệu nằm trên nhiều segment – LARGE: Mã lệnh nằm trong nhiều segment; Dữ liệu nằm trên nhiều segment nhưng không chứa mảng lớn hơn 64KB – HUGE: Mã lệnh và dữ liệu nằm trên nhiều segment; dữ liệu có thể chứa các mảng lớn hơn 64KB Chương 6 - Lập trình hợp ngữ 15 bangtqh@utc2.edu.vn Khung chương trình assembly (tt)  Chỉ thị .STACK – Cú pháp: .STACK n – Khai báo dùng để dành ra một vùng nhớ dùng làm stack (chủ yếu phục vụ cho chương trình con), thông thường ta chọn khoảng 256 byte là đủ để sử dụng – Nếu không khai báo thì chương trình dịch tự động cho kích thước stack là 1 KB:  Chỉ thị .DATA – Bắt đầu khai báo đoạn dữ liệu chứa các biến và hằng trong chương trình – Xem công thức khai báo dữ liệu  Chỉ thị .CODE – Đoạn mã bắt đầu bằng một chương trình chính và có thể có các lệnh gọi chương trình con (CALL) – Một chương trình chính hay chương trình con bắt đầu bằng lệnh PROC và kết thúc bằng lệnh ENDP (đây là các lệnh giả của chương trình dịch). Trong chương trình con, ta sử dụng thêm lệnh RET để trả về địa chỉ lệnh trước khi gọi chương trình con. Chương 6 - Lập trình hợp ngữ 16 bangtqh@utc2.edu.vn Khung chương trình assembly (tt) Chỉ thị ENDP – Báo cho Assembler biết điểm kết thúc 1 thủ tục có tên là MAIN Chỉ thị END – Báo cho Assembler biết điểm kết thúc chương trình chính với nhãn lệnh đâu tiên trong modul chương trình chính là MAIN Chương 6 - Lập trình hợp ngữ 17 bangtqh@utc2.edu.vn Khung chương trình assembly (tt) Trường hợp đoạn mã, đoạn dữ liệu, stack gộp chung vào 1 segment duy nhất Chương 6 - Lập trình hợp ngữ 18 Đoạn khai báo dữ liệu Chương trình chính Định nghĩa chương trình con nếu có ở đây bangtqh@utc2.edu.vn Cấu trúc 1 dòng lệnh Assembly Nhãn: Dài tối đa 31 ký tự, không được bắt đầu bằng ký tự số, không chứa dấu cách trống Mã lệnh (Op-code): Là các chữ viết tắt gợi nhớ chỉ các lệnh của BXL Các toán hạng (Operands): Báo cho BXL biết tìm toán hạng ở đâu Chú thích: Phải đứng sau dấu chấm phẩy (;) và kết thúc bởi dấu xuống dòng 19 Nhãn Mã lệnh Toán hạng Chú thích START: MOV AH, 10h ; Đưa giá trị 10h vào AH bangtqh@utc2.edu.vn Khai báo biến Khai báo biến để assembler cung cấp một địa chỉ xác định trong bộ nhớ. – DB (define byte) – DW (define word) – DD (define double word) Ví dụ A1 DB 1 ;khai báo 1 biến A1 dài 1 byte, giá trị =1 A2 DB ? ;khai báo 1 biến A2 dài 1 byte A3 DB ‘P’ ;khai báo 1 biến A3 kiểu ký tự A4 DW 1 ;khai bao 1 biến dài 2 byte, giá trị =1 A5 DB 1,2,3 ;khai báo mảng 3 phần tử giá trị = 1,2,3 A6 DB 10 DUP (0) ;mảng 10 phẩn tử giá trị 0 Chương 6 - Lập trình hợp ngữ 20 bangtqh@utc2.edu.vn Khai báo biến Lưu ý: Đối với các biến có độ lớn nhiều hơn 1 byte, byte thấp sẽ chứa ở ô nhớ có địa chỉ thấp và byte cao sẽ chứa ở ô nhớ có địa chỉ cao. – Ví dụ: VarA DW 1234h – Nếu VarA được cấp ở địa chỉ 1000h thì • Địa chỉ 1001h chứa byte 34h • Địa chỉ 1002h chứa byte 12h Chương 6 - Lập trình hợp ngữ 21 bangtqh@utc2.edu.vn Khai báo hằng Các hằng khai báo trong chương trình hợp ngữ bằng lệnh giả. Hằng có thể ở dạng số, ký tự hay chuỗi. VD: A12 EQU 10 A13 EQU 'AAA' ;Sau khi sử dụng khai báo trên, nếu ta dùng lệnh: MOV AH, A12 ;thì AH = 10h ;Nếu khai báo tiếp A14 DB ‘B’, A13 ;thì chuỗi A14 có giá trị gán ban đầu là 'BAAA'. Chương 6 - Lập trình hợp ngữ 22 bangtqh@utc2.edu.vn Các toán tử trong Assembly Toán tử số học Toán tử logic Toán tử quan hệ Toán tử cung cấp thông tin Toán tử thuộc tính Chương 6 - Lập trình hợp ngữ 23 bangtqh@utc2.edu.vn Toán tử số học VD: MOV AH, (5+1)*7/2 ;AH← 21 MOV AH, 00010110b shl 2 ;AH← 01011000b MOV AH, 00010110b shr 2 ;AH← 00000101b MOV AH, 100 mod 3 ;AH←1 Chương 6 - Lập trình hợp ngữ 24 bangtqh@utc2.edu.vn Các toán tử trong Assembly (tt) Toán tử logic – Gồm các toán tử AND, OR, NOT, XOR Toán tử quan hệ – So sánh 2 biểu thức và trả về giá trị True (-1) nếu thỏa mãn; False (0) nếu không thỏa mãn Chương 6 - Lập trình hợp ngữ 25 bangtqh@utc2.edu.vn Toán tử cung cấp thông tin  SEG – Cú pháp: SEG bt trong đó: bt có thể là biến, nhãn hay các toán hạng bộ nhớ – Công dụng: trả về địa chỉ segment của bt  OFFSET – Cú pháp: OFFSET bt trong đó: bt có thể là biến, nhãn hay các toán hạng bộ nhớ – Công dụng: trả về địa chỉ offset của bt  Toán tử chỉ số [ ] – Dùng lấy phần tử chỉ số i đối với biến dạng mảng ví dụ: Tenmang[i] – Dùng để xác định giá trị tại một ô nhớ có địa chỉ lưu trong thanh ghi (vd: [BX]  Toán tử (:) – segment override operator – Quy định tính địa chỉa đối với segment được chỉ định (các thanh ghi đoạn ES, SS, DS, CS Chương 6 - Lập trình hợp ngữ 26 bangtqh@utc2.edu.vn Toán tử cung cấp thông tin (tt) Toán tử TYPE – Cú pháp TYPE bt – Cho phép xác định kiểu của biểu thức bt. • Nếu bt là biến  trả về số byte (1, 2, hoặc 4) • Nếu bt là nhãn  trả về 0FFFh nếu nhãn NEAR, 0FFFEh nếu là nhãn FAR • Nếu bt là hằng  trả về 0 Toán tử LENGTH – Cú pháp LENGTH bt – Trả về số phần tử của bt (tính theo byte, word, hoặc dword) Toán tử SIZE – Trả về tổng số byte đã cấp cho một đối tượng Chương 6 - Lập trình hợp ngữ 27 bangtqh@utc2.edu.vn Toán tử thuộc tính PTR – Cú pháp: PTR bt – có dạng BYTE hoặc WORD nếu bt là toán hạng bộ nhớ – có dạng NEAR hoặc FAR nếu bt là nhãn – Ví dụ: A DW 100 DUP(?) B DD ? ; Đưa byte đầu tiên trong mảng A vào thanh ghi AH MOV AH, BYTE PTR A ; Đưa 2 byte thấp trong biến B vào thanh ghi AX MOV AX, WORD PTR B Chương 6 - Lập trình hợp ngữ 28 bangtqh@utc2.edu.vn Các mode địa chỉ toán hạng Toán hạng có thể là: – Một giá trị cụ thể – Nội dung của thanh ghi – Nội dung của ngăn nhớ – Nội dung của cổng vào ra Mode địa chỉ là cách thức địa chỉ hóa trong lệnh để xác định toán hạng 29 bangtqh@utc2.edu.vn Các mode địa chỉ toán hạng Mode địa chỉ tức thì Mode địa chỉ trực tiếp Mode địa chỉ gián tiếp Mode địa chỉ thanh ghi Mode địa chỉ gián tiếp qua thanh ghi Mode địa chỉ dịch chuyển Mode địa chỉ stack 30 bangtqh@utc2.edu.vn Mode địa chỉ tức thì Toán hạng là một phần của lệnh Toán hạng nằm ngay trong trường địa chỉ Chỉ có thể là toán hạng nguồn Truy nhập toán hạng rất nhanh Ví dụ: ADD AX, 10 31 bangtqh@utc2.edu.vn Mode địa chỉ gián tiếp Toán hạng là nội dung của ngăn nhớ có địa chỉ nằm trong một ngăn nhớ khác, ngăn nhớ khác đó được thể hiện trong lệnh Vùng nhớ có thể được tham chiếu là lớn Có thể gián tiếp nhiều lần CPU phải thực hiện tham chiếu bộ nhớ nhiều lần để tìm toán hạng → chậm Ví dụ: ADD AH, [a] 32 bangtqh@utc2.edu.vn Sơ đồ mode địa chỉ gián tiếp 33 §Þa chØM· lÖnh LÖnh Bé nhí To¸n h¹ng §Þa chØ cña t/h¹ng bangtqh@utc2.edu.vn Mode địa chỉ thanh ghi Toán hạng là nội dung của một thanh ghi Số lượng thanh ghi có hạn Trường địa chỉ nhỏ (chỉ cần ít bit) – Độ dài lệnh ngắn hơn – Nhận lệnh nhanh hơn Không tham chiếu bộ nhớ Truy nhập toán hạng nhanh Tăng số lượng thanh ghi → tăng tốc độ Ví dụ: ADD AL, AH 34 bangtqh@utc2.edu.vn Sơ đồ mode địa chỉ thanh ghi Vị trí của toán hạng chính là các thanh ghi của BXL – VD: MOV DS, AX 35 Tªn thanh ghiM· lÖnh LÖnh TËp thanh ghi To¸n h¹ng bangtqh@utc2.edu.vn Mode địa chỉ gián tiếp qua thanh ghi Toán hạng là ngăn nhớ có địa chỉ nằm trong một thanh ghi Thanh ghi này được gọi là thanh ghi con trỏ Vùng nhớ có thể được tham chiếu là lớn: 2n, trong đó n là độ dài (bit) của thanh ghi Ví dụ: SUB AL, [BX] 36 bangtqh@utc2.edu.vn Sơ đồ mode gián tiếp qua thanh ghi 37 Tªn thanh ghiM· lÖnh LÖnh Bé nhí To¸n h¹ng§Þa chØ cña t/h¹ng TËp thanh ghi bangtqh@utc2.edu.vn Mode địa chỉ dịch chuyển Kết hợp hai mode: – Mode gián tiếp qua thanh ghi – Mode trực tiếp Trường địa chứa hai thành phần: – Tên một thanh ghi – Một hằng số Địa chỉ toán hạng = ND thanh ghi = hằng số Ví dụ: ADD AL, [SI + 50] 38 bangtqh@utc2.edu.vn Sơ đồ mode địa chỉ dịch chuyển 39 Register RM· lÖnh LÖnh Bé nhí To¸n h¹ng §Þa chØ cña t/h¹ng TËp thanh ghi Address A + bangtqh@utc2.edu.vn Mode địa chỉ stack Toán hạng được ngầm hiểu là ngăn nhớ đỉnh ngăn xếp Ví dụ: PUSH AX 40 M· lÖnh LÖnh Ng¨n nhí ®Ønh stack NgÇm hiÓu bangtqh@utc2.edu.vn Minh họa lệnh gọi chương trình con 41 bangtqh@utc2.edu.vn Thể hiện ở Stack 42 Sau lÖnh CALL Proc1 Khëi t¹o néi dung stack Sau lÖnh CALL Proc2 Sau lÖnh RETURN Sau lÖnh CALL Proc2 Sau lÖnh RETURN Sau lÖnh RETURN bangtqh@utc2.edu.vn Một số lệnh cơ bản của assembly Lệnh MOV – Cú pháp: MOV đích, nguồn – Không được dùng lệnh MOV chuyển trực tiếp dữ liệu giữa 2 ô nhớ mà phải thông qua một thanh ghi – Không được chuyển trực tiếp dữ liệu vào thanh ghi đoạn (DS, CS, SS, ES) – Không được chuyển trực tiếp giữa 2 thanh ghi đoạn Lệnh XCHG: Hoán chuyển nội dung giữa 2 toán hạng – Cú pháp: XCHG dst, src – Không được phép dùng lệnh XCHG với thanh ghi đoạn (DS, CS, SS, ES) Chương 6 - Lập trình hợp ngữ 43 bangtqh@utc2.edu.vn Một số lệnh cơ bản của assembly (tt) Lệnh cộng không nhớ ADD – Cú pháp: ADD dst, src – Công dụng: dst ←dst + src – Không được phép cộng 2 thanh ghi đoạn – Toán hạng src có thể là thanh ghi hoặc ô nhớ hoặc giá trị cụ thể; Toán hạng dst là thanh ghi hoặc ô nhớ Lệnh cộng có nhớ ADC – Cú pháp: ADC dst, src – Công dụng: dst ← dst + src + CF – Thường được dụng khi cộng các số lớn hơn 16 bit Lệnh tăng INC – Cú pháp: INC dst ;dsc có thể là reg hoặc mem – Công dụng: dst ←dst +1 Chương 6 - Lập trình hợp ngữ 44 bangtqh@utc2.edu.vn Một số lệnh cơ bản của assembly (tt) Lệnh giảm DEC – Cú pháp: DEC dst ;dsc có thể là reg hoặc mem – Công dụng: dst  dst – 1 Lệnh trừ SUB – Cú pháp: SUB dsc, src ;dsc ← dsc - src – src có thể là reg, mem hoặc immed; dsc chỉ có thể là reg hoặc mem – Không được phép trừ trên thanh ghi đoạn Lệnh trừ có mượn SBB – Cú pháp SBB dsc, src ;dsc dsc – src - CF Lệnh đảo dấu NEG – Cú pháp NEG dsc ;dsc -dsc Chương 6 - Lập trình hợp ngữ 45 bangtqh@utc2.edu.vn Một số lệnh cơ bản của assembly (tt) Lệnh nạp địa chỉ thực LEA – Cú pháp: LEA dst, src – Công dụng là chuyển địa chỉ offset của src vào dst – Đích dst thường là BX, CX, DX, BP, SI, DI; scr thường là tên của biến. – Tương đương với lệnh: MOV reg16, OFFSET mem16 Lệnh gọi ngắt INT – Cú pháp: INT, – Các ngắt thông dụng: • 09h  ngắt bàn phím • 20h  thoát khỏi chương trình • 21h  DOS Chương 6 - Lập trình hợp ngữ 46 bangtqh@utc2.edu.vn Các lệnh vào/ra trong assembly Một số hàm của ngắt 21h (DOS) – Hàm 01h  nhập 1 ký tự từ bàn phím – Hàm 02h  in 1 ký tự ra màn hình – Hàm 09h  in 1 chuỗi ký tự (kết thúc $) ra màn hình – Hàm 0Ah  nhận một chuỗi ký tự từ bàn phím – . Ví dụ: Viết chương trình nhập 1 ký tự từ bàn phím  hiện ký tự vừa nhập – Đưa số hiệu hàm vào AH – Mã ASCII của ký tự nhập từ bàn phím sẽ lưu trong AL – Khi in ký tự ra màn hình thì AH chứa số hiệu hàm, DL chứa ký mã ký tự cần in Chương 6 - Lập trình hợp ngữ 47 bangtqh@utc2.edu.vn Các lệnh vào/ra trong assembly Giải: Bài tập: Viết chương trình nhập 2 số A, B trong khoảng 0..9, in ra màn hình tổng của 2 số đó Chương 6 - Lập trình hợp ngữ 48 bangtqh@utc2.edu.vn Các lệnh vào/ra trong assembly Chu trình hiển thị 1 chuỗi ký tự lên màn hình – Bước 1: Khởi tạo đoạn dữ liệu trong thanh ghi DS MOV AX, @DATA MOV DS, AX – Bước 2: Đưa địa chỉ chuỗi cần in vào thanh ghi DX LEA DX, Msg ; hoặc lệnh MOV DX, OFFSET Msg – Bước 3: Đặt trị số hàm 09h vào AH MOV AH, 09h – Bước 4: Gọi ngắt 21h INT 21h Chương 6 - Lập trình hợp ngữ 49 bangtqh@utc2.edu.vn Các lệnh vào/ra trong assembly Bài tập 1: Viết chương trình hiển thị lên màn hình Bài tập 2: Viết chương trình nhận vào từ bàn phím 1 ký tự, hãy in ra màn hình ký tự đó ở dạng chữ in hoa. (chương trình có hiển câu thông báo mời nhập và câu thông báo kết quả). Chương 6 - Lập trình hợp ngữ 50 bangtqh@utc2.edu.vn Các lệnh vào/ra trong assembly (tt) Chu trình nhập 1 chỗi ký tự từ bàn phím – Bước 1: Khai báo buffer chứa chuỗi sẽ nhập strBuffer DB 40, ?, 40 DUP (?) – Bước 2: Đưa địa chỉ buffer vào DX LEA DX, strBuffer; hoặc lệnh MOV DX, OFFSET Msg – Bước 3: Đặt trị số hàm 0Ah vào AH MOV AH, 0Ah – Bước 4: Gọi ngắt 21h INT 21h + Thao tác nhập kết thúc bằng phím Enter (mã 0Dh) + strBuffer[1] chứa độ dài chuỗi vừa nhập Chương 6 - Lập trình hợp ngữ 51 bangtqh@utc2.edu.vn Ví dụ: Nhập họ tên và in lời chào ra màn hình Chương 6 - Lập trình hợp ngữ 52 bangtqh@utc2.edu.vn Các lệnh vào/ra trong assembly (tt) Bài tập 3: Hãy viết chương trình nhập vào từ bàn phím 2 số nguyên nằm trong khoảng 0255. Tính và in ra màn hình Tổng và Tích của 2 số nguyên đó Gợi ý: + Nhập 2 xâu strA và strB + Tiến hành đổi 2 xâu vừa nhập về dạng số + Tính tổng và tích 2 số đó + Đổi các chữ số hàng đv, chục, trăm sang dạng ký tự rồi lần lượt in các ký tự đó ra màn hình Chương 6 - Lập trình hợp ngữ 53 bangtqh@utc2.edu.vn Cấu trúc điều khiển trong assembly Lệnh nhảy không điều kiện JMP – Cú pháp: JMP – Công dụng: Chuyển tới vị trí lệnh được xác định bởi CS:IP Các lệnh nhảy có điều kiện – Các lệnh nhảy không dấu – Các lệnh nhảy có dấu (khi kết quả trả về là số có dấu) – Các lệnh nhảy điều kiện đơn: ĐK nhảy phụ thuộc vào 1 cờ riêng biệt Chương 6 - Lập trình hợp ngữ 54 bangtqh@utc2.edu.vn Ví dụ lệnh nhảy JMP Chương 6 - Lập trình hợp ngữ 55 bangtqh@utc2.edu.vn Cấu trúc điều khiển trong assembly (tt) Lệnh nhảy có điều kiện – Chỉ được phép nhảy tới các label trong khoảng [-127, 128] byte tại của IP – Lệnh JA (Jump if above) – Lệnh JAE (Jump if above or equal) – Lệnh JB (Jump if below) – Lệnh JBE (Jump if below or equal) – Lệnh JE (Jump if Equal) – Lệnh JNE (Jump if not Equal) – Lệnh JNA (Jump if not Above) – .. (đọc help) Các lệnh nhảy có điều kiện thường dùng sau lệnh so sánh CMP Chương 6 - Lập trình hợp ngữ 56 bangtqh@utc2.edu.vn Cấu trúc điều khiển trong assembly (tt) Cấu trúc rẽ nhánh If Then Ví dụ: Viết chương trình nhập vào số năm dương lịch Kiểm tra xem năm đó có phải năm nhuận không? Chương 6 - Lập trình hợp ngữ 57 CMP Lablel_Bỏ_qua_việc_A . Label_Bỏ_qua_việc_A: .. ba
Tài liệu liên quan