intTypePromotion=1
zunia.vn Tuyển sinh 2024 dành cho Gen-Z zunia.vn zunia.vn
ADSENSE

Bài giảng Hợp ngữ và lập trình hệ thống: Chương 2 - Phạm Công Hòa

Chia sẻ: 5A4F5AFSDG 5A4F5AFSDG | Ngày: | Loại File: PDF | Số trang:33

46
lượt xem
4
download
 
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

Chương 2: Liên kết ngôn ngữ assembly với ngôn ngữ bậc cao. Chương này cung cấp những nội dung kiến thức sau: Ngôn ngữ C và hợp ngữ, ngôn ngữ Pascal và hợp ngữ, ngôn ngữ C++ và hợp ngữ. Mời các bạn cùng tham khảo.

Chủ đề:
Lưu

Nội dung Text: Bài giảng Hợp ngữ và lập trình hệ thống: Chương 2 - Phạm Công Hòa

  1. LOGO HỢP NGỮ và LẬP TRÌNH HỆ THỐNG GV: Phạm Công Hòa Tel: 091.552.9889 Email: conghoaf1@gmail.com
  2. NỘI DUNG HỌC PHẦN I NGÔN NGỮ ASSEMBLER (ASM) VÀ CÁCH LẬP TRÌNH II LIÊN KẾT NGÔN NGỮ BẬC CAO VỚI ASM III LẬP TRÌNH HỆ THỐNG
  3. II LIÊN KẾT NGÔN NGỮ BẬC CAO VỚI ASM 1. Ngôn ngữ C và hợp ngữ 2. Ngôn ngữ Pascal và hợp ngữ
  4. 1. Ngôn ngữ C và hợp ngữ - Mục đích: Tận dụng được sức mạnh của hai loại ngôn ngữ. - Để liên kết các đoạn chương trình hợp ngữ vào ngôn ngữ C/C++ (hoặc Pascal) thì người ta thường sử dụng một trong hai cách: + Sử dụng inline assembly (viết dòng lệnh ASM trong C/C++). + Viết tách biệt các module.
  5. 1. Ngôn ngữ C và hợp ngữ 1.1. Sử dụng inline assembly - Chèn các khối lệnh hợp ngữ vào chương trình được viết bằng ngôn ngữ C - Cú pháp (Turbo C): asm { Các lệnh ASM } Chú ý: Từ khóa asm và dấu ‘{‘ phải cùng nằm trên một dòng.
  6. 1. Ngôn ngữ C và hợp ngữ 1.1. Sử dụng inline assembly -Với môi trường DevC, Visual C++ ta sử dụng các thanh ghi 32 bit (EAX, EBX,…). Đoạn lệnh có cú pháp: asm("assembly code"); hoặc: __asm__ ("assembly code");
  7. 1. Ngôn ngữ C và hợp ngữ 1.1. Sử dụng inline assembly - Đoạn lệnh sau tính và hiện tổng 2 số thực ra màn hình (DevC) float a,b,tong; printf("Nhap 2 so thuc: " ); scanf ("%f%f", &a, &b ); __asm__ ("fld %1;" "fld %2;" "faddp;" "fstp %0;":"=g"(tong):"g"(a),"g"(b)) ; printf("%f+%f = %f\n",a,b,tong);
  8. 1. Ngôn ngữ C và hợp ngữ - Ví dụ 1: Viết chương trình C khai báo và khởi gán 1 xâu ký tự. Dùng các lệnh ASM hiện xâu ký tự ra màn hình. (tệp vd01.c) #include void main() { char s[]="Hello World!$"; clrscr(); asm{ lea dx,s mov ah,9 int 21h } getch(); }
  9. 1. Ngôn ngữ C và hợp ngữ - Chú ý: Các biến được khai báo trong C được coi như các biến “toàn cục” sử dụng chung cho cả C và các inline - assembly. Ví dụ chương trình dưới đây tính tổng 2 số nguyên x và y rồi lưu kết quả vào biến sum. (tệp vd02.c) #include #include void main() { int x,y, sum; printf (“x = ”); scanf(“%d”,&x); printf (“y = ”); scanf(“%d”,&y); asm { mov ax,x add ax,y mov sum,ax } printf (“Tong la: %d”, sum); getch(); }
  10. 1. Ngôn ngữ C và hợp ngữ  Nhược điểm của phương pháp Inline Assembly: - Các lệnh nhảy trong phương pháp liên kết Inline Assembly chỉ có thể nhảy đến các nhãn C. - Inline assembly liên quan đến kích cỡ của các biến tự động của ngôn ngữ C. - Việc bảo vệ thanh ghi segment.
  11. 1. Ngôn ngữ C và hợp ngữ  Ví dụ về Inline Assembly • Ví dụ 3: (tệp vd03.c) Viết chương trình inline asm nhập 2 số nguyên a và b, hiện ra màn hình giá trị nhỏ nhất giữa a và b. • Ví dụ 4: (tệp vd04.c) Viết chương trình inline asm nhập một mảng N phần tử nguyên, tính và hiện tổng các số âm của mảng. Trong đó phần inline thực hiện chức năng (hàm) tính tổng âm.
  12. 1. Ngôn ngữ C và hợp ngữ 1.2. Viết tách biệt các module hợp ngữ và C - Đối với các chương trình lớn thì các module được tổ chức trong các file khác nhau. Ta có thể viết các module C và hợp ngữ hoàn toàn tách biệt, sau đó tiến hành dịch riêng rẽ từng module và liên kết chúng với nhau trước khi cho chạy. Cuối cùng ta thu được một file thực hiện được (exe) bằng cách trộn các file được viết bằng C và ASM. Tệp *.C Tệp *.ASM Liên kết tlink Tệp *.exe
  13. 1. Ngôn ngữ C và hợp ngữ 1.2. Viết tách biệt các module hợp ngữ và C tệp ngôn ngữ C tệp ngôn ngữ Assembly (file_name1.c) (file_name2.asm) Turbo C Compile Turbo Assemble Dịch Assembler Dịch tệp mã máy .obj tệp mã máy .obj (file_name1.obj) (file_name2.obj) Tlink TLINK Liên kết tệp thực hiện được dạng .exe (file_name1.exe)
  14. 1. Ngôn ngữ C và hợp ngữ  Các vấn đề cần phải giải quyết khi viết tách các module C và module hợp ngữ  Module C: • Các biến/hàm khai báo toàn cục trong C cũng được hiểu là public trong các module asm. • Muốn sử dụng một nhãn (chương trình con bên ASM) phải khai báo với từ khóa extern: extern tên_biến/tên_hàm
  15. 1. Ngôn ngữ C và hợp ngữ  Module hợp ngữ (asm):  Phải sử dụng sự sắp xếp các đoạn bộ nhớ (segment) tương thích với ngôn ngữ C.  Khai báo PUBLIC trước những nhãn (tên biến, tên hàm…) mà các file khác sẽ sử dụng đến.  Khai báo EXTRN trước những biến ngoài được file này sẽ sử dụng đến.  Thêm dấu _ (underscore) vào trước các nhãn, biến, hàm dùng chung.
  16. 1. Ngôn ngữ C và hợp ngữ  Vấn đề truyền tham số: • Thông qua biến toàn cục. • Thông qua ngăn xếp.
  17. 1. Ngôn ngữ C và hợp ngữ Kiểu khai báo dữ liệu trong ngôn Kiểu khai báo dữ liệu trong ngữ C/C++ ngôn ngữ Assembly unsigned char, char, enum byte unsigned short, short, word unsigned int, int unsignd long, long, float dword double qword long double tword near* word far* dword 17
  18. 1. Ngôn ngữ C và hợp ngữ - Các bước chuẩn bị và dịch chương trình liên kết: + Xem chi tiết trong “Hướng dẫn cài đặt môi trường liên kết ASM và C” trên site môn học. • Soạn thảo tệp tepC.c (tệp của C) • Soạn thảo tệp tepASM.asm (tệp của ASM) - Sau khi soạn thảo xong 2 tệp trên, chạy tệp run.bat để dịch thành tệp kết quả (.exe)
  19. 1. Ngôn ngữ C và hợp ngữ  Một số ví dụ  Ví dụ 5: Viết chương trình liên kết giữa asm và C thực hiện: o Tệp asm: Tìm giá trị nhỏ nhất của 3 số nguyên a,b,c (a,b,c nhận từ module C truyền sang) o Tệp C: Nhập 3 số nguyên a,b,c. Gọi hàm tìm Min(a,b,c) bên asm và hiện giá trị nhỏ nhất ra màn hình. (demo: tệp vd05a.asm và vd05c.c) *)Chú ý: 2 tệp C và ASM phải đặt tên khác nhau)
  20. 1. Ngôn ngữ C và hợp ngữ  Vấn đề về truyền tham số với các hàm ASM - Các hàm của ngôn ngữ C/C++ có thể có đối số hoặc không. - Các hàm của ngôn ngữ Assembly thuần túy (hàm và chương trình gọi nó đều được viết bằng ngôn ngữ Assembly) không có đối. => Người viết ngôn ngữ C đưa các tham số thực vào ngăn xếp và người viết hàm bằng ngôn ngữ Assembly phải vào ngăn xếp lấy các giá trị đó ra để xử lý. Hai vấn đề cần giải quyết: - Chuyển giao tham số như thế nào? - Việc sử dụng các thanh ghi và việc bảo tồn nó?
ADSENSE

CÓ THỂ BẠN MUỐN DOWNLOAD

 

Đồng bộ tài khoản
2=>2