Bài giảng Kiến trúc máy tính - Chương 6: Các lệnh hợp ngữ

pdf 34 trang ngocly 180
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:

  • pdfbai_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ữ

  1. CÁC LỆNH HỢP NGỮ
  2. 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
  3. 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ờ
  4. 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
  5. 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
  6. Ả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)
  7. 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
  8. 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ỉ.
  9. 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 ?,’$’ ;
  10. .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 ;
  11. ;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
  12. 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
  13. 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
  14. 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
  15. 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ự?
  16. 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
  17. 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
  18. 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
  19. 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
  20. 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
  21. 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
  22. 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?
  23. 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
  24. 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 :
  25. 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
  26. 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 :
  27. 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
  28. 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 :
  29. 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
  30. 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
  31. 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 :
  32. 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