Đề cương bài giảng hợp ngữ

Một chương trình hợp ngữ bao gồm một loạt các mệnh đề ( statement) được

viết liên tiếp nhau , mỗi mệnh đề được viết trên 1 dòng .

Một mệnh đề có thể là :

· một lệnh ( instruction) : được trình biên dịch ( Assembler =ASM) chuyển thành

mã máy.

· một chỉ dẫn của Assembler ( Assembler directive) : ASM không chuyển thành

mã máy

Các mệnh đề của ASM gồm 4 trường :

Name Operation Operand(s) Comment

các trường cách nhau ít nhất là một ký tự trống hoặc một ký tự TAB

ví dụ lệnh đề sau :

START : MOV CX,5 ; khơỉ tạo thanh ghi CX

Sau đây là một chỉ dẫn của ASM :

MAIN PROC ; tạo một thủ tục có tên là MAIN

pdf108 trang | Chuyên mục: Kiến Trúc Máy Tính | Chia sẻ: dkS00TYs | Lượt xem: 1710 | Lượt tải: 1download
Tóm tắt nội dung Đề cương bài giảng hợp ngữ, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
ứ A[i,j] thì cần tìm : hàng i và tìm phần tử thứ j trên hàng này . Như vậy 
phải tiến hành qua 2 bước : 
 Bước 1: Hàng 1 bắt đầu tại vị trí A . Vì mỗi hàng có N phần tử , do đó 
 Hàng 2 bắt đầu tại A+ NxS . 
 Hàng 3 bắt đầu tại A+2xNxS . 
 Hàng thứ i bắt đầu tại A+(i-1)xSxN . 
 Bước 2: Phần tử thứ j trên một hàng cách vị trí đầu hàng (j-1)xS byte 
 Từ 2 bước trên suy ra rằng trong mảng 2 chiều NxM phần tử mà chúng được 
lưu trữ theo trật tự hàng thì phần tử A[i,j] có địa chỉ được xác định như sau : 
 A+((i-1)xN + (j-1))x S (1) 
Chương 7 : Mảng và các chế độ địa chỉ 93 
 Tương tự nếu lưu trữ theo trật tự cột thì phần tử A[i,j] có địa chỉ như sau : 
 A+(i-1)+(j--)xM)xS (2) 
 Ví dụ : Giả sử A là mảng MxN phần tử kiểu từ ( S=2) được lưu trữ theo kiểu 
trật tự hàng . Hỏi : 
 Hàng i bắt đầu tại địa chỉ nào ? 
 Cột j bắt đầu tại điạ chỉ nào ? 
 Hai phần tử trên một cốt cách nhau bao nhiêu bytes 
 Giải : 
 Hàng i bắt đầu tại A[i,1] theo công thức (1) thì nó có địa chỉ là : A+(i-1)xNx2 
 Cột j bắt đầu tại A[1,j ] theo công thức (1) thì nó có địa chỉ : A+(j-1)x2 
 Vì có N cột nên 2 phần tử trên cùng một cột cách nhau 2xN byte . 
 7.5 Chế độ địa chỉ chỉ số cơ sở 
 Trong chế độ này , địa chỉ offset của toán hạng là tổng của : 
 1. nội dung của thanh ghi cơ sở ( BX or BP) 
 2. nội dung của thanh ghi chỉ số ( SI or DI) 
 3. địa chỉ offset của 1 biến ( tuỳ chọn) 
 4. một hằng âm hoặc dương ( tuỳ chọn) 
 Nếu thanh ghi BX được dùng thì DS chứa số đoạn của địa chỉ toán hạng .Nếu 
BP được dùng thì SS chưá số đoạn . Toán hạng được viết theo 4 cách dưới đây: 
 1. variable[base_register][index_register] 
 2. [base_register + index_register + variable + constant ] 
 3. variable [ base_register + index_register + constant] 
 4. constant [ base _ register + index_register + variable] 
 Trật tực của các thành phần trong dấu ngoặc là tuỳ ý . 
 Ví dụ , giả sử W là biến từ , BX=2 và SI =4 . Lệnh 
 MOV AX, W[BX][SI] 
 sẽ di chuyển nội dung của mảng tại địa chỉ W+2+4 = W+6 vào thanh ghi AX 
 Lệnh này cũng có thể viết theo 2 cách sau : 
 MOV AX,[W+BX+SI] 
 MOV AX,W[BX+SI] 
 Chế độ địa chỉ chỉ số cơ sở thường được dùng để xử lý mảng 2 chiều như ví 
dụ sau : Giả sử rằng A là mảng 5x7 từ được lưu trữ theo trật tự dòng . Viết đoạn mã 
dùng chế độ địa chỉ chỉ số để : 
 1) xóa dòng 3 
 2) xoá cột 4 
 Giải : 
 1) Dòng i bắt đầu tại A+(i-1)xNx2 . Như vậy dòng 3 bắt đầu tại A+(2-1)x7x2 
= A + 28 . Có thể xóa dòng 3 như sau : 
 MOV BX,28 ; BX chỉ đến đầu dòng 3 
Chương 7 : Mảng và các chế độ địa chỉ 94 
 XOR SI,SI ; SI sẽ chỉ mục cột 
 MOV CX,7 ; CX= số phần tử của một hàng 
 CLEAR: 
 MOV A[BX][SI],0 ; xoá A[3,1] 
 ADD SI,2 ; đến cột tiếp theo 
 LOOP CLEAR 
 2) Cột j bắt đầu tại điạ chỉ A + (j-1)x2 . Vậy cột 4 bắt đầu tại điạ chỉ A+(4-
1)x2 = A+ 6 . Hai phần tử trên một cột cách nhau Nx2 byte , ở đây N=7 , vậy 2 phần 
tử cách nhau 14 byte . Có thể xóa cột 4 như sau : 
 MOV SI,6 ; SI chỉ đến cột 4 
 XOR BX,BX ; BX chỉ đến hàng 
 MOV CX,5 ; CX= 5 : số phần tử trên một cột 
 CLEAR: 
 MOV A[BX][SI],0 ; Xoá A[i,4] 
 ADD BX,1 ; đến dòng tiếp theo 
 LOOP CLEAR 
 7.6 Ưùng dụng để tính trung bình 
 Giả sử một lớp gồm 5 sinh viên và có 4 môn thi . Kết qủa cho bởi mảng 2 
chiều như sau : 
Tên Sinh 
viên 
TEST1 TEST2 TEST3 TEST4 
MARY 67 45 98 33 
SCOTT 70 56 87 44 
GEORGE 82 72 89 40 
BETH 80 67 95 50 
SAM 78 76 92 60 
 Chúng ta sẽ viết1 chương trình tính điểm trung bình cho mỗi bài thi . Để làm 
điều này có thể tổng theo cột rồi chia cho 5 . 
 Thuật toán : 
 1. j = 4 
 2. repeat 
 3. Sum the scores in column j 
 4. divide sum by 5 to get average in column j 
 5. j = j - 1 
 5. Until j = 0 
Chương 7 : Mảng và các chế độ địa chỉ 95 
 Trong đó bước 3 có thể làm như sau : 
 Sum[j]= 0 
 i = 1 
 FOR 5 times DO 
 Sum[j]= Sum[j]+ Score[i, j] 
 i = i + 1 
 END_FOR 
 Chương trình có thể viết như sau : 
 TITLE PGM7_4 : CLASS AVERAGE 
 .MODEL SMALL 
 .STACK 100H 
 .DATA 
 FIVE DB 5 
 SCORES DW 67,45,98,33 ; MARY 
 DW 70,56,87,44 ;SCOTT 
 DW 82,72,89,40 ;GEORGE 
 DW 80,67,,95,50 ; BETH 
 DW 78,76,92,60 ;SAM 
 AVG DW 5 DUP (0) 
 .CODE 
 MAIN PROC 
 MOV AX,@DATA 
 MOV DS,AX 
 ;J=4 
 REPEAT: 
 MOV SI,6 ; SI chỉ đến cột thứ 4 
 XOR BX,BX ; BX chỉ hàng thứ nhất 
 XOR AX,AX ; AX chứa tổng theo cột 
 ; Tổng điểm trên cột j 
 FOR: 
 ADD AX , SCORES[BX+SI] 
 ADD BX,8 ; BX chỉ đến hàng thứ 2 
 LOOP FOR 
 ; end_for 
 ; tính trung bình cột j 
 XOR DX,DX ; xoá phần cao của số bị chia (DX:AX) 
 DIV FIVE ; AX = AX/5 
 MOV AVG[SI],AX ; cất kết qủa trên mảng AVG 
 SUB SI,2 ; đến cột tiếp 
 ; un til j=0 
 JNL REPEAT 
Chương 7 : Mảng và các chế độ địa chỉ 96 
 ;DOS EXIT 
 MOV AH,4CH 
 INT 21H 
 MAIN ENDP 
 END MAIN 
 Sau khi biên dịch chương teình có thể dùng DEBUG để chạy và xem kết qủa 
bằng lệnh DUMP. 
 7.7 Lệnh XLAT 
 Trong một số ứng dụng cần phải chuyển số liệu từ dạng này sang 
dạng khác . Ví dụ IBM PC dùng ASCII code cho các ký tự nhưng IBM Mainframes 
dùng EBCDIC ( Extended Binary Coded Decimal Interchange Code) . Để chuyển 
một chuỗi ký tự đã được mã hoá bằng ASCII thành EBCDIC , một chương trình phải 
thay mã ASCII của từng ký tự trong chuỗi thành mã EBCDIC tương ứng . 
 Lệnh XLAT ( không có toán hạng ) được dùng để đổi một giá trị byte thành 
một giá trị khác chứa trong một bảng . 
 AL phải chứa byte cần biến đổi 
 DX chứa điạ chỉ offset của bảng cần biến đổi 
 Lệnh XLAT sẽ : 
 1) cộng nội dung của AL với địa chỉ trên BX để tạo ra điạ chỉ trong bảng 
 2) thay thế giá trị của AL với giá trị tìm thấy trong bảng 
 Ví dụ , giả sử rằng nội dung của AL là trong vùng 0 đến Fh và chúng ta muốn 
thay nó bằng mã ASCII của số hex tương đương nó , tức là thay 6h bằng 036h=‘6’ , 
thay Bh bằng 042h=“B” . Bảng biến đổi là : 
TABLE DB 030h ,031h , 032h ,033h ,034h , 035h , 036h, 037h,038h,039h 
 DB 041h , 042h ,043h , 044h, 045h , 046h 
 Ví dụ , để đổi 0Ch thành “C” , chúng ta thực hiện các lệnh sau : 
 MOV AL,0Ch ; số cần biến đổi 
 LEA BX,TABLE ; BX chưá điạ chỉ offset của bảng 
 XLAT ; AL chứa “C” 
Ở đây XLAT tính TABLE + Ch = TABLE +12 và thay thế AL bởi 043h . Nếu AL 
chứa một số không ở trong khỏang 0 đến 15 thì XLAT sẽ cho một giá trị sai . 
 Ví dụ : Mã hoá và giải mã một thông điệp mật 
 Chương trình này sẽ : 
 Nhắc nhở người dùng nhập vào một thông điệp 
 Mã hoá nó dưới dạng không nhận biết được , 
 In chúng ra ở dòng tiếp theo 
 Dịch chúng trở lại dạng ban đầu rồi in chúng ở dòng tiếp theo 
 Khi chạy ct màn hình sẽ có dạng sau : 
Chương 7 : Mảng và các chế độ địa chỉ 97 
 ENTER A MESSAGE : 
 DAI HOC DA LAT ; input 
 OXC BUC OX EXK ; encode 
 DAI HOC DA LAT ; translated 
 Thuật toán như sau : 
 Print prompt 
 Read and encode message 
 Go to anew line 
 Print encoded message 
 go to a new line 
 translate and print message 
 TITLE PGM7_5 : SECRET MESSAGE 
 .MODEL SMALL 
 .STACK 100H 
 .DATA 
 ;ALPHABET ABCDEFGHIJKLMNOPQRSTUVWXYZ 
 CODE_KEY DB 65 DUP ( ’ ‘), ‘ 
XQPOGHZBCADEIJUVFMNKLRSTWY’ 
 DB 37 DUP (‘ ‘) ; 128 ký tự của bảng mã ASCII 
 CODED DB 80 dup (‘$’) ; 80 ký tự được gõ vào 
 DECODE_KEY DB 65 DUP (‘ ‘), 
‘JHIKLQEFMNTURSDCBVWXOPYAZG’ 
 DB 37 DUP (‘ ‘) 
 PROMPT DB ‘ENTER A MESSAGE :’,0DH,0AH,’$’ 
 CRLF DB 0DH,0AH,’$’ 
 .CODE 
 MAIN PROC 
 MOV AX,@DATA 
 MOV DS, AX 
 ; in dấu nhắc 
 MOV AH,9 
 LEA DX,PROMPT 
 INT 21H 
 ; đọc và mã hoá ký tự 
 MOV AH,1 
 LEA BX,CODE_KEY ; BX chỉ tới CODE_KEY 
 LEA DI, CODED ; DI chỉ tới thông điệp đã mã hoá 
Chương 7 : Mảng và các chế độ địa chỉ 98 
 WHILE_: 
 INT 21h ; đọc ký tự vào AL 
 CMP AL,0DH ; có phải là ký tự CR 
 JE ENDWHILE ; đúng , đến phần in thông điệp đã mã hoá 
 XLAT ; mã hoá ký tự 
 MOV [DI],AL ; cất ký tự trong CODE 
 JMP WHILE_ ; xử lý ký tự tiếp theo 
 ; xuống hàng 
 MOV AH,9 
 LEA DX,CRLF 
 INT 21H 
 ; in thông điệp đã mã hoá 
 LEA DX,CODED 
 INT 21H 
 ; xuống hàng 
 LEA DX,CRLF 
 INT 21H 
 ; giải mã thông điệp và in nó 
 MOV AH,2 
 LEA BX,DECODE_KEY ; BX chứa điạ chỉ bảng giải mã 
 LEA SI,CODED ; SI chỉ tới thông điệp đã mã hoá 
 WHILE1: 
 MOV AL,[SI] ; lấy ký tự từ thông điệp đã mã hoá 
 CMP AL.’$’ ; có phải cuối thông điệp 
 JE ENDWHILE1 ; kết thúc 
 XLAT ; giải mã 
 MOV DL,AL ;đặt ký tự vào DL 
 INT 21H ; in ký tự 
 INC SI ; SI=SI+1 
 JMP WHILE1 ; tiếp tục 
 ENDWHILE1: 
 MOV AH,4CH 
 INT 21H 
 MAIN ENDP 
 END MAIN 
 Trong chương trình có đọan số liệu với các khai báo sau : 
 ; ALPHABET ABCDEFGHIJKLMNOPQRSTUVWXYZ 
Cho biết bảng chữa cái tiếng Anh 
 CODE_KEY DB 65 DUP ( ’ ‘), ‘ XQPOGHZBCADEIJUVFMNKLRSTWY’ 
Chương 7 : Mảng và các chế độ địa chỉ 99 
 DB 37 DUP (‘ ‘) 
Khai báo 128 ký tự của bảng mã ASCII , trong đó thứ tự các ký tự hoa là tuỳ ý . 
 CODED DB 80 dup (‘$’) 
80 ký tự được gõ vào , giá trị ban đầu là $ để có thể in bằng hàm 9 ngắt 21h 
 DECODE_KEY DB 65 DUP (‘ ‘), ‘JHIKLQEFMNTURSDCBVWXOPYAZG’ 
 DB 37 DUP (‘ ‘) 
Bảng giải mã được thiết lập theo cách mã hoá , nghĩa là trong phần mã hoá chúng ta 
đã mã hoá ‘A’ thành ‘X’ vì vậy khi giải mã ‘X’ phải giải mã thành ‘A’ ... 
 Các ký tự gõ vào không phải là ký tự hoa đếu được chuyển thành ký tự trống. 

File đính kèm:

  • pdfgiao_trinh_hop_ngu.pdf