Cách chạy chương trình Assembly

Tự học lập trình Assembly là một trong những từ khóa được tìm kiếm nhiều nhất trên google về chủ đề tự học lập trình Assembly. Trong bài viết này, loltruyenky.vn sẽ viết bài Assembly là gì? Cách tự học lập trình Assembly mới nhất 2020

Assembly Language [hay viết tắt là ASM] là ngôn ngữ bậc thấp, chuẩn xác nó là ngôn ngữ thuộc thế hệ thứ 2 [2nd generation]. ASM sử dụng những từ gợi nhớ [mnemonics] để viết các chỉ thị [instructions] lập trình cho máy tính thay vì bằng các dãy 0 , 1.

Đang xem: Phần mềm lập trình assembly

những ASM sẽ cần một chương trình Assembler phù hợp [NASM, AS, DASM] để dịch chúng thành những tệp binary và một trình linker để đường link các thành phần lại , chỉ định nơi bắt đầu của chương trình , đây là việc cầm buộc.VD: Hàm main trong C mặc định là nơi chương trình khởi chạy. Lệnh dịch source C ra binary theo thực tế nó đã làm 2. bước trên: dịch và đường link [xác định luôn nơi khởi chạy chương trình là main].một trong những đặc tính của chương trình viết trực tiếp bằng ASM là: chúng có tốc độ thực thi cao và tốn kém bộ nhớ ít hơn những chường viết bởi những ngôn ngữ lập trình bậc cao.

Việc học ASM cũng sẽ giúp chúng ta hiểu thêm về kiến trúc phần cứng máy tính, bí quyết chúng hoạt động , tương tác với nhau. VD như những thành phần căn bản trong máy tính, cách chúng marketing tin cho nhau:

ASM có thể tương tác rất sâu dưới hệ thống, chúng có khả năng giao tiếp trực tiếp với những phần cứng , tóm chúng hoạt động theo ý người lập trình. nó làm cho chúng ta có hẳn một ngành đưa tên là “lập trình nhúng”.Thường thường khi học một phương ngữ lập trình chúng ta chỉ dễ dàng là cài đặt môi trường lập trình, công cụ biên dịch và dùng những editor hoặc IDE nếu như có thể học lập trình. Viết một chương trình dễ dàng rồi biên dịch , chạy thử trên những ngôn ngữ bậc cao [C, C++, Java] là rất giản đơn. nhưng với ASM thì bạn sẽ dễ bị “nản” vì chẳng thể dịch và chạy code ASM đúng như hướng dẫn.lý do là ASM lập trình những chỉ thị cho phần cứng tuy nhiên chúng lại nương tựa vào kiến trúc CPU [ARM, x86-32, x86-64], hệ điều hành [Linux, Windows, Mac] , những tập chỉ thị mà nhà cung cấp phần cứng đưa rõ ra. đa số những chỉ dẫn, sách vở được viết cho kiến trúc iA-32. một vài hướng dẫn mới gần đây hơn thì viết cho kiến trúc x86-64 trên Linux, sử dụng Assembler của GNU.

Khác với ngôn ngữ C, về lý thuyết chúng ta có thể dịch lại mà không nhất thiết đổi source code lúc đầu. tuy nhiên thực tế thì việc làm này khó xảy ra vì chúng ta chỉ có khả năng thực hiện được điều trên nếu như không gọi tới những API của hệ điều hành. nói tới đây lại thấy yêu Java hơn, Java thực sự là cuộc cách mạng viết một lần, chạy mọi nơi và cũng chẳng cần phải dịch lại. Tất cả mọi thứ đã có máy ảo Java lo.

Xem thêm: cách chơi lol alpha không cần đăng ký

Thêm một khó khăn nữa cho những người học ASM trên máy Mac như mình. Apple chỉ định riêng bộ linker [Match-O] cho ASM, chúng sử dụng một vài chỉ thị riêng, padding memory riêng [có 4 lớp padding]. Việc viết ASM cho máy Mac thật sự có rất ít bài đăng chỉ dẫn, doc của Apple thì như kinh thánh … Việc nhớ những thanh ghi, những chỉ thị thôi đã đuối lắm rồi, thêm Apple hành nữa thật là khó càng thêm khó !!! cụ thể Apple OS X Assembler Reference.Như các bạn đã thấy việc in một đoạn text ra màn hình với ASM khá phức tạp, đó là chưa nói đến ta phải viết đúng chỉ thị của OS , CPU hiện trong. tất cả chỉ là các chỉ thị cho các thanh ghi chứ không hề có kiểu 1 lệnh in ra tổng cộng như C.những người cần lập trình phần cứng, mạch điện tử, các chip vi giải quyết.các người lập trình compiler, hệ điều hành. [Trong đó có anh Chris Lattner, tác giả của LLVM và Swift mà mình rất ngưỡng mộ vì anh cực kì trẻ – SN 1978]Hacker chuyên nghiệp.Reverse Engineer: nếu như dịch là kỹ sư đảo thì không hay và cũng ko đủ ý. RE là các kỹ sư chuyên phân tích, mổ xẻ những chương trình để hiểu sâu cụ thể bên tại nó thế nào, RE thường hay ứng dụng tại an ninh: phát hiện mã độc, đánh giá thuật toán mã hoá … , các lĩnh vực khác có liên quan.

có thể dùng debug chương trình mà không cần source code.có thể sử dụng để tối ưu hoá chương trình: một số dân code ASM chuyên nghiệp sử dụng C để code và dịch ra ASM rồi edit lại để phù hợp với kiến trúc , các chỉ thị riêng , tối ưu của nhà sản xuất chip. lý do là các compiler chỉ dịch ra ASM chung nhất cho những dòng chip.

Một số tài liệu có sự liên quan tới ASM

Mình xin chia sẻ lại một số tài liệu mà trong thời gian qua mình sở hữu, để ai đấy có đang tìm hiểu ASM có thể xem xét thêm qua:Introduction to 6 Bit Assembly Programming for Linux: Quyển này tinh gọn, rất lôi cuốn. Third edition có cho cả MacOS. Phiên bản này chỉ có cho Linux.Professional Assembly Language : Quyển này tác giả nói rất sâu về chế độ, tất cả các chỉ số register, chế độ vận hành phần cứng … Tiếc là tác giả viết cho kiến trúc IA-32 và phần code ASM cũng chỉ cho Linux x86-64 thôi.Hacking: The Art of Exploitation: dành cho ai thích hack, cuốn này nói cực kì sâu về kỹ thuật hacking đặc biệt là dùng ASM để can thiệp hệ thống.Practical Reverse Engineering: x86, x64, ARM, Windows Kernel, Reversing Tools, and Obfuscation: Quyển này cho những ai ham thích RE.Assembly “hello, world” for OS X: Bài này viết ASM với assembler NASM. NASM trên MacOS ko có sẵn, phải cài thêm thông qua brew.x86 Assembly Guide: bài này mình hay sử dụng để tra cứu giúp nhanh các chỉ thị và thanh ghi [vì não cá vàng chưa thể nhớ nổi

]OS X Assembler Reference: Guide về Assembler cho OS X của Apple, mình sử dụng doc này để convert code bên Linux qua. thứ này thật sự không giúp mình nhiều, chủ yếu đuối coi phần Data Segment và memory padding để sử dụng thanh ghi EAX cho chuẩn xác. nếu như không chương trình sẽ chạy ra lỗi bus error.

Xem thêm: Cách Bỏ Chơi Điện Tử – Cách Giúp Con Cái Nghiện Game Hiệu Quả

Dù rằng dừng lại khá sớm với việc học ASM tuy nhiên mình cũng hài lòng với hậu quả đạt được. Mình mang lại được một mớ kiến thức kha khá về CPU, căn bản về việc những process cấp phát bộ nhớ. và đặc biệt là bây giờ khi cái màn hình debug trong XCode hiện lên 1 mớ ASM mình có thể biết được phần nào chứ không coi nó như thứ ngôn ngữ ngoài hành tinh nữa.

Các ứng dụng chạy trên win thường 32 hay 64 bit. Trong khi mới bắt đầu học assembly chúng ta code trên nền tảng 16bit. Do vậy chúng ta cần tạo lập 1 môi trường 16bit để chạy code assemly.

Chúng ta dùng 1 hệ điều hành free, có tên là dosbox để chạy các ứng dụng 16bit.

Chúng ta tải tại trang chủ:

//www.dosbox.com/download.php?main=1

Tiếp theo chúng ta cần 1 compiler để biên dịch mã nguồn sang file obj hay compiler nó sang file exe 16 bit. Chúng ta dùng masm, tải tại đây:

Nhấn vào đây để tải về

Bây giờ, chúng ta sẽ giải nén asm và bỏ vào 1 ỗ đĩa, mình sẽ bỏ vào ổ D, và nó có đường dẫn:

D:\asm

Chúng ta không được bỏ vào 1 thư mục có tên quá dài, không có dấu cách hay tên tiếng Việt.

Như D:\học asm\asm là sai!

Tiếp theo chúng ta cài đặt dosbox bình thường, và chạy nó lên.

Chúng ta tiến hành mount ổ C cho nó theo ổ thật trên máy chúng ta. Mình để asm ở đâu thì mount tới ổ đó.

Ví dụ cho trường hợp này:

mount c D:\

ok vậy là dosbox có ổ C trùng với ổ D của máy thật.

Tiếp theo chúng ta di chuyển tới ổ C bằng câu lệnh:

C:\

Bây giờ, chúng ta tiếp tục di chuyển tới thư mục asm bằng câu lệnh:

cd C:\asm

Vậy là bây giờ chúng ta đang nằm trong thư mục này. Chúng ta có thể show tất cả các file trong thư mục này bằng lệnh:

dir

Tiếp theo chúng ta tạo 1 file để test code asm. Mình cho file hello world như sau:

title Hello World Program [hello.asm] ; This program displays "Hello, World!" dosseg .model small .stack 100h .data hello_message db 'Hello, World!',0dh,0ah,'$' .code main proc mov ax,@data mov ds,ax mov ah,9 mov dx,offset hello_message int 21h mov ax,4C00h int 21h main endp end main

Các bạn lưu đoạn code trên vào 1 file có tên là hello.asm và tạo luôn trong ổ D 1 thư mục asmp, rồi đưa file này vào đó.[chú ý file không lưu là hello.asm.txt nhé, nhầm đuôi là hết chơi]

thư mục này không đặt tên quá dài, compliler của chúng ta sẽ không đọc được.

ví dụ: D:\asmp\hello.asm

DosBox sẽ nhận ra nó ở thư mục C:\asmp\hello.asm

Ok vậy là đã đủ gạo, bây giờ chúng ta sẽ tiến hành nấu nó lên!

chúng ta dùng lệnh để biên dịch file code trên, như sau:

masm C:\asmp\hello.asm

Gõ tiếp tên của file obj tạo ra ở đường dẫn:

c:\asmp\hello.obj

Enter tiếp 2 lần và các bạn vào thư mục D:\asmp\ thì thấy luôn file hello.obj

OK, bây giờ cơm sắp chín, chúng ta làm công đoạn cuối là tạo file exe từ file obj bằng câu lệnh:

link c:\asmp\hello.obj

và gõ câu lệnh để xuất ra file exe:

c:\asmp\hello.exe

Nhấn tiếp enter 2 lần. bây giờ vào thư mục asmp bạn đã thấy file exe!

để chạy exe, các bạn vào thư mục asmp rồi gõ tên file:

cd .. 

cd c:\asmp\

dir [đã thấy file exe]

hello.exe

Cuối cùng các bạn đã thấy dòng chữ hello world xuất hiện!

Vậy là chúng ta đã hoàn thành việc thiết lập môi trường chạy cho assembly.

Video liên quan

Chủ Đề