Bài giảng Kiến trúc máy tính - Chương 6: Các lệnh hợp ngữ
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Kiến trúc máy tính - Chương 6: Các lệnh hợp ngữ", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
Tài liệu đính kèm:
bai_giang_kien_truc_may_tinh_chuong_6_cac_lenh_hop_ngu.pdf
Nội dung text: Bài giảng Kiến trúc máy tính - Chương 6: Các lệnh hợp ngữ
- CÁC LỆNH HỢP NGỮ
- Nhắc lại phương pháp định địa chỉ Tức thời (trực hằng) Toán hạng trong lệnh Thanh ghi Toán hạng trong thanh ghi Trực tiếp Địa chỉ trong lệnh là địa chỉ ô nhớ của toán hạng Gián tiếp qua thanh ghi Thanh ghi chứa địa chỉ ô nhớ của toán hạng Gián tiếp ô nhớ Địa chỉ trong lệnh là địa chỉ ô nhớ của toán hạng Chỉ số (dịch chuyển) Địa chỉ toán hạng là tổng nội dung thanh ghi và độ dời Tương đối Tổng nội dung PC và độ dời Stack Thanh ghi SP chứa địa chỉ ô nhớ của toán hạng
- Thanh ghi CPU 8086 14 thanh ghi 16 bit 5 nhóm Thanh ghi đoạn CS (code segment), DS (data segment), SS (stack segment), ES (extra segment) Thanh ghi con trỏ IP (instruction pointer), SP (stack pointer), BP (base pointer) Thanh ghi chỉ số SI (source index), DI (Destination index) Thanh ghi đa dụng Thanh ghi cờ
- Thanh ghi đa dụng AX Accumulator register Sử dụng cho tính toán và xuất nhập BX Base register Thanh ghi duy nhất có thể sử dụng chỉ số CX Counter register Sử dụng cho vòng lặp DX Data register Sử dụng cho xuất nhập và các lệnh nhân chia Các thanh ghi đa dụng có thể “chia nhỏ” thành 2 thanh ghi 8-bit (cao và thấp) AH,AL,BH,BL,CH,CL,DH,DL
- Thanh ghi cờ (Flag) Flags Register Tắt Tên bit n “Mô tả” OF Overflow 11 Tràn số có dấu DF Direction 10 Hướng xử lý chuỗi IF Interrupt 9 Cho phép ngắt TF Trap 8 CPU thực hiện từng bước SF Sign 7 Kiểm tra kết quả là số âm ZF Zero 6 Kiểm tra kết quả bằng 0 AF Auxiliary Carry 4 PF Parity 2 Kiểm tra số bit 1 chẵn CF Carry 0 Tràn số không dấu
- Ảnh hưởng các lệnh đến cờ Tại 1 thời điểm CPU chỉ thực hiện 1 lệnh, kết quả cờ phản ánh tình trạng CPU sau khi thực hiện lệnh INSTRUCTION AFFECTS FLAGS MOV/XCHG Không ảnh hưởng cờ ADD/SUB Tất cả INC/DEC Tất cả trừ CF NEG Tất cả Ví dụ: ADD AX, BX (trong đó giả sử AX=BX=0FFFFh) Thay đổi các cờ??? SUB AL,BL ( trong đó AL=BL=80h)
- Lệnh nhập xuất chuỗi kí tự INT 21h function number routine 09 Xuất chuỗi kí tự Input : AH=09 DX= địa chỉ chuỗi ký tự kết thúc bằng $ Output: chuỗi hiện ra màn hình Lệnh LEA ( Load Effective Address ) Lấy địa chỉ offset của biến vào thanh ghi LEA destination, source LEA DX,MSG ; đưa địa chỉ MSG vào DX
- Program Segment Prefix ( PSP ) Chứa thông tin chương trình để hệ thống truy xuất 256 byte Làm thay đổi DS, ES MOV AX,@DATA MOV DS,AX @DATA tên đoạn số liệu .DATA . Assembler sẽ chuyển @DATA thành địa chỉ.
- Chương trình nhập ký tự thường đổi thành ký tự hoa TITLE PGM3: CASE COVERT PROGRAM .MODEL SMALL .STACK 100H .DATA CR EQU 0DH LF EQU 0AH MSG1 DB ‘enter a lower case letter:$’ MSG2 DB 0DH,0AH,’in upper case it is :’ CHAR DB ?,’$’ ;
- .CODE MAIN PROC ; initialize ds MOV AX,@DATA MOV DS,AX ;print prompt user LEA DX,MSG1 ; MOV AH,9 INT 21H ; ;input char to AL MOV AH,1 ; INT 21H ;
- ;sub to convert SUB AL,20H ; MOV CHAR, AL ; cất vào biến CHAR ;promt user LEA DX, MSG2 ; MOV AH,9 INT 21H ;vì MSG không có dấu $ nên tiếp tục cho đến dấu ;$, lúc này có cả kí tự hoa ;dos exit MOV AH,4CH INT 21H MAIN ENDP END MAIN
- Lệnh sử dụng stack PUSH Cú pháp: PUSH source source: thanh ghi, bộ nhớ hay hằng 16-bit để lưu vào stack POP Cú pháp: POP dest dest: thanh ghi, bộ nhớ để lưu kết quả Cặp thanh ghi xác định đỉnh stack SS:SP
- Lệnh sử dụng stack (tiếp theo) Qui tắc vào sau ra trước: PUSH AX 1 POP CX 3 PUSH BX 2 POP BX 2 PUSH CX 3 POP AX 1 PUSHA Lưu theo thứ tự giá trị của tất cả các thanh ghi AX,BX,CX,DX,SP,BP,SI,DI vào stack POPA Lấy ra giá trị trong stack vào các thanh ghi AX,BX,CX,DX,SP,BP,SI,DI theo thứ tự ngược lại
- Lệnh XLAT Translate “Dịch” giá trị trong AL thành giá trị mới trong bảng tại vị trí xác định theo độ dời bằng AL Ứng dụng để chuyển đổi số liệu Cú pháp: XLAT (không có toán hạng) ‘Input’: BX chứa địa chỉ bảng dữ liệu AL chứa byte cần đổi ‘Output’: AL chứa giá trị tìm thấy trong bảng tại địa chỉ BX+AL
- Lệnh XLAT (tiếp theo) Ví dụ: đổi số thập phân <16 ra kí tự HEXA Khai báo bảng kí tự Bangkytu DB ‘0123456789ABCDEF’ Thực hiện MOV AL, 10 ;Nhập số cần đổi vào AL ví dụ =10 ;thực hiện đổi MOV BX, offset Bangkytu ;lấy địa chỉ bảng dữ liệu XLAT ;AL chứa kí tự ‘A’ Làm thế nào để nhập vào một số 1 chữ số trong khi hàm 01 của INT 21h chỉ nhập kí tự?
- Các lệnh điều khiển Lệnh nhảy Có điều kiện Không điều kiện Biểu diễn ngôn ngữ cấp cao Cấu trúc rẽ nhánh IF CASE Compound condition Cấu trúc lặp FOR WHILE REPEAT
- Ví dụ về lệnh nhảy TITLE PGR3-1: CHARACTER DISPLAY .MODEL SMALL .STACK 100H .CODE MAIN PROC MOV AH,2 ; hàm xuất kí tự MOV CX,256 ; số kí tự cần xuất 0-255 MOV DL,0 ; DL mã ASCII của kí tự NUL PRINT_LOOP : ; nhãn thực hiện vòng lặp INT 21H ; thực hiện xuất kí tự INC DL ; tăng DL lên kí tự tiếp theo DEC CX ; đếm giảm số kí tự chưa in JNZ PRINT_LOOP ;nhảy đến PRINT_LOOP nếu CX<>0 ;DOS EXIT MOV AH,4CH INT 21H MAIN ENDP END MAIN
- Nhảy có điều kiện Cú pháp: Jxxx destination_label xxx là viết tắt của điều kiện destination_label là nhãn để nhảy đến Nếu điều kiện được thỏa mãn thì nhảy Nếu không thì tiếp tục thực hiện lệnh tiếp theo JNZ == jump if not zero Điều kiện Thanh ghi cờ Phạm vi nhảy Không quá 126 bytes
- Các lệnh nhảy có dấu SYMBOL DESCRITION CONDITION JG/JNLE jump if greater than ZF=0 and SF=OF jump if not less than or equal to JGE/JNL jump if greater than or equal to SF=OF jump if not less or equal to JL/JNGE jump if less than SF OF jump if not greater
- Các lệnh nhảy không dấu SYMBOL DESCRITION CONDITION JA/JNBE jump if above CF=0 and ZF=0 jump if not below or equal JAE/JNB jump if above or equal CF=0 jump if not below or equal JB/JNAE jump if below CF=1 jump if not above or equal JBE/JNA jump if below or equal CF=1 or ZF=1 jump if not above
- Các lệnh nhảy 1 cờ SYMBOL DESCRITION CONDITION JE/JZ jump if equal ZF=1 jump if equal to zero JNE/JNZ jump if not equal ZF=0 jump if not zero JC jump if carry CF=1 JNC jump if no carry CF=0 JO jump if overflow OF=1 JNO jump if not overflow OF=0 JS jump if sign negative SF=1 JNS jump if non-negative sign SF=0 JP/JPE jump if parity even PF=1 JNP/JPO jump if parity odd PF=0
- Lệnh CMP Thường dùng so sánh để lấy điều kiện Cú pháp: CMP destination, source Thực hiện phép trừ destination – source để tính cờ và từ đó xác định điều kiện cho lệnh nhảy Việc sử dụng lệnh nhảy có dấu hay không dấu là tùy diễn dịch của lập trình viên Ví dụ: AX=7FFFh, BX=8000h CMP AX,BX CMP AX,BX JA lon_hon ;không nhảy JG lon_hon ;nhảy Viết đoạn chương trình lấy số lớn nhất trong AX và BX vào CX; biết AX, BX chứa số có dấu?
- Lệnh JMP Nhảy không điều kiện Cú pháp: JMP destination Nhảy trong đoạn CS Khắc phục phạm vi nhảy có điều kiện TOP: TOP: ; thân vòng lặp dài hơn 126 bytes ; thân vòng lặp DEC CX DEC CX JNZ BOTTOM JNZ TOP JMP EXIT MOV AX,BX BOTTOM: JMP TOP EXIT: MOV AX,BX
- Biểu diễn ngôn ngữ cấp cao Cấu trúc IF – THEN – END IF IF (condition is true) THEN execute true branch statements END IF Ví dụ: ; if AX<0 CMP AX,0 JNL END_IF ; no , exit ;then NEG AX ; yes , change sign END_IF :
- Biểu diễn ngôn ngữ cấp cao (tt) Cấu trúc IF – THEN – ELSE – END IF IF condition is true MOV AH,2 ; prepare THEN ;if AL<=BL exec true branch statements CMP AL,BL ;AL<=BL? JNBE ELSE_ ; no, display BL ELSE ;then exec false branch statements MOV DL,AL END_IF JMP DISPLAY ELSE_: IF AL<= BL MOV DL,BL THEN DISPLAY: display AL INT 21H ELSE END_IF : display character in BL END_IF
- Biểu diễn ngôn ngữ cấp cao (tt) Cấu trúc CASE ; case AX CMP AX,0 ;test AX CASE expression JL NEGATIVE ;AX 0 NEGATIVE: MOV BX,-1 value_n : Statements_n JMP END_CASE ZERO: CASE AX MOV BX,0 JMP END_CASE 0 put 1 in BX JMP END_CASE END_CASE :
- Biểu diễn ngôn ngữ cấp cao (tt) Rẽ nhánh với tổ ;read a character MOV AH,2 hợp điều kiện INT 21H ; character in AL Condition_1 AND ; IF ( ‘A’ =‘A’? JNGE END_IF ; no, exit Condition_1 OR CMP AL,’Z’ ; char <=‘Z’? Condition_2 JNLE END_IF ; no exit ; then display it Read a character ( into AL) MOV DL,AL MOV AH,2 IF ( ‘A’<= character ) AND ( INT 21H charater <= ‘Z’) THEN END_IF: display character END_IF
- Biểu diễn ngôn ngữ cấp cao (tt) ;read a character Rẽ nhánh với tổ MOV AH,2 INT 21H ; character in AL hợp điều kiện ; IF ( character =‘y’ ) OR ( charater = ‘Y’) CMP AL,’y’ ; char =‘y’? Condition_1 AND JE THEN ; yes , display it Condition_2 CMP AL,’Y’ ; char =‘Y’? Condition_1 OR JE THEN ; yes , display it Condition_2 JMP ELSE_ ; no , terminate THEN : Read a character ( into AL) MOV DL,AL IF ( character =‘Y’) OR ( MOV AH,2 INT 21H character=‘y’) THEN JMP END_IF dispplay it ELSE_: ELSE MOV AH,4CH terminate the program INT 21h END_IF END_IF :
- Biểu diễn ngôn ngữ cấp cao (tt) Cấu trúc lặp FOR LOOP destination_label Lặp khi CX khác 0 Số đếm trong thanh ghi CX giảm đi 1 Mẫu thực hiện lệnh LOOP MOV CX,20 ; gán cho cho CX số lần lặp là 20 TOP: ; thân vòng lặp ở đây LOOP TOP ; các lệnh tiếp theo sau vòng lặp
- Cấu trúc lặp FOR (tt) LOOP luôn thực hiện ít nhất 1 lần CX = 0 lặp FFFFh lần Tránh bằng lệnh JCXZ (Jump if CX is Zero) MOV CX, ; gán cho cho CX số lần lặp JCXZ SKIP TOP: ; thân vòng lặp ở đây LOOP TOP SKIP: ; các lệnh tiếp theo sau vòng lặp
- Biểu diễn ngôn ngữ cấp cao (tt) Cấu trúc lặp WHILE Kiểm tra và lặp chỉ khi điều kiện còn đúng MOV DX,0 ; DX để đếm skt MOV AH,1 ; hàm nhập kí tự INT 21h ; kí tự ở AL Ví dụ: WHILE_: Đếm số kí tự CMP AL,0DH ; nếu kt=CR nhập trên cùng JE END_WHILE ; đúng, thoát INC DX ; DX tăng 1 1 hàng (cho INT 21h ; đọc kt tiếp đến khi gặp kí JMP WHILE_ ; lặp tự CR) END_WHILE :
- Biểu diễn ngôn ngữ cấp cao (tt) Cấu trúc lặp REPEAT UNTIL Thực hiện công việc và kiểm tra điều kiện, nếu điều kiện vẫn sai thì lặp lại. Ví dụ viết đoạn mã nhập vào kí tự cho đến khi gặp kí tự khoảng trắng . MOV AH,1 ; đọc kí tự REPEAT_: INT 21h ; kí tự ở AL ;until CMP AL,’ ‘ ; AL=‘ ‘? JNE REPEAT_ ;các lệnh tiếp theo sau vòng lặp