Các tập lệnh code Assembly, Study notes of Computer science

I, CÁC LỆNH TRAO ĐỔI DỮ LIỆU 1, MOV: lệnh gán giá trị  cú pháp: MOV đích, gốc  chức năng: đích = gốc  VD: MOV AL, BL; AL = BL MOV CX, 123FH; CX = 123FH MOV DL, [DI]; DL = [DS:DI] 2, LEA: lệnh gán địa chỉ hiệu dụng  cú pháp: LEA đích, gốc  chức năng: nạp địa chỉ của gốc vào đích  trong đó:  đích thường là một trong số các thanh ghi: BX, DX, BP, SI, DI  gốc là tên biến trong đoạn DS được chỉ rõ trong lệnh hoặc ô nhớ cụ thể  VD: LEA SI, a; nạp địa chỉ biến a vào thanh ghi SI LEA CX, [BX]; nạp địa chỉ ô nhớ có địa chỉ [DS:BX] vào CX (hay CX = BX) 3, PUSH: đẩy giá trị vào ngăn xếp  cú pháp: PUSH gốc  chức năng: đẩy giá trị của gốc vào ngăn xếp  VD: PUSH AX; đẩy giá trị của AX vào ngăn xếp PUSH 0ah; đẩy giá trị 0ah vào ngăn xếp4, POP: lấy giá trị từ ngăn xếp  cú pháp: POP gốc  chức năng: lấy giá trị trên cùng của ngăn xếp và gán vào gốc  VD: POP AX; lấy giá trị trên cùng của ngăn xếp và gán vào AX

Typology: Study notes

2024/2025

Uploaded on 06/07/2025

hoang-ha-huy
hoang-ha-huy 🇭🇰

1 document

1 / 46

Toggle sidebar

This page cannot be seen from the preview

Don't miss anything!

bg1
Danh sách tập lệnh thường xuyên sử dụng của 8086
I, CÁC LỆNH TRAO ĐỔI DỮ LIỆU
1, MOV: lệnh gán giá trị
cú pháp: MOV đích, gốc
chức năng: đích = gốc
VD:
MOV AL, BL; AL = BL
MOV CX, 123FH; CX = 123FH
MOV DL, [DI]; DL = [DS:DI]
2, LEA: lệnh gán địa chỉ hiệu dụng
cú pháp: LEA đích, gốc
chức năng: nạp địa chỉ của gốc vào đích
trong đó:
đích thường là một trong số các thanh ghi: BX,
DX, BP, SI, DI
gốc là tên biến trong đoạn DS được chỉ rõ trong
lệnh hoặc ô nhớ cụ thể
VD:
LEA SI, a; nạp địa chỉ biến a vào thanh ghi SI
LEA CX, [BX]; nạp địa chỉ ô nhớ có địa chỉ
[DS:BX] vào CX
(hay CX = BX)
3, PUSH: đẩy giá trị vào ngăn xếp
cú pháp: PUSH gốc
chức năng: đẩy giá trị của gốc vào ngăn xếp
VD:
PUSH AX; đẩy giá trị của AX vào ngăn xếp
PUSH 0ah; đẩy giá trị 0ah vào ngăn xếp
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12
pf13
pf14
pf15
pf16
pf17
pf18
pf19
pf1a
pf1b
pf1c
pf1d
pf1e
pf1f
pf20
pf21
pf22
pf23
pf24
pf25
pf26
pf27
pf28
pf29
pf2a
pf2b
pf2c
pf2d
pf2e

Partial preview of the text

Download Các tập lệnh code Assembly and more Study notes Computer science in PDF only on Docsity!

Danh sách tập lệnh thường xuyên sử dụng của 8086 I, CÁC LỆNH TRAO ĐỔI DỮ LIỆU 1, MOV: lệnh gán giá trị  cú pháp: MOV đích, gốc  chức năng: đích = gốc  VD: MOV AL, BL; AL = BL MOV CX, 123FH; CX = 123FH MOV DL, [DI]; DL = [DS:DI] 2, LEA: lệnh gán địa chỉ hiệu dụng  cú pháp: LEA đích, gốc  chức năng: nạp địa chỉ của gốc vào đích  trong đó:  đích thường là một trong số các thanh ghi: BX, DX, BP, SI, DI  gốc là tên biến trong đoạn DS được chỉ rõ trong lệnh hoặc ô nhớ cụ thể  VD: LEA SI, a; nạp địa chỉ biến a vào thanh ghi SI LEA CX, [BX]; nạp địa chỉ ô nhớ có địa chỉ [DS:BX] vào CX (hay CX = BX) 3, PUSH: đẩy giá trị vào ngăn xếp  cú pháp: PUSH gốc  chức năng: đẩy giá trị của gốc vào ngăn xếp  VD: PUSH AX; đẩy giá trị của AX vào ngăn xếp PUSH 0ah; đẩy giá trị 0ah vào ngăn xếp

4, POP: lấy giá trị từ ngăn xếp  cú pháp: POP gốc  chức năng: lấy giá trị trên cùng của ngăn xếp và gán vào gốc  VD: POP AX; lấy giá trị trên cùng của ngăn xếp và gán vào AX II, CÁC PHÉP TOÁN 1, Add: cộng 2 toán hạng  cú pháp: add đích, gốc  chức năng: Đích = Đích + gốc  VD: Add AL, 74H; AL = AL + 74H Add CL, AL; CL = CL + AL Add DL, [SI] DL = DL + [DS:SI] 2, SUB: trừ hai toán hạng  cú pháp: sub đích,gốc  chức năng: đích = đích - gốc  VD: sub AL, 74H; AL = AL - 74H sub CL, AL; CL = CL - AL sub DL, [SI] DL = DL - [DS:SI] 3, MUL: nhân hai toán hạng  cú pháp: mul gốc  chức năn g:  với gốc là số 8 bit: AX = AL x Gốc  với gốc là số 16 bit: DXAX = AX x gốc  VD: mul CL; AX = AL x CL mul BX; DXAX = AX x BX

 VD:

DEC AL; AL = AL - 1

DEC BX; BX = BX - 1

6, INC: tăng thêm 1  cú pháp: INC đích  chức năng: đích = đích + 1  VD:  INC AL; AL = AL + 1  INC BX; BX = BX + 1 7, NEG: đảo dấu  cú pháp: NEG đích  chức năng: đích = 0 - đích  VD: NEG AL; AL = -AL; III, MỘT SỐ LỆNH SO SÁNH BIT: 1, AND:  cú pháp: and đích, gốc  chức năng: đích = đích & gốc  thường dùng để lấy đi một số bit nhất định của một toán hạng  VD: AND AL, 0FH; lấy 4 bit cao của AL (VD: AL = 1011 0111 -> AL = 0000 0111) 2, OR:  cú pháp: or đích, gốc  chức năng: đích = đích | gốc  thường dùng để lập 1 số bit của toán hạng  VD: OR AL, F0H; biến 4 bit đầu của AL thành 1 (VD: AL = 1001 1011 -> AL = 1111 1011) 3, XOR:

 cú pháp : xor đích, gốc  chức năng: đích = đích ^ gốc  thường dùng để xoá một toán hạng về 0 bằng cách XOR với chính nó  có thể dùng để đảo bit  VD: XOR BL, BL; BL = BL ^ BL = 0000 0000 XOR AL, BL; AL = AL ^ BL (VD: AL = 1011 0110, BL = 1111 1111 -> AL = 0100

4, CMP:  cú pháp: CMP đích, gốc  chức năng: so sánh hai toán hạng đích và gốc  sau khi so sánh hai toán không thay đổi, không lưu kết quả so sánh, lệnh chỉ tác động đến các cờ của thanh ghi FR  thường dùng để tạo cờ cho các lệnh nhảy IV, CÁC LỆNH DỊCH VÀ QUAY 1, ROL: quay trái (chiều ngược kim đồng hồ)  cú pháp: ROL đích, CL  chức năng: quay toán hạng sang trái CL bit  trong trường hợp chỉ quay 1 bit thì có thể viết như sau: ROL đích, 1  VD: ROL BL, CL; quay trái BL CL bit (VD: BL = 1000 000, CL = 2 -> BL = 0000 0010) ROL AL, 1; quay trái AL 1 bit (VD: AL = 1000 0000 -> AL = 0000 0001) 2, ROR: quay phải (chiều kim đồng hồ)  cú pháp: RỎ đích, CL  chức năng: quay phải toán hạng sang phải CL bit  trong trường hợp chỉ quay 1 bit thì có thể viết như sau:

1, JMP (Jump): nhảy không điều kiện 2, JG (Jump if Greater): nhảy nếu lớn hơn 3, JNG (Jump if Not Greater): nhảy nếu không lớn hơn (nhảy nếu bé hơn hoặc bằng) 4, JLE (Jump if Lower or Equal): tương tự JNG 5, JL (Jump if Lower): nhảy nếu bé hơn 6, JNL (Jump if Not Lower): Nhảy nếu không bé hơn (nhảy nếu lớn hơn hoặc bằng) 7, JGE (Jump if Greater or Equal): tương tự JNL 8, JE (Jump if Equal): nhảy nếu bằng 9, JNE (Jump if Not Equal): nhảy nếu không bằng 10, JZ (Jump if Zero): nhảy nếu bằng 0 (lệnh này tương tự JE) 11, JNZ (Jump if Not Zero): nhảy nếu khác 0 (lệnh này tương tự JNE) 12, JS (Jump if Signed): nhảy nếu có dấu (nhảy nếu SF == 1) 13, JNS (Jump if Not Signed): nhảy nếu không có dấu (nhảy nếu kết quả dương) (nhảy nếu SF == 0) 12, JC (Jump if Carry): nhảy nếu có nhớ (nhảy nếu CF == 1) 13, JNC (Jump if Not Carry): nhảy nếu không có nhớ (nhảy nếu CF == 0) 12, JO (Jump if Overflow): nhảy nếu tràn (nhảy nếu OF == 1) 13, JNO (Jump if Not Overflow): nhảy nếu không tràn (nhảy nếu OF == 0) VD: CMP AL, BL; so sánh AL và BL JE bangnhau; nhảy đến nhãn bangnhau nếu kết quả bằng nhau (AL == BL) CMP [SI], CL; so sánh [DS:SI] và CL JG lonhon nhảy đến nhãn lonhon nếu kết quả lớn hơn ([DS:SI] > CL)

SUB AL, AH; AL = AL - AH

JZ bangkhong nhảy đến nhãn bangkhong nếu kết quả bằng 0 (AL - AH == 0) CMP AL, 00H; so sánh AL với 00H JS am; nhảy đến nhãn am nếu có dấu (SF ==

  1. (AL < 0) ADD AL, AH; AL = AL + AH JO tran nhảy đến nhãn tran nếu có tràn (nhảy nếu giá trị AL + AH vượt quá 8 bit) (OF == 1) VI, LỆNH ĐIỀU KHIỂN CỜ: 1, CLD: xoá cờ hướng  cú pháp: CLD  chức năng: DF = 0 2, STD:lập cờ hướng  cú pháp: STD  chức năng: DF = 1 3, CLC: xoá cờ nhớ  cú pháp: CLC  chức năng: CF = 0 4, STC: lập cờ nhớ  cú pháp: STC  chức năng: CF = 1 5, CMC: đảo cờ nhớ  cú pháp: CMC  chức năng: CF = !CF (CF = 0 -> CF = 1; CF = 1 -> CF = 0) VII, CÁC LỆNH Di CHUYỂN CHUỖI 1, LODSB/LODSW:  cú pháp:

3, Ngắt loại 9: hiện xâu ký tự có ký tự ‘$’ ở cuối  thực hiện khi AH = 9  chức năng: hiện xâu ký tự có địa chỉ lệch là giá trị của DX  VD: tb BD ‘co lam thi moi co an$’; khai báo xâu ký tự tb MOV AH, 9; AH = 9 LEA DX, tb; gán địa chỉ lệch của tb vào DX INT 21H; màn hình in ra xâu tb (ko hiện ký tự ‘$’) 4, Ngắt chương trình (ngắt 4CH): dừng chương trình  thực hiện khi AH = 4CH  chức năng: dừng chương trình  VD: MOV AH, 4CH; AH = 4CH INT 21H; dừng chương trình Chương trình hợp ngữ của 8086 IX, KHAI BÁO BIẾN, HẰNG, MẢNG, CHUỖI KÝ TỰ 1, biến  cú pháp: <tên biến> <kiểu dữ liệu> <giá trị khởi đầu>  trong đó:  tên biến: là tên của biến  kiểu dữ liệu: là miền giá trị của biến, có 3 kiểu dữ liệu: DB (define byte): biến byte, độ dài 8 bit DW (define word): biến word, độ dài 16 bit DD (define double word): biến double word, độ dài 32 bit

 giá trị khởi đầu: là giá trị được gán vào khi biến được khởi tạo. Nếu muốn khởi tạo biến mà không có giá trị ban đầu, sử dụng ký tự ‘?’  VD: B1 DB 16; khởi tạo biến B1 có giá trị là 16 x DW ff0ah; khởi tạo biến x có giá trị là ff0ah y DB ?; khởi tạo biến y không có giá trị ban đầu 2, mảng  cú pháp <tên mảng> <kiểu dữ liệu> <giá trị 1>,<giá trị 2>,...  trong đó:  tên mảng: là tên của mảng  kiểu dữ liệu: là miền giá trị của các phần tử trong mảng, có 3 kiểu dữ liệu: DB (define byte): biến byte, độ dài 8 bit DW (define word): biến word, độ dài 16 bit DD (define double word): biến double word, độ dài 32 bit  giá trị 1, giá trị 2,...: là giá trị được gán vào khi các biến được khởi tạo. Nếu muốn khởi tạo biến mà không có giá trị ban đầu, sử dụng ký tự ‘?’. Nếu muốn khởi tạo nhiều biến có cùng 1 giá trị, sử dụng lệnh: <số lượng phần tử> DUP(<giá trị>) lệnh DUP có thể lồng nhau.  VD: mang DB 1,2,3,4,5,6,7; khởi tạo mảng có 7 phần tử có gtrị từ 1 đến 7 dl DB 100 DUP(?); khởi tạo mảng có 100 phần tử chưa có giá trị

MSG DB a2, ‘World$’; khai báo MSG = ‘Hello World$’ X, CẤU TRÚC MỘT CHƯƠNG TRÌNH HỢP NGỮ (.EXE)  Khung cơ bản của 1 chương trình: .Model .Stack .Data .Code 1, Khai báo quy mô sử dụng bộ nhớ (.Model):  cú pháp: .model <kiểu kích thước bộ nhớ>  Dùng để mô tả kích thước đoạn mã và đoạn dữ liệu của chương trình:  Tiny: Mã lệnh và mã dữ liệu gói gọn trong một đoạn  Small: Mã lệnh gói gọn trong một đoạn, dữ liệu nằm trong một đoạn  Medium: Mã lệnh không gói gọn trong một đoạn, dữ liệu nằm trong một đoạn  Compact: Mã lệnh không gói gọn trong một đoạn, dữ liệu không gói gọn trong một đoạn  Large: Mã lệnh không gói gọn trong một đoạn, dữ liệu không gói gọn trong một đoạn, không có mảng nào lớn hơn 64KB  Huge: Mã lệnh không gói gọn trong một đoạn, dữ liệu không gói gọn trong một đoạn, các mảng có thể lớn hơn 64KB  Với các bài tập hiện tại thì cứ auto small  VD: .model small; khai báo kiểu kích thước bộ nhớ là small .model tiny; khai báo kiểu kích thước bộ nhớ là tiny 2, Khai báo ngăn xếp (.stack):

 cú pháp: .stack <kích thước>  dùng để khai báo độ lớn ngăn xếp dùng cho chương trình  nếu không khai báo kích thước, chương trình dịch sẽ tự động gán cho kích thước là 1KB, kích thước này là quá lớn so với nhu cầu bình thường, của các bài toán. Trong thực tế, chỉ cần dùng từ 100-256 byte là đủ nên ta có thể khai báo như sau: .stack 100 3, khai báo đoạn dữ liệu (.data):  cú pháp: .data <khai báo biến 1> <khai báo biến 2> …  tất cả các biến, mảng, xâu đều phải khai báo ở đây. Nên khai báo hằng ở đây dù có thể khai báo hằng trong đoạn mã.  VD: .data tb1 DB ‘moi nhap xau:$’ tb2 DB ‘xau ma ban vua nhap la:$’ x DB? CR DB 13 LF EQU 10 4, khai báo đoạn mã (.code):  là nơi chứa mã lệnh của chương trình. gồm chương trình chính và các chương trình con (nếu có).

END MAIN

 trong đó, đoạn: MOV AX, @data MOV DS, AX có tác dụng nạp các biến đã được khai báo trong đoạn dữ liệu (.code) vào thanh ghi đoạn DS. Vì lý do kỹ thuật, không thể gán trực tiếp @data vào trong DS. vì vậy, cần phải sử dụng thanh ghi đa năng AX làm trung gian (có thay thay AX bằng thanh ghi khác). XI, MỘT SỐ BÀI TẬP VÍ DỤ (BẮT ĐẦU TỪ TRANG SAU) VD1: Nhập vào 1 xâu từ bàn phím và in ra xâu đó: .model small .stack 100 .data tb1 DB 'moi ban nhap xau: $' tb2 DB 'xau ban vua nhap la: $' CRLF DB 13, 10, '$' xau DB? .code main proc mov ax, @data mov ds, ax mov ah, 9 lea dx, tb int 21h lea si, xau [xau]=1000,xau=0 consol moi ban nhap vao sau mov ah, 1 doc: int 21h cmp al, 13

je tiep mov [si], al inc si jmp doc tiep: mov [si], '$' mov ah, 9 lea dx, CRLF ⇒ hiển thị thông báo 1 và có enter ra màn hình int 21h ⇒ hiển thị ra màn hình được xâu “enter“ lea dx, tb int 21h⇒ hiển thị ra màn hình được xâu tb2 “ xâu b nhập là” lea dx, xau int 21h ⇒ hiển thị ra màn hình xâu xau ”$“ mov ah, 4ch int 21h main endp end main VD2: Nhập vào một xâu, kiểm tra xem xâu đó có đối xứng hay không .model small .stack 100 .data tb1 DB 'moi ban nhap xau: $' dxung DB 'xau ban vua nhap doi xung$' kdxung DB 'xau ban vua nhap khong doi xung$' CRLF DB 13, 10, '$' xau DB? .code main proc

cmp si, di jge doixung jmp kiemtra doixung: mov ah, 9 lea dx, dxung int 21h jmp ketthuc khongdoixung: mov ah, 9 lea dx, kdxung int 21h jmp ketthuc ketthuc: mov ah, 4ch int 21h main endp end main VD3: Nhập vào một xâu, in ra xâu đã in hoa các chữ cái thường (số và ký tự đặc biệt giữ nguyên) .model small .stack 100 .data tb1 DB 'moi ban nhap xau: $' tb2 DB 'xau cua ban sau khi in hoa: $' CRLF DB 13, 10, '$' xau DB? .code main proc mov ax, @data mov ds, ax

mov ah, 9 lea dx, tb int 21h mov cx, 0 lea si, xau mov ah, 1 doc: int 21h cmp al, 13 je tiep mov [si], al inc si inc cx jmp doc tiep: mov ah, 9 lea dx, CRLF int 21h lea dx, tb int 21h mov ah, 2 lea si, xau duyet: mov bl, [si] cmp bl, 'a' jl tieptuc cmp bl, 'z' jg tieptuc sub bl, 32 tieptuc: mov dl, bl