1. Trang chủ
  2. » Kỹ Thuật - Công Nghệ

Tự học lập trình assembly

65 1,6K 5

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 65
Dung lượng 159,67 KB

Nội dung

HAY HOC LAP TRINH ASEMBLY NGAY HOM NAY. VO NO LA MOT NGON NGU LAP TRINH MUC THAP CO UH DUNG RAT NHIEU TRONG LINH VUC DIEN TU VOI LAP TRINH PHAN CUNG. VA DO BAO MAT RAT CAO.VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV

Tự học lập trình Assembly - Bài 1: Bước đầu với lập trình Assembly vi xử lý Intel 8086/8088 BƯỚC ĐẦU VỚI LẬP TRÌNH ASSEMBLY TRÊN VI XỬ LÝ 8088/8086 Giới thiệu Hợp ngữ: Hợp ngữ (Assembly) ngôn ngữ lập trình cấp thấp, thực chất dạng gợi nhớ (Mnemonic), hay dạng kí hiệu, ngôn ngữ máy Như biết, lệnh ngôn ngữ máy dãy số 0, nên khó đọc khó lập trình, nhà thiết kế vi xử lý đưa tập lệnh hợp ngữ gần với ngôn ngữ tự nhiên nên dễ đọc dễ lập trình Tuy vậy, lệnh hợp ngữ giao tiếp với phần cứng máy tính cách chặt chẽ, nhờ việc tiếp cận với lập trình hợp ngữ giúp hiểu rõ kiến trúc tổ chức hoạt động máy tính Ngoài giúp thấy rõ mối quan hệ thành phần chức bên máy tính hệ điề hành Có thể nói ngược lại là, việc tìm hiểu lập trình hợp ngữ giúp hiểu rõ kiến trúc máy tính, tổ chức hoạt động bên máy tính hệ điều hành Trong giới hạn tài liệu tìm hiểu tập lệnh hợp ngữ vi xử lý họ Intel 8088/8086, để lập trình chạy máy IBM-PC: Sử dụng họ vi xử lý hoạt động phối hợp với hệ điều hành MS_DOS Một đặc điểm hợp ngữ chương trình viết có kích thước nhỏ tốc độ nạp/thực chương trình nhanh so với viết (chương trình chức năng) ngôn ngữ lập trình bậc cao Ngoài ra, hầu hết ngôn ngữ lập trình bậc cao cho phép viết (“nhúng”) mã lệnh hợp ngữ Điều giúp người lập trình khai thác tối đa mạnh ngôn ngữ lập trình, hợp ngữ mạnh thao tác can thiệp sâu vào thành phần bên hệ thống, ngôn ngữ bậc cao mạnh thao tác xử lý liệu thiết kế giao diện Như thuận lợi sử dụng ngôn ngữ bậc cao để viết chương trình xử lý thông tin hệ thống, nhiệm vụ truy xuất hệ thống (thanh ghi, nhớ, cổng vào/ra, thiết bị, ) để lấy liệu giao cho đoạn mã lệnh hợp ngữ nhúng chương trình Hợp ngữ hỗ trợ chế độ tương tác hệ thống: (1) Nhập trực tiếp lệnh/đoạn lệnh vào nhớ cho phép thực nhớ mà không cần qua bước biên dịch chương trình Chương trình gỡ rối Debug (đi kèm hệ điều hành MS_DOS: Debug.exe) chương trình hỗ trợ chế độ cho hợp ngữ 16 bít; (2) Viết chương trình hợp ngữ, sau sử dụng chương trình biên dịch để dịch sang chương trình thực thi (dạng EXE COM) cho thực chương trình Hiện có hai loại trình biên dịch sử dụng để biên dịch chương trình hợp ngữ (từ tập lệnh hợp ngữ vi xử lý họ Intel) sang chương trình thực thi: Trình biên dịch hợp ngữ 16 bít, MASM (Macro Assembler), sử dụng để dịch thành chương trình chạy hệ điều hành 16 bít MS_DOS; Trình biên dịch hợp ngữ 32 bít, MASM32 (Macro Assembler 32 bít), sử dụng để dịch thành chương trình chạy hệ điều hành 32 bít MS_Windows Trong thực tế, để chuyển chương trình hợp ngữ sang dạng chương trình thực thi EXE 16 bít COM 16 bít cần phải có hỗ trợ chương trình tiện ích hệ điều hành MS_DOS: Link (Link.exe) EXE2Bin (EXE2Bin.com) Chương trình hợp ngữ 16 bít sử dụng hệ thống ngắt mềm (Interrupt) BIOS DOS thư viện lập trình nó, chương trình hợp ngữ 32 bít sử dụng tập hàm API làm thư viện lập trình Biến – Hằng chương trình hợp ngữ: Biến Biến (hằng có tên) chương trình hợp ngữ có tính chất, mục đích sử dụng, kiểu liệu, quy tắc đặt tên, quy tắc gán giá trị, tương tự biến ngôn ngữ lập trình bậc cao khác Biến chương trình hợp ngữ có kiểu liệu là: Byte, Word, Doubleword, chương trình hợp ngữ số, kí tự xâu kí tự Khi viết chương trình hợp ngữ cần quan tâm đến địa biến nhớ Một biến khai báo chương trình hệ thống gán cho địa nhớ (khi chương trình nạp vào nhớ để hoạt động) Cụ thể: biến chương trình định vị địa xác định nhớ, biến khai báo liên tiếp chương trình (từ xuống dưới) định vị địa liên tiếp nhớ (từ offset thấp đến offset cao) Nhờ đó, chương trình xác định địa biến dễ dàng có địa nội dung biến khác chương trình Khác với biến, chương trình hợp ngữ không cấp phát nhớ để lưu trữ, tức là, nơi chương trình chứa trình biên dịch thay giá trị cách trực tiếp Hợp ngữ cung cấp toán tử giả để định nghĩa/khai báo liệu: DB (định nghĩa byte), DW (định nghĩa word), DD (định nghĩa doubleword), Và toán tử EQU để khai báo Biến khai báo đầu cuối chương trình Trong đó, khai báo nơi đâu chương trình, ta sử dụng toán tử dấu “=” để gán giá trị cho Khai báo biến – hằng: Cú pháp khai báo: • • • • a: b: c: d: DB DW DD EQU Trường hợp a sử dụng để khai báo biến kiểu byte, trường hợp b sử dụng để khai báo biến kiểu word, trường hợp c sử dụng để khai báo biến kiểu doubleword, trường hợp d sử dụng để khai báo nhiều giá trị, số, kí tự xâu kí tự, dấu hỏi chấm (“?”) số, kí tự hay xâu kí tự Ví dụ 1: • • • • • Spt KiTu TieuDe SoNguyen DaySo DB DB DB DW DD ‘a’ ‘Tin hoc’ ? 1020, 1345, 2389, 5763 Trong ví dụ trên, hai biến Spt Kitu biến kiểu byte, kích thước 1byte BiếnTieuDe biến kiểu byte gồm byte ô nhớ liên tiếp (kích thước byte), byte chứa kí tự ASCII Biến SoNguyen biến kiểu word, chưa gán giá trị khởi tạo Biến DaySo biến kiểu doubleword, gồm phần tử có giá trị (từ thấp đến cao) là: 1020, 1345, 2389, 5763 Ví dụ 2: • • • LF TB TieuDe EQU EQU DB 0Ah ‘Cong nghe Thong tin’ TB Khai báo cho thấy, khởi tạo giá trị ban đầu cho biến thông qua định nghĩa trước Ví dụ 3: TenKhoa DB ‘Cong nghe Thong tin’, 0Ah, 0Dh, ‘$’ Khai báo biến TenKhoa cho thấy, khai báo biến mà bao gồm số, kí tự xâu kí tự, biến kiểu byte, gồm 22 byte Ví dụ 4: SoPT DW 2345h Biến SoPT biến word, trường hợp byte thấp nhận giá trị 45h, byte cao nhận giá trị 23h, byte thấp định vị địa SoPT, byte cao định vị địa SoPT + Trong hợp ngữ, dãy byte hay word liên tiếp nhớ xem mảng (mảng byte hay mảng word) Biến DaySo ví dụ xem mảng word gồm phần tử Giá trị phần tử mảng xác định thông qua tên biến số tương ứng (địa chỉ) Cụ thể: DaySo[0] = 1020; DaySo[2] = 1345; DaySo[4] = 2389; DaySo[6] = 5763 Hợp ngữ cho phép sử dụng toán tử DUP để khai báo biến dạng mảng mà gồm nhiều phần tử có giá trị khởi tạo Dạng sử dụng toán tử DUP m Dup (n): gồm m phần tử có giá trị khởi tạo n Ví dụ 5: MangSN DW 23, 45, 50 Dup (0), 12 Như vậy, biến MangSN xem mảng word gồm 53 phần tử, hai phần tử nhận giá trị 23 45, 50 phần tử nhận giá trị phần tử cuối nhận giá trị 12 Trong ví dụ trên: Các biến khai báo định vị địa liên tiếp nhớ Nếu biến Spt định vị địa offset 100 đoạn nhớ liệu biến định vị offset sau Cụ thể: Biến KiTu bắt đầu offset 101, biến TieuDe bắt đầu offset 102, biến SoNguyen định vị offset 109, biến DaySo bắt đầu offset 111 (xem hình sau): 100 101 102 103 104 105 106 107 108 a T i n _ H o 109 111 c 1020 113 1345 115 2389 117 5763 (dòng địa offset biến, dòng ô nhớ chứa giá trị phần tử biến) Điều cần quan tâm là, truy xuất đến giá trị phần tử biến thông qua tên biến khác Ví dụ: Spt[0] = 0, TieuDe[0] = ‘T’, TieuDe[1] = ‘’i, DaySo[0] = 1020, DaySo[6] = 5763, Spt[2] = KiTu[1] = ‘T’, KiTu[5] = ‘h’, DaySo[-5] = ‘h’, TieuDe[11] = 1345, Tự học lập trình Assembly - Bài 2: Biên dịch chương trình Assembly chạy môi trường hệ điều hành 16bit Thứ Năm, 29/08/2013 18:47 Bài viết hướng dẫn sử dụng chương trình biên dịch 16 bít: Microsoft MacroAssembler A86 MacroAssembler V4.05 để dịch chương trình hợp ngữ (*.asm) sang chương trình thực thi (*.exe *.com), chạy hệ điều hành MS_DOS: · Chương trình A86 Macro Assembly (tập tin là: A86.com) thường sử dụng để dịch chương trình hợp ngữ sang chương trình thực thi dạng COM · Chương trình Macro Assembly (tập tin là: MASM.exe) thường sử dụng để dịch chương trình hợp ngữ sang chương trình thực thi dạng EXE Tuy nhiên, MASM dịch tập tin chương trình hợp ngữ sang dạng tập tin đối tượng mã máy dạng Obj Để chuyển tập tin Obj sang tập tin chương trình thực thi EXE ta phải sử dụng chương trình liên kết MSDOS, Link.exe Để chuyển tập tin thực thi dạng EXE sang tập tin thực thi dạng COM ta phải sử dụng thêm chương trình khác MS_DOS, EXE2Bin.com Có thể sử dụng tập tin TASM.Exe TLINK.Exe để thay cho MASM.exe Link.exe Các tập tin này, tập tin EXE2Bin.com, tìm thấy chương trình Turbo Pascal Chức tập tin biên dịch hợp ngữ liên quan: • • • Tập tin MASM.exe/TASM.exe: Hỗ trợ dịch chương trình hợp ngữ nguồn sang tập tin mã máy dạng Obj tương ứng Tập tin Link.exe/TLink.exe: Hỗ trợ liên kết tập tin mã máy, dạng tập tin đối tượng (*.Obj), thành tập tin thực thi dạng EXE Tập tin EXE2Bin.exe: Hỗ trợ chuyển tập tin EXE, viết theo cấu trúc dạng COM, thành tập tin thực thi dạng COM MASM dịch tập tin chương trình hợp ngữ sang tập tin: tập tin đối tượng (*.Obj), tập tin liệt kê thông tin (*.Lst), tập tin tham khảo chéo (*.Crf) • • • Tập tin đối tượng (Object File): Chứa bảng dịch mã máy lệnh chương trình nguồn hợp ngữ, thông tin cần thiết để tạo nên tập tin thực thi Đây tập tin để tạo nên tập tin thực thi Tập tin liệt kê thông tin (List File): Là tập tin văn cho biết địa offset lệnh đoạn Code; mã lệnh lệnh chương trình; danh sách tên/nhãn dùng chương trình; thông báo lỗi số thông tin khác Đây tập tin sở hỗ trợ việc gỡ rối chương trình Tập tin tham khảo chéo (Cross Reference File): Liệt kê tên sử dụng chương trình dòng mà chúng xuất Hầu hết chương trình biên dịch hợp ngữ 16 bít không hỗ trợ hình soạn thảo chương trình Nhưng, cho phép sử dụng chương trình/màn hình soạn thảo đó, Turbo Pascal, C,…, để viết chương trình Chúng ta sử dụng chương trình soạn thảo Notepad Windows (Windows XP) để viết chỉnh sửa chương trình hợp ngữ, trường hợp ta nên đặt phần mở rộng cho tập tin chương trình asm (*.asm) Sử dụng A86 để dịch chương trình hợp ngữ sang chương trình dạng COM: - Trước hết, bạn nên viết chương trình hợp ngữ theo cấu trúc chương trình dạng COM lưu tập tin với phần tên mở rộng asm Các bạn nên đặt tập tin chương trình hợp ngữ cần dịch thư mục với tập tin dịch a86.com Ở giả sử chúng đặt E:\ASSEM - Sử dụng A86 để biên dịch chương trình: Cú pháp : A86 [đường dẫn]; Ví dụ: E:\>\ASSEM\A86 In_Ascii.asm Trên môi trường hệ điều hành Windows bạn phải chuyển cửa sổ MSDOS (Cmd) để thực việc biên dịch Nếu chương trình lỗi hình xuất thông báo sau: Thông báo cho biết việc biên dịch chương trình thành công Tập tin chương trình hợp ngữ In_Ascii.asm dịch thành tập tin chương trình In_Ascii.COM (chính xác hình thành thêm tập tin In_Ascii.COM In_Ascii.SYM) - Nếu chương trình bị lỗi A86 xuất thông báo lỗi sau: Thông báo cho biết, trình biên dịch A86 phát thấy lỗi chương trình In_Ascii.asm, tức là, chưa thể dịch chương trình In_Ascii.asm sang chương trình thực thi Cụ thể: Thông báo “Error message inserted into In_Asscii.asm” cho biết thông báo lỗi chèn vào tập tin chương trình In_Asscii.asm Thông báo “Original source renamed as In_Ascii.OLD” cho biết tập tin chương trình gốc đổi tên thành In_Asscii.OLD Trong trường hợp phải quay chương trình Notepad để mở (Open) lại tập tin chương trình In_Ascii.asm tiến hành tìm chỉnh sửa lỗi Tập tin In_Ascii.asm xuất dòng thông báo lỗi sau: - Sau sửa lỗi ghi lại tiếp tục dịch lại chương trình ban đầu Chúng ta sử dụng kết hợp tập tin Masm.exe, Link.exe EXE2Bin.com để dịch chương trình hợp ngữ viết theo dạng COM thành tập tin thực thi dạng COM Sử dụng MASM để dịch chương trình hợp ngữ sang chương trình dạng EXE: - Trước hết, bạn nên viết chương trình hợp ngữ theo cấu trúc chương trình dạng EXE lưu vào file với phần mở rộng asm - Quá trình biên dịch chương trình gồm bước: Bước 1: Dùng MASM TASM để dịch chương trình hợp ngữ sang tập tin đối tượng ngôn ngữ máy Cú pháp đơn giản sau: Ví dụ: - MASM [đường dẫn] ; - TASM [đường dẫn] ; E:\>\ASSEM\Tasm In_Ascii.asm In_Ascii.obj Nếu chương trình lỗi TASM xuất thông báo Thông báo cho biết trình biên dịch chương trình thành công Tập tin chương trình hợp ngữ In_Ascii.asm dịch sang tập tin đối tượng ngôn ngữ máy In_Ascii.obj Nếu chương trình bị lỗi TASM xuất thông báo lỗi, với số thứ tự dòng chương trình bị lỗi nội dung lỗi hình, thông báo sau cho biết In_Ascii.asm bị lỗi dòng 10 11: Trong trường hợp phải quay chương trình Notepad để mở (Open) lại tập tin chương trình In_Ascii.asm tiến hành tìm chỉnh sửa lỗi Chú ý: Để MASM/TASM tạo tập tin LST CRF biên dịch ta phải viết tên tập tin câu lệnh biên dịch Ví dụ: E:\>\ASSEM\Tasm In_Ascii.asm, In_Ascii.obj, In_Ascii.lst, In_Ascii.crf Với câu lệnh dịch Tasm đồng thời tạo tập tin In_Ascii.obj, In_Ascii.lst, In_Ascii.crf, tập tin thiết cho việc kiểm tra lỗi gỡ rối chương trình Bước 2: Dùng Link Tlink để liên kết nhiều file đối tượng thành file thực thi Cú pháp đơn giản: Ví dụ: LINK [đường dẫn]; TLINK [đường dẫn]; E:\>\ASSEM\TLink In_Ascii.obj; Nếu việc liên kết không bị lỗi (đối với chương trình đơn giản có file đối tượng bước thường không gây lỗi) hình xuất thông báo: Microsoft (R) Overlay Linker Version 3.64 Copyright (c) Microsoft Corp 1981, 1988 All right reserved Thông báo cho biết việc liên kết tập tin đối tượng chương trình thành công Tập tin chương trình hợp ngữ In_Ascii.asm dịch thành tập tin chương trình In_Ascii.exe Sau biên dịch chương trình hợp ngữ thành chương trình thực thi EXE COM tiến hành cho chạy thử chương trình để kiểm tra, kết không mong muốn phải xem thay đổi lại nội dung chương trình sau thực biên dịch trở lại từ đầu Tự học lập trình Assembly - Bài 3: Cấu trúc chương trình Assembly Hầu hết hệ điều hành máy tính nay, đặc biệt hệ điều hành Microsoft, hỗ trợ hai dạng cấu trúc tập tin thực thi hoạt động nó, tập tin cấu trúc dạng COM tập tin cấu trúc dạng EXE Có nhiều điểm khác hai cấu trúc chương trình này, điểm khác biệt lớn là: Các chương trình cấu trúc dạng EXE gồm đoạn: Mã lệnh (Code), liệu (Data) Ngăn xếp (Stack) Khi hoạt động, đoạn nạp vào đoạn (Segment) nhớ tách biệt nhớ; Các chương trình dạng COM ngược lại, có đoạn mã lệnh, chứa mã lệnh ngăn xếp Vì thế, nạp vào nhớ để hoạt động cấp phát đoạn nhớ Rõ ràng kích thước chương trình dạng COM vượt giới hạn đoạn nhớ (với Intel 8088/80286 MSDOS, Segment nhớ = 64KB) Trong chương trình dạng EXE lớn Segment nhớ Do đó, thiết kế chương trình lớn, với chức phức tạp, có liên kết modun chương trình khác ta phải thiết kế theo cấu trúc chương trình dạng EXE Hợp ngữ hỗ trợ thiết kế hai dạng cấu trúc chương trình EXE COM, dạng phù hợp với nhóm trình biên dịch Muốn biên dịch chương trình hợp ngữ sang dạng EXE việc phải viết theo cấu trúc dạng EXE ta cần phải sử dụng trình biên dịch phù hợp Điều tương tự với việc muốn có chương trình thực thi dạng COM Văn chương trình hợp ngữ dạng EXE cho thấy rõ gồm đoạn: Code, Data Stack Tương tự, văn chương trình hợp ngữ dạng COM cho thấy có đoạn: Code, Data Stack (không tường minh) nằm Một chương trình hợp ngữ gồm hai thành phần chính: phần lệnh hợp ngữ phần dẫn biên dịch Chỉ có lệnh biên dịch thành ngôn ngữ máy Phần hướng dẫn biên dịch không dịch sang ngôn ngữ máy, có tác dụng với trình biên dịch Thông thường chương trình biên dịch có nhóm hướng dẫn biên dịch phù hợp với nó, với hướng dẫn biên dịch đơn giản phù hợp với hầu hết trình biên dịch hợp ngữ Trong tài liệu sử dụng hướng dẫn biên dịch phù hợp với trình biên dịch Microsoft Macro Assembler (MASM) Cấu trúc chương trình giới thiệu sau sử dụng hướng dẫn biên dịch định nghĩa đoạn đơn giản (.Model, Code, Stack, Data) phù hợp với MASM, TASM (Turbo Macro Assembler), A86 Việc sử dụng định nghĩa đoạn đơn giản làm cho văn chương trình sáng sủa dễ đọc Với định nghĩa đoạn đơn giản ta xây dựng chương trình từ đơn giản đến phức tạp Cấu trúc chương trình dạng COM: Model Code ORG 100h : JMP PROC Endp End Trong cấu trúc chương trình từ khóa Model, Code, ORG, Proc, Endp, End hướng dẫn biên dịch nhãn lệnh Jmp Cấu trúc cho thấy rõ, chương trình hợp ngữ dạng COM có đoạn, đoạn Code (đoạn mã lệnh), bao gồm phần khai báo liệu Các khai báo liệu chương trình dạng COM đặt đầu cuối chương trình, với việc sử dụng định nghĩa đoạn đơn giản khai báo liệu phải đặt đầu chương trình Chỉ dẫn ORG 100h lệnh JMP đề cập trở lại phần sau tài liệu Cấu trúc chương trình dạng EXE: Model Stack 100h Data Code PROC • Tác dụng: Lệnh Cmp (Compare) sử dụng để so sánh giá trị/nội dung [Toán hạng đích] so với [Toán hạng nguồn] Tương tự lệnh Sub, lấy [Toán hạng đích] trừ [Toán hạng nguồn] kết không làm thay đổi [Toán hạng đích] mà làm thay đổi giá trị số cờ hiệu: CF, ZF, OF, Kết so sánh lệnh Cmp là: [Toán hạng đích] > [Toán hạng nguồn]; [Toán hạng đích] ≥[Toán hạng nguồn]; [Toán hạng đích] < [Toán hạng nguồn]; [Toán hạng đích] ≤[Toán hạng nguồn]; [Toán hạng đích] = [Toán hạng nguồn]; [Toán hạng đích] ≠ [Toán hạng nguồn]; kết tác động (0 →1, 1→0) đến cờ tương ứng cụ thể Do đó, để biết kết so sánh chương trình phải sử dụng lệnh kiểm tra cờ (đó cá lệnh nhảy), chúng phải đặt sau lệnh so sánh Như lệnh Cmp ý nghĩa đứng độc lập Có thể nói ngược lại, lệnh Cmp sử dụng để cung cấp điều kiện nhảy (thay đổi giá trị cờ) cho lệnh nhảy có điều kiện Ví dụ 1: • • • Cmp Cmp Cmp Ax, Bx Ax, 20 Ax, [SI] ; so sánh giá tị ghi Ax với Bx ; so sánh giá trị ghi Ax với 20 ; so sánh Ax với nội dung ô nhớ SI Al, ‘A’ Al, Var1 ; so sánh giá trị ghi Al với ‘A’ ; so sánh giá trị ghi Al với giá trị biến Var1 Ví dụ 2: • • Cmp Cmp Tất cá lệnh Cmp điều ý nghĩa, không cho biết kết so sánh cách trực tiếp mà phải ánh thông qua cờ Lệnh Cmp sử dụng để so sánh kiểm tra giá trị cờ Các lệnh nhảy Lệnh nhảy không điều kiện: Cú pháp: Jmp • • Trong đó: nhãn lệnh, tên thủ tục ghi, ô nhớ (đã định nghĩa) biến đó, giá trị thường địa ô nhớ đoạn Code Tác dụng: Khi gặp lệnh chương trình chuyển điều khiển (nhảy đến) đến thực lệnh sau mà không phụ thuộc vào điều kiện Cơ chế thực lệnh Jmp thay đổi nội dung cặp ghi trỏ lệnh CS:IP CS:IP địa lệnh sau nhớ Lệnh Jmp có dạng: Short, Near Far Đối với dạng Short Far có ghi IP bị thay đổi lệnh thực hiện, ngược lại, với dạng Far, lệnh thực ghi IP ghi đoạn CS bị thay đổi Hay nói cách khác: Đối với dạng Short Near lệnh Jmp phải nằm Segment nhớ, ngược lại, với dạng Far lệnh Jmp nằm Segment nhớ khác Ví dụ 1: Start: Jmp Main TieuDe DB Main ‘Khoa CNTT – DHHH’ Proc Main Endp End Start Ví dụ 2: • Jmp short Main • Jmp Ax • Jmp word PTR [BX] • Jmp dword PTR [BX] Ví dụ 3: Reset DD Jmp Reset 5BE000F0h Ví dụ 4: Mov Ax, 15 Mov Bx, 20 Jmp TTong Add Ax, Bx TTong: Sub Ax, Bx Mov Cx, Ax Kết thúc đoạn lệnh Cx = Ax = -5, lệnh Add Ax, Bx không thực Khi gặp lệnh Jmp TTong chương trình nhảy đến thục lệnh sau nhãn TTong, lệnh Sub Ax, Bx Lệnh nhảy có điều kiện: Cú pháp chung: • • Trong đó: : Tương tự lệnh Jmp Tác dụng: Khi gặp lệnh nhảy có điều kiện, chương trình kiểm tra điều kiện nhảy nó, thỏa mãn nhảy đến thực lệnh , không bỏ qua không thực lệnh nhảy Điều kiện nhảy lệnh nhảy thay đổi giá trị cờ hiệu, để tạo điều kiện nhảy cho lệnh nhảy xác định chương trình phải làm thay đổi giá trị cờ hiệu tương ứng với Chương trình thường dùng lệnh địch bít, quay bít, so sánh, để làm thay đổi giá trị cờ hiệu để tạo điều kiện nhảy cho lệnh nhay Cách đơn giản sử dụng lệnh Cmp trước lệnh nhảy Sau lệnh nhảy có điều kiện với liệu có dấu: • • • • • Lệnh JG: Nhảy [Đích] > [Nguồn] ; (SF = 0F ZF = 0) Lệnh JL: Nhảy [Đích] < [Nguồn] ; (SF 0F) Lệnh JGE: Nhảy [Đích] ≥[Nguồn] ; (SF = 0F) Lệnh JLE: Nhảy [Đích] ≤[Nguồn] ; (CF 0F ZF = 1) Trong đó: [Đích] [Nguồn] hai toán hạng: [Toán hạng đích] [Toán hạng nguồn] lệnh Cmp đứng trước lệnh nhảy Tức là, chương trình sử dụng lệnh Cmp để tạo điều kiện nhảy cho lệnh Cụ thể: lệnh nhảy có thực hay không (có chuyển điều khiển đến hay không) phụ thuộc vào giá trị [Đích] [Nguồn] lệnh Cmp đứng trước Với việc sử dụng lệnh Cmp để tạo điều kiện nhảy cho lệnh nhảy ta không cần quan tâm đến cờ điều kiện nhảy chúng Sau lệnh nhảy có điều kiện với liệu không dấu: • • • • Lệnh JA: Lệnh JB: Lệnh JNA: Lệnh JNB: Nhảy [Đích] > [Nguồn] ; (CF = ZF = 0) Nhảy [Đích] < [Nguồn] ; (CF = 0) Nhảy [Đích] không lớn [Nguồn]; (CF =1 or ZF =1) Nhảy [Đích] không nhỏ [Nguồn] ; (CF = 0) Các lệnh nhảy với liệu có dấu áp dụng với liệu không dấu Sau lệnh nhảy có điều kiện dùng chung: • • • • • Lệnh JC: Lệnh JNC: Lệnh JZ: Lệnh JNZ: Lệnh JE: Nhảy cờ CF = Nhảy cờ CF = Nhảy cờ ZF = Nhảy cờ ZF = Nhảy [Đích] = [Nguồn]; Tương tự JZ; (ZF = 1) • • Lệnh JNE: Nhảy [Đích] ≠[Nguồn]; Tương tự JNZ; (ZF = 0) [2 - 150] Với lệnh này, chương trình thường sử dụng lệnh dịch bít lệnh quay bít để tạo điều kiện nhảy Ví dụ 1a: Dãy lệnh sau thực việc gán giá trị cho ghi Cx dựa vào giá trị ghi Ax Dx: Mov Ax, 12 Mov Dx, 25 ; Cmp Ax, Dx Jg Nhan1 Jle Nhan2 ; Ax ? Bx ; Ax > Dx Nhan1: Mov Cx, Ax Jmp Tiep_Tuc Nhan2: Mov Cx, Dx Jmp Tiep_Tuc Tiep_Tuc: Mov Bx, Cx ; -Có thể thấy, không cần dùng lệnh Jle Nhan2, Ax không lớn Dx chẵn nhỏ Dx Ngoài không cần dùng lệnh Jmp Tiep_Tuc sau nhãn Nhan2, việc chuyển đến lệnh sau nhãn Tiep_Tuc tất nhiên Vì đoạn lệnh viết rút gọn Ví dụ 1b sau Ví dụ 1b: Dãy lệnh sau trường hợp rút gọn dãy lệnh trên: Mov Ax, 12 Mov Dx, 25 ; -Cmp Ax, Dx Jg Nhan1 ; Ax > Dx Mov Cx, Dx Jmp Tiep_Tuc ; Ax ≤Dx Nhan1: Mov Cx, Ax ; Ax > Dx Tiep_Tuc: Mov Bx, Cx ; -Trong hai ví dụ trên: kết thúc, Bx = Cx = Dx = 25 Nhưng cho Ax = 120 (Ax > Bx) Bx = Cx = Ax = 120 Ví dụ 2: Giả sử địa 0A000:0100 nhớ có chứa mảng số nguyên kiểu byte, gồm 100 phần tử (100 byte) Các lệnh sau tính tổng phần tử mảng mà giá trị lớn 123 Kết chứa ghi Dx Mov Ax, 0A000h Mov DS, Ax Mov DI, 0100h ; -Mov Dx, Mov Cx, 100 Lap_TT: Mov Al, Byte PTR DS:[DI] Cmp Al, 123 Jle Tiep_Tuc Add Dx, Al Tiep_Tuc: INC DI Loop Lap_TT ; trỏ đến phần tử ; lặp lại: kiển tra tính tổng ; Ví dụ 3: Giả sử địa 0C000:00120 nhớ có chứa xâu kí tự, xâu kết thúc giá trị (số 0) Các lệnh sau đếm xem xâu nói gồm kí tự Kết ghi vào ô nhớ trước vùng nhớ chứa xâu này: Mov Ax, 0C000h Mov ES, Ax Mov DI, 00120h Mov SI, DI ; -Mov Dx, Lap_Dem: Mov Al, Byte PTR ES:[DI] Cmp Al, Je KetThuc INC Dx ; Al 0: đếm INC DI ; trỏ đến kí tự Jmp Lap_Dem ; so sánh Al với ; Al = 0: đến cuối xâu ; lặp lại: kiển tra đếm KetThuc: Mov Byte PTR DS:[SI - 1], Dx ; -Ví dụ 4: Các lệnh sau in nội dung bản ASCII hình, không in kí tự có mã 07h, 0Ah, 0Dh Mov Cx, 256 Mov Ah, 02 Mov Dl, Lap_In: Cmp Dl, 07h Je TTuc Cmp Dl, 0Ah Je TTuc Cmp Dl, 0Dh Je TTuc Int 21h TTuc: INC DL Loop Lap_In ; Ví dụ 5: Các lệnh sau cho phép nhập xâu kí tự bất kỳ, dài không 200 kí tự, từ bàn phím vào biến XauNhap Sau copy kí tự chữ in hoa xâu vừa nhập vào biến XauHoa Trước hết chương trình phải khai báo biến: XauNhap DB 200, 0, 200 Dup (‘ ’) XauHoa DB 200 Dup (‘ ’) Các lệnh: Mov Ax, Seg XauNhap Mov DS, XauNhap Mov Dx, Offset XauNhap Mov Ax, Seg XauHoa Mov ES, XauHoa Mov DI, Offset XauHoa ; -Mov Ah, 0Ah Int 21h ; Mov Cx, Mov Cl, XauNhap[1] Mov SI, Dx Add SI, ; -Lap_Copy: Mov Al, DS:[SI] Cmp Al, ‘A’ Jl TTuc Cmp Al, ‘Z’ Jg TTuc Mov ES:[DI], Al INC DI TTuc: INC SI Loop Lap_Copy ; ; Nên nhớ, bảng mã ASCII kí tự chữ in hoa nằm vị trí liên tiếp nhau: A, B, C, , Z, chúng có mã 65, 66, 67, , 90 Ví dụ 6: Giả sử địa 0F000:FFFE nhớ ROM-BIOS có chứa byte liệu Byte cho biết loại máy tính sử dụng Cụ thể, byte này: chứa trị 0FBh: máy PC/XT; chứa trị 0FCh: máy PC/AT; chứa trị 0FFh: máy PC classic; Các lệnh sau cho biết máy tính sử dụng thuộc loại máy nào: Trước hết chương trình phải khai báo biến trả lời: TB1 DB ‘Day la may PC/XT.$’ TB2 DB ‘Day la may PC/AT.$’ TB3 DB ‘Day la may PC classic.$’ Các lệnh: Mov Ax, 0F000h Mov ES, Ax Mov SI, 0FFFEh ; -Mov Al, Byte PTR ES:[SI] Cmp Al, 0FBh Je TraLoi1 Cmp Al, 0Fch Je TraLoi2 Cmp Al, 0Ffh Je TraLoi3 TraLoi1: Mov Ax, Seg TB1 Mov DS, Ax Lea Dx, Offset TB1 Mov Ah, 09 Int 21h Jmp KetThuc TraLoi2: Mov Ax, Seg TB2 Mov DS, Ax Lea Dx, Offset TB2 Mov Ah, 09 Int 21h Jmp KetThuc TraLoi1: Mov Ax, Seg TB3 Mov DS, Ax Lea Dx, Offset TB3 Mov Ah, 09 Int 21h Jmp KetThuc KetThuc: Mov Ah, 4Ch Int 21h ; -Có thể nói, ví dụ thao tác điển hình lập trình hợp ngữ Nó cho thấy chức mạnh ngôn ngữ Đây mục tiêu mà người lập trình hợp ngữ nhắm tới Việc truy xuất vào vùng nhớ liệu để lấy byte/word thông tin cấu hình hệ thống yêu cầu với ngôn ngữ lập trình cấp thấp, thực cách đơn giản ngôn ngữ hợp ngữ Ví dụ cho thấy nguyên tắc để làm việc Các lệnh Dịch bít – Quay bít (còn tiếp) Tự học lập trình assembly - Bài 6: Tập lệnh assembly Intel 8088/8086 - Tiếp theo (2) Thứ Sáu, 25/10/2013 16:08 TẬP LỆNH ASSEMBLY CỦA INTEL 8088/8086 - (Tiếp theo) Các lệnh Dịch bít – Quay bít Các lệnh dịch bít lệnh làm cho bít ghi bị dịch bên trái (lệnh ShR) bên phải (lệnh ShL) nhiều bít Lệnh quay bít làm cho bít ghi quay theo “chiều trái” theo “chiều phải” nhiều bít Thông thường bít dịch hay quay đưa qua cờ CF Do đo, lệnh dịch bít quay bít thường sử dụng để kiểm tra giá trị bít (= hay = 1) bít ghi Hợp ngữ cung cấp hai dạng lệnh quay bít, quay không qua cờ CF (lệnh RoL RoL) quay có qua cờ CF (lệnh RcL RcR) Cú pháp: • • • • Shr Shl Rcr Rcl [Toán hạng đích], [Toán hạng đích], [Toán hạng đích], [Toán hạng đích], Trong đó: [Toán hạng đích] ghi bít 16 bít số bít cần dịch, = định trực tiếp câu lệnh, lớn phải định thông qua ghi CL Tác dụng: • Lệnh ShR (Shift Logical Right): Dịch chuyển bít ghi [Toán hạng đích] sang phải nhiều bít Các bít dịch đưa vào cờ CF, cờ CF chứa bít lần dịch cuối Sau dịch bít bị khuyết (ở bên đối diện) thay bít có trị Tức là, với ghi bít sau lần dịch nhận dãy bít = 0, tương tự với ghi 16 bít sau 16 lần dịch nhận dãy 16 bít = Nếu ghi AL = 01001001 sau bị dịch bên trái bít sau: AL = 00100100, CF = • • • Lệnh ShL (Shift Logical Left): Tương tự lệnh ShR bít dịch phía bên trái Lệnh RCR (Rotate through Carry Right): Tương tự lệnh ShR, bít dịch đặt vào lại bít bị khuyết bên đối diện Tức là, với ghi bít sau lần dịch nhận lại dãy bít ban đầu, tương tự với ghi 16 bít sau 16 lần dịch nhận lại dãy bít ban đầu Nếu ghi AL = 01001001 sau bị quay bên trái bít sau: AL = 00100101, CF = Lệnh RCL (Rotate through Carry Left): Tương tự lệnh RCR bít quay phía bên trái Ví dụ 1: • • • Shr Mov Al, Cl, Shr Al, CL Shl Bl, CL Rcl AL, CL Rcr Dl, Ví dụ 2: Các lệnh sau đếm số bít ghi BX, kết chứa ghi Al mà không làm thay đổi giá trị nó: Mov Al, Mov Cx, 16 DemBit1: Rol Bx, Jnc TiepTuc Inc Al TiepTuc: Loop DemBit1 ; -Ví dụ 3: Các lệnh sau đếm số bít giống (tương ứng) hai ghi Ax Bx Kết chứa biến Dem (Dem DB 0): Mov Dem, Xor Ax, Bx Mov Cx, 16 KTra: Shl Ax, Jnc Bit_0 Jmp TiepTuc Bit_0: Inc Dem TiepTuc: Loop KTra ; -Ví dụ 4: Các lệnh sau in nội dung ghi BX hình dạng sô nhị phân: Mov Cx, 16 ; lặp in đủ 16 bít Mov Ah, 02 ; in kí tự với hàm 02/21h Shl Bx, ; dịch trái để bít cần in rơi vào cờ CF Jc In_1 Mov Dl, ‘0’ Int 21h Jmp In_Tiep In_NhiPhan: ; lệnh JC nhảy cờ CF = ; CF = tức bít cần in có trị = 0, nên in kí tự ‘0’ In_1: Mov Dl, ‘1’ Int 21h In_Tiep: Loop In_NhiPhan ; Ví dụ 5: Các lệnh sau nhập số nhị phân từ bàn phím đưa vào lưu trữ ghi BX: Mov Bx, Mov Cx, Mov Ax, Mov Ah, Nhap: Int 21h Cmp Al, 0Dh Je KetThuc ; nhập Enter kết thúc ; -Cmp Al, ‘1’ Je Them_Bit Cmp Al, ‘0’ Je Them_Bit ; -Mov Ah,09 Mov Dx, Seg TB ; Biến TB khai báo sau: Mov DS, Dx ; TB Mov Dx, Offset TB Int 21h Jmp Nhap DB ‘Ban phai nhap 0/1 hoac Enter$’ Them_Bit: Sub Al, 30h Shl Bx, Or Bx, Al Inc Cx Cmp Cx, 17 Jne Nhap KetThuc: Mov 4Ch Int 21h ; ; có thẻ sử dụng lệnh And Al, 0Fh Ví dụ 6: Giả sử địa 0B000:0010 nhớ có chứa byte liệu, cho biết số thông tin liên quan đến cấu hình hệ thống Byte cho biết máy tính có (byte = 1) hay (byte = 0) cổng cắm USB Các lệnh sau cho biết máy tính (máy thực đoạn lệnh) có hay cổng cắm USB Kết thông báo thông qua ghi Cx: Cx = 0: cổng cắm USB; Cx = 0FFFFh: có cổng cắm USB Mov Ax, 0B000h Mov DS, Ax Mov DI, 0010h ; Mov Ax, Mov Al, byte PTR DS:[DI] ; Mov Cl, Shr Al, Cl Jc CoUSB ; co cong USB Mov Cx, ; khong co cong USB Jmp KetThuc CoUSB: Mov Cx, 0FFFFh KetThuc: ; Trong thực tế, kết kiểm tra thường trả lời thông qua cờ CF CF = 0: cổng USB, CF = 1: có cổng USB Chú ý 1: Có thể sử dụng lệnh dịch bít ShR/ShL để thực phép chia/phép nhân giá trị ghi (chứa số nguyên không dấu) với số bội số Ví dụ: Hai lệnh sau dịch AL sang trái bít, tức nhân AL với 8: Mov Cl, Shl Al, Cl ; Al ß AL * 8, = 23 Ví dụ: Hai lệnh sau dịch AL sang phải bít, tức chia AL với 8: Mov Cl, Shr Al, Cl ; Al ß AL * 8, = 23 Chú ý 2: Hợp ngữ cung cấp lệnh dịch chuyển số học SAL (Shift Arithmetic Left) SAR (Shift Arithmetic Right) SAL tương tự hoàn toàn ShL, sử dụng để thực nhân với số âm SAR tương tự ShR bít cuối [Toán hạng đích] không bị thay bít mà giữ nguyên giá trị cũ, sử dụng để thực chia với có dấu Các lệnh dich bít, quay bít vi xử lý Intel 80286/80386/ cho phép viết số bít cần dịch, trường hợp lớn một, trực tiếp lệnh dịch, quay mà không cần thông qua ghi Cl [1 – 540] Các lệnh xử lý chuỗi [...]... này có kích thước là 25 x 80 x 2 (byte) = 40000 byte Bạn đọc tự lập trình thử nhé Tự học lập trình assembly - Bài 5: Sử dụng Interrupt trong chương trình assembly (1) Thứ Hai, 02/09/2013 23:55 NGẮT TRONG CHƯƠNG TRÌNH ASSEMLBLY Ngắt (Interrupt) là các tín hiệu mà các thành phần trong hệ thống, như: thiết bị ngoại vi, hệ điều hành, chương trình người sử dụng, , gửi đến vi xử lý (họ Intel) mỗi khi nó... hàm vào/ra kí tự/ xâu kí tự cơ bản Chức năng của mỗi ngắt, chức năng của các hàm trong một ngắt, các yêu cầu dữ liệu vào/ra của từng hàm trong mỗi ngắt, dễ dàng tìm thấy trong các tài liệu về lập trình hệ thống Hàm 02 của ngắt 21h: Tác dụng: In một kí tự ra màn hình Kí tự (hoặc mã ASCII của kí tự) cần in được đặt trước trong thanh ghi DL Kí tự ở đây có thể là kí tự thường hoặc kí tự điều khiển Sử... phép các chương trình sử dụng các hướng dẫn biên dịch định nghĩa đoạn toàn phần, các định nghĩa này phù hợp với hầu hết các trình biên dịch hợp ngữ hiện nay Định nghĩa đoạn toàn phần giúp cho việc viết chương trình hợp ngữ trở nên mềm dẻo và linh hoạt hơn, nó giúp người lập trình có thể điều khiển thứ tự các đoạn chương trình, kết hợp các đoạn chương trình, liên kết các đoạn chương trình trong bộ nhớ,... đoạn Stack, nhờ đó, khi chương trình được nạp vào bộ nhớ thanh ghi đoạn SS sẽ được trỏ về đoạn này Tự học lập trình Assembly - Bài 4: Tập lệnh assembly của Intel 8086/8088 (1) MỘT SỐ LỆNH ASSEMBLY CƠ SỞ Cú pháp lệnh: Một lệnh hợp ngữ đầy đủ gồm bốn thành phần sau đây: [Nhãn lệnh:] [Các toán hạng] [;Lời giải thích] Trong đó: - [Nhãn lệnh:]: Là một dãy các kí tự đứng trước câu lệnh (kết thúc... không [1 - 477] Tự học lập trình assembly - Bài 4: Tập lệnh assembly của Intel 8086/8088 (2) 3 Lệnh LOOP Cú pháp: Loop • Trong đó: là một nhãn lệnh và nó phải đứng trước lệnh lặp Loop không quá 126 byte Tác dụng: Khi gặp lệnh này chương trình sẽ lặp lại việc thực hiện các lệnh sau đủ n lần, với n được đặt trước trong thanh ghi CX Sau mỗi lần lặp CX tự động giảm 1... chương trình trên các từ khóa Model, Code, Data, Stack, Proc, Endp, End là các hướng dẫn biên dịch Cấu trúc này cho thấy rõ, một chương trình hợp ngữ dạng gồm 3 đoạn: đoạn Code, chứa toàn bộ mã lệnh của chương trình Đoạn Data, chứa phần khai báo dữ liệu của chương trình Đoạn Stack, nơi chứa stack (ngăn xếp) của chương trình khi chương trình được nạp vào bộ nhớ để hoạt động Chỉ dẫn Stackđặt ở đầu chương trình. .. ở Tương tự lệnh In, địa chỉ cổng có thể được viết trực tiếp trong câu lệnh hoặc thông qua thanh ghi Dx Ví dụ 1: - In Al, 40h ; - Mov Dx, 3B0h ; In Al, Dx ; - Out 40h, Al ; - Mov Dx, 3B0h ; Out Dx, Al Ví dụ 2: ; Ví dụ 3: Các khai báo hằng: DAT EQU 13h ; POR EQU 7Ch ; Các lệnh: Mov Al, POR ; Mov Bl, DAT ; Out Bl, Al ; Tự học lập trình assembly - Bài 4: Tập lệnh assembly của Intel 8086/8088... bít cao vào thanh ghi đoạn dữ liệu DS); và lệnh LES (Load Pointer use DS) tương tự LDS nhưng mặc định 16 bít cao vào thanh ghi đoạn dữ liệu (thứ hai) ES [2 - 137] Tự học lập trình assembly - Bài 4: Tập lệnh assembly của Intel 8086/8088 (3) 5 Lệnh Mul và Div Cú pháp: • • • • Mul IMul Div IDiv [Toán hạng nguồn] [Toán hạng nguồn] [Toán hạng nguồn] [Toán hạng nguồn] Trong... Start Chương trình này chọn chế độ bộ nhớ Small Tên thủ tục chính là Main (tên thủ tục chính là tùy ý) Nhãn chính của chương trình là Start (tên thủ tục chính là tùy ý), đó chính là nhãn của lệnh Jmp Phần khai báo dữ liệu chỉ khai báo một biến, đó là MyChildren Chương trình này gọi hàm 4Ch của ngắt 21h để kết thúc chương trình Có thể gọi ngắt 20h để kết thúc các chương trình dạng COM Chương trình viết... của hai biến Xau1 và Xau2 Hay cụ thể: DS:SI trỏ về biến Xau1 và DS:DI trỏ về Xau2 Ví dụ 5: Chương trình sau đây: Để in một xâu kí tự từ trong chương trình ra màn hình văn bản đơn sắc (môi trường MSDOS) Chú ý: - BIOS và MSDOS đã cung cấp nhiều hàm/ngắt để chương trình hợp ngữ ghi một kí tự hoặc một xâu kí tự ra màn hình, tại vị trí hiện tại của con trỏ màn hình hoặc tại một tọa độ màn hình xác định nào

Ngày đăng: 29/05/2016, 16:58

TỪ KHÓA LIÊN QUAN

w