Hướng dẫn thực hành môn Kiến trúc máy tính & Hợp Ngữ - Lập trình hợp ngữ x86

Hợp ngữ (assembly) là ngôn ngữ bậc thấp, giúp cho người lập trình không phải ghi nhớ mã
máy (opcode) mà sử dụng các từ ngữ gợi nhớ (pseudo-code) gần với ngôn ngữ tự nhiên để miêu
tả công việc cần thực hiện. Tuy vậy, assembly rất gần với ngôn ngữ máy, đòi hỏi người lập trình
phải hiểu biết tương đối đầy đủ về cấu trúc phần cứng máy tính.
Với mỗi kiểu kiến trúc của bộ vi xử lý, có một bộ lệnh riêng, do đó, có một ngôn ngữ
assembly riêng cho nó. Ở đây, chúng ta nghiên cứu assembly cho các bộ vi xử lý Intel thuộc họ
x86. Các chương trình sẽ được viết cho chế độ thực (real mode) trong DOS và được biên dịch
bằng Netwide Assembler 
pdf 8 trang xuanthi 28/12/2022 1120
Bạn đang xem tài liệu "Hướng dẫn thực hành môn Kiến trúc máy tính & Hợp Ngữ - Lập trình hợp ngữ x86", để tải tài liệu gốc về máy hãy click vào nút Download ở trên.

File đính kèm:

  • pdfhuong_dan_thuc_hanh_mon_kien_truc_may_tinh_hop_ngu_lap_trinh.pdf

Nội dung text: Hướng dẫn thực hành môn Kiến trúc máy tính & Hợp Ngữ - Lập trình hợp ngữ x86

  1. HDTH Kiến trúc máy tính & Hợp Ngữ Bộ môn MMTVT - HCMUS push 0 call _ExitProcess@4 ; Gọi hàm ExitProcess thoát chương trình Lưu ý: - Mọi chương trình đều phải có đoạn code thoát khỏi chương trình, nếu không chương trình sẽ không dừng khi hết chương trình của mình. Khai báo biến trong hợp ngữ Cú pháp trong .data: d Cú pháp trong .bss: res Các kiểu dữ liệu: b (1 byte), w (2 bytes), d (4 bytes), q (8 bytes), t (10 bytes) Ví dụ: Khai báo trong .data message db 'Hello world!' msglength db 12 buffersize dw 1024 ; Khai báo một word có kích thước là 1024 Khai báo trong .bss filename resb 255 number resb 1 bignum resw 1 realarray resq 10 Các thanh ghi trong NASM Dữ liệu của thanh ghi: 16-bit của thanh ghi ah ax al 8-bit 16-bit 32-bit mở rộng Các thanh ghi: eax ah ax al Accumulator eb bh bx bl Base Index x ecx ch cx bl Count ed dh dx dl Data x esp sp Stack Pointer eb bp Base Pointer p edi di Destination Index esi si Source Index Bộ môn Mạng máy tính & Viễn thông – Khoa CNTT – Trường ĐH KHTN TPHCM -2-
  2. HDTH Kiến trúc máy tính & Hợp Ngữ Bộ môn MMTVT - HCMUS bytes, words and doublewords) of bar giữa các thanh ghi và giữa thanh mov eax, bar ;Refers to the address of ghi và vùng nhớ. bar mov eax,table[ebx] ;ERROR mov eax,[table+ebx] ;O.K. mov eax,[es:edi] ;O.K. data dw 0 ;Data type defined as double word. mov [data], 2 ;Doesn’t work. mov word [data], 2 ;O.K. push, pop 6 dạng của phương thức push và push dword input_filename_ptr pop: push eax Thanh ghi, bộ nhớ (từ bộ nhớ đến push 1 bộ nhớ), hằng số, thanh ghi đoạn, cờ hiệu, và tất cả các thanh ghi push: Nguồn của dữ liệu có thể là: Bất kỳ thanh ghi 16 hoặc 32 bit, hằng số, thanh ghi đoạn, word hoặc doubleword của bộ nhớ pop: Nguồn của dữ liệu có thể là: Bất kỳ thanh ghi 16 hoặc 32 bit, thanh ghi đoạn (ngoại trừ CS), word hoặc doubleword của bộ nhớ lea Lấy địa chỉ của dữ liệu vào bất kỳ lea eax, [esi+edi] thanh ghi 32 bit nào. Các cờ hiệu: Cờ Ý nghĩa Z Result zero C Carry out – Cờ nhớ A Half carry out – Cờ nhớ phụ S Result positive P Result has even parity O Overflow occurred – Cờ tràn Lệnh so sánh: cmp Rs1, Rs2 Ví dụ: cmp AL, DL Một số ví dụ khi so sánh 2 thanh ghi AL và DL: Bộ môn Mạng máy tính & Viễn thông – Khoa CNTT – Trường ĐH KHTN TPHCM -4-
  3. HDTH Kiến trúc máy tính & Hợp Ngữ Bộ môn MMTVT - HCMUS jnae jump if not above or equal jbe jump if below or equal CF = l hoặc ZF = l jna jump if not above Nhảy khi so sánh 2 số có dấu Lệnh Ý nghĩa Điều kiện kiểm tra je jump if equal ZF = 1 jz jump if zero jne jump if not equal ZF = 0 jnz jump if not zero jg jump if greater ZF = 0 và SF = OF jnle jump if not less or equal jge jump if greater or equal SF = OF jnl jump if not less jl jump if less SF ≠ OF jnge jump if not greater or equal jle jump if less or equal ZF = 1 hoặc SF ≠ OF jng jump if not greater System Call: Lệnh syscall làm treo sự thực thi của chương trình và chuyển quyền điều khiển cho HĐH (bằng cách gọi các hàm của Windows API). Bảng các system call Lệnh hợp ngữ Ý nghĩa Hàm trên C++ push -11 Bắt đầu chương trình xuất. hFile = GetStdHandle(-11); call _GetStdHandle@4 mov [output_handle], eax push -10 Bắt đầu chương trình nhập. hFile = GetStdHandle(-10); call _GetStdHandle@4 mov [input_handle], eax push 0 Thoát chương trình. return 0; call _ExitProcess@4 push 0 Xuất. WriteFile(hFile, output_string, push dword bytes_written length, &bytes_written, 0); push length bytes_written: kích thước của push dword output_string chuỗi xuất ra. push dword length: chiều dài của chuỗi [output_handle] output_string: địa chỉ của call _WriteFile@20 chuỗi xuất ra output_handle: lời gọi hàm đến GetStdHandle push 0 Nhập. ReadFile(hFile, &input_string, push dword bytes_read length, bytes_read) push length bytes_read: kích thước của push dword input_string chuỗi xuất nhập vào. push dword [input_handle length: chiều dài của chuỗi ] input_string: địa chỉ của chuỗi call _ReadFile@20 nhập vào output_handle: lời gọi hàm đến GetStdHandle Bộ môn Mạng máy tính & Viễn thông – Khoa CNTT – Trường ĐH KHTN TPHCM -6-
  4. HDTH Kiến trúc máy tính & Hợp Ngữ Bộ môn MMTVT - HCMUS Nhập vào một ký tự : D Ký tự vừa nhập : D là chữ hoa 7. Nhập một mảng các số nguyên n phần tử, xuất mảng đó ra màn hình. Ví dụ: Nhap mang cac so nguyen: 1 2 3 4 5 Mang vua nhap: 1 2 3 4 5 8. Nhập vào một số nguyên n, tính tổng từ 1 đến n. Ví dụ: Nhap mot so: 4 Tong tu 1 den 4 la: 10 9. Nhập vào một chuỗi, xuất ra chuỗi ngược. Ví dụ: Nhap vao mot chuoi: hello Chuoi nguoc la: olleh Bộ môn Mạng máy tính & Viễn thông – Khoa CNTT – Trường ĐH KHTN TPHCM -8-