Trao đổi với tôi

http://www.buidao.com

12/13/16

[MASM] Code a program in ASM

Code a program in ASM

Author: the_lighthouse

Tại sao nhiều người lại muốn code chương trình bằng ASM ?
Câu trả lời hết sức đơn giản, đó là : tốc độ, kích thước, khả năng , và trí tuệ.
Chúng ta có thể hiểu 4 điều trên như sau :
+ Tốc độ : Chương trình được viết bằng ASM thường nhanh hơn các chương trình viết bằng ngôn ngữ khác
+ Kích thước : Kích thước của 1 chương trình ASM rất nhỏ
+ Khả năng : Khi các bác viết chương trình bằng ASM thì không gì có thể ngăn cản khả năng làm việc của các bác (trừ khi cúp điện :)).Tất cả những ngôn ngữ bậc cao đều được compile vào ASM, do đó điều đơn giản là các lệnh ngôn ngữ bậc cao đều có thể thay thế bằng 1 hay nhiều lệnh ASM.
+ Trí tuệ : Khi viết chương trình trong ASM, các bác sẽ hiểu rõ hơn những gì diễn ra trong máy của các bác và trong các chương trình. Điều đó sẽ cho các bác 1 cái nhìn rõ ràng về các chương trình, và giúp ích các bác rất nhiều trong việc code.
Tool need :

MASM32 (hoặc TASM, NASM...)
Link download : hxxp://www.lwp.ca/masm32/m32v82r.zip
Dĩ nhiên chúng ta cần phải có 1 file window header, 1 vài file inc và lib . Chúng ta cần những file này bởi chúng chứa đựng tất cả các thông tin về WINAPI, các hằng - cấu trúc Windows... Nhưng các bác chớ lo , khi download MASM32 về, các bác sẽ tìm thấy nó :)
Bước vào công việc :

Trước khi bắt đầu, em nghĩ các bác nên cần có 1 chút kiến thức về ngôn ngữ Assembly, còn nếu không có -> các bác không nên tiếp tục đọc tut này.
Cũng giống như các ngôn ngữ khác, Assembly cũng có nhiều phần khác nhau được chia thành 4 phần :

Code:
.DATA    | Ở đây các bác nhập những dữ liệu để khởi chạy chương trình
.DATA?   | Ở đây các bác nhập những dữ liệu không dùng để khởi chạy chương trình      
.CONST   | Tất cả các hằng số
.CODE    | Đoạn code của các bác

Okey, các bác đã nắm được chưa? Nếu rồi thì chúng ta tiếp tục nào. Chúng ta sẽ bắt đầu bằng cách viết 1 chương trình đơn giản sẽ hiện lên "the_lighthouse is a newbie !!!".
Các bác đừng lo nếu các bác không hiểu 1 chỗ nào đó dưới đây. Em sẽ từ từ giải thích cho các bác :)
Các bác dùng Notepad (hoặc 1 chương trình soạn thảo văn bản nào đó) để soạn file bai1.asm (nhớ là đuôi asm nhé) có nội dung như sau :



Code:
.386
.model flat,stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\kernel32.lib
include \masm32\include\user32.inc
includelib \masm32\lib\user32.lib
 
.data
 
MessageTitel db "Chuong trinh dau tien",0
MessageText db "the_lighthouse is a newbie !!!",0
 
.code
 
start:
 
invoke MessageBox,NULL, addr MessageText, addr MessageTitel, MB_OK
invoke ExitProcess, NULL
 
end start


Sau đó, các bác dùng file masm.exe để tạo file đối tượng (.OBJ) cho file bai1.asm bằng cách open masm.exe rồi lần lượt làm như sau :


Code:
Source filename [.ASM]    : các bác nhập đường dẫn của file bai1.asm đã tạo ở 
                           trên(cái này bắt buộc phải có)
Object filename [bai1.OBJ]: cái này các bác có thể bỏ qua bằng cách ấn Enter
Source filename [NUL.LST] : cái này các bác có thể bỏ qua 
Cross-reference [NUL.CRF] : cái này các bác có thể bỏ qua 


Xong các bác mở MASM32 Editor lên, open file bai1.asm. Vào Project\Console Assemble & Link --> 1 của sổ sẽ hiện ra, các bác chờ cho nó chạy xong rồi ấn 1 phím nào đó --> Done, "đứa con" đầu tiên của các bác đã ra đời và "quê hương" của nó chính là thư mục có chứa file bai1.asm và "tên" của nó là bai1.exe. Các bác hãy open file bai1.exe xem thử tiếng đầu tiên nó nói là gì nào ? kekeke





Giải thích :

Code:
.386                       | Bộ vi xử lý (BVXL) trong máy tính. Đây là BVXL cũ nhất có 
                          |thể chạy chương trình. Với 486 hoặc 586 đều có thể được.
.model flat               | Chương trình win32 có 1 flat memory model. Chúng ta sẽ luôn 
                          |dùng nó. 
Stdcall                   | Có 2 cách để sử dụng lệnh call : đặt 1 đối số bình thường 
                          |hoặc đảo ngược trong stack
option casemap:none       | Tính chất này giúp cho code dễ hoạt động
 
include \masm32\include\windows.inc  | Đây là những include file có chứa tất cả prototype 
                                     |mà chúng ta sẽ cần
include \masm32\include\kernel32.inc
includelib \masm32\lib\kernel32.lib
include \masm32\include\user32.inc
includelib \masm32\lib\user32.lib
 
.data    | khu dữ liệu - nơi chúng ta sẽ nhập những string. Và hãy luôn luôn nhớ rằng đều 
         |phải kết thúc bằng số 0. 
         | Cú pháp dùng ở đây : Varname db "String",0
         |>> db có nghĩa là chúng ta đang làm với byte
MessageTitel db "Chuong trinh dau tien",0
MessageText db "the_lighthouse is a newbie !!!",0
 
.code    | khu code - nơi chúng ta code chương trình
         | chúng ta sẽ bắt đầu khu này bằng 1 cái tên, ở đây cái tên đó là "start". Còn 
        |để kết thúc, chúng ta dùng cú pháp "end " (trong trừong hợp này là "end 
        |start")
         | Invoke là 1 cú pháp ASM bậc cao để tạo lệnh call mà không cần phải đặt các đối 
         |số trong stack.
         | Ví dụ : Invoke SetDlgItemText, hWnd, IDC_EDIT, ADDR TestString sẽ được dịch ra 
         |như sau :
         |           push ADDR Teststring
         |           push IDC_EDIT
         |           push hWnd
         |           call SetDlgItemText
         | Em hi vọng các bác biết rõ về các hàm API, nếu không các bác nên đọc WIN32.HLP 
        |để biết thêm.    
         | Các programmer sử dụng nó thường xuyên. Nếu các bác không siêng năng mấy trong 
         |việc convert sang cú pháp C, các bác có thể tìm nó trong file windows.inc
         | Các bác hãy nhìn ví dụ dưới đây :
         | MessageBox  PROTO hwnd:DWORD, IpText:DWORD, IpCaption:DWORD, uType:DWORD
         | Chúng ta thấy ở đây có 4 đối số : handle (tạm thời chúng ta hãy cứ chấp nhận 
         |nó đã), address của message text, address của message-title, và cuối cùng là 
         |lay-out. (MB_OK sẽ hiện ra Messagebox kèm theo nút OK)
 
start:
 
invoke MessageBox,NULL, addr MessageText, addr MessageTitel, MB_OK
invoke ExitProcess, NULL
 
end start



----------=====THE END=====----------
Phù, cuối cùng chúng ta đã có được tác phẩm đầu tay bằng ngôn ngữ ASM rùi ! Các bác thấy thế nào ạ ? Có dễ không ?
Có thể trong tut này em đã để lại trong đầu các bác nhiều câu hỏi nhưng lại không có câu trả lời, nhưng các bác đừng lo. Theo thời gian chính các bác sẽ là người trả lời cho những câu hỏi đó.
Chúc các bác may mắn !!!





the_lighthouse (27-10-2004 ) posted on REAonline.net