Nasm in windows

8 2 0
Nasm in windows

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

Thông tin tài liệu

HDTH Kiến trúc máy tính & Hợp Ngữ Bộ môn MMTVT HCMUS LẬP TRÌNH HỢP NGỮ X86 Mục đích  Làm quen với ngôn ngữ lập trình Assembly trên kiến trúc x86  Biết cách viết, dịch, chạy và chẩn lỗi (debug) một v[.]

HDTH Kiến trúc máy tính & Hợp Ngữ Bộ mơn MMTVT - HCMUS LẬP TRÌNH HỢP NGỮ X86 Mục đích  Làm quen với ngơn ngữ lập trình Assembly kiến trúc x86  Biết cách viết, dịch, chạy chẩn lỗi (debug) vài chương trình đơn giản Tóm tắt lý thuyết Hợp ngữ (assembly) 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 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 Tuy vậy, assembly 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 đủ cấu trúc phần cứng máy tính Với kiểu kiến trúc vi xử lý, có lệnh riêng, đó, có ngơn ngữ assembly riêng cho Ở đây, nghiên cứu assembly cho vi xử lý Intel thuộc họ x86 Các chương trình viết cho chế độ thực (real mode) DOS biên dịch Netwide Assembler Cấu trúc chương trình hợp ngữ section data section bss section code _mainCRTStartup: ; Nhãn bắt đầu chương trình, thay đổi ; tùy thuộc vào loại project tạo Visual C Ví dụ: Chương trình sau in hình dịng chữ “Hello World” global extern extern extern section hello_world bytes_written output_handle _mainCRTStartup _ExitProcess@4 _GetStdHandle@4 _WriteFile@20 data db dd dd section code _mainCRTStartup: push call mov push push push push push call ; Hàm chương trình ; Gọi hàm Windows API ; Gọi hàm xử lý Windows API ; Gọi hàm xuất Windows API 'Hello World', 10, 0 -11 _GetStdHandle@4 [output_handle], eax dword bytes_written 13 dword hello_world dword [output_handle] _WriteFile@20 ; Khai báo chuỗi hello_world ; Trả chuỗi word 32-bit từ WriteFile ; The standard output handle ; Mã thực xuất ; Gọi Hàm GetStdHandle Windows API ; Lưu handle để xuất hình ; Chiều dài chuỗi ; Lấy địa chuỗi ; Gọi Handle để xuất hình ; Xuất chuỗi hình Bộ mơn Mạng máy tính & Viễn thơng – Khoa CNTT – Trường ĐH KHTN TPHCM -1- HDTH Kiến trúc máy tính & Hợp Ngữ push call Bộ môn MMTVT - HCMUS _ExitProcess@4 ; Gọi hàm ExitProcess chương trình Lưu ý: - Mọi chương trình phải có đoạn code khỏi chương trình, khơng chương trình khơng dừng hết chương trình Khai báo biến hợp ngữ Cú pháp data: d Cú pháp bss: res Các kiểu liệu: b (1 byte), w (2 bytes), d (4 bytes), q (8 bytes), t (10 bytes) Ví dụ: Khai báo data message msglength buffersize db 'Hello world!' db 12 dw 1024 ; Khai báo word có kích thước 1024 Khai báo bss filename number bignum realarray resb resb resw resq 255 1 10 Các ghi NASM Dữ liệu ghi: 16-bit ghi ah ax al 8-bit 16-bit 32-bit mở rộng Các ghi: eax eb x ecx ed x esp eb p edi esi ah bh ax bx al bl Accumulator Base Index ch dh cx dx bl dl Count Data sp bp Stack Pointer Base Pointer di si Destination Index Source Index Bộ mơn Mạng máy tính & Viễn thơng – Khoa CNTT – Trường ĐH KHTN TPHCM -2- HDTH Kiến trúc máy tính & Hợp Ngữ Bộ mơn MMTVT - HCMUS Một số lệnh NASM Lệnh Nhóm lệnh số học inc destination dec destination Ghi add destination, source destination = destination + source sub destination, source destination = destination – source imul/idiv Nhân/Chia có dấu số nguyên mul/div Ví dụ inc ebx inc byte [edi] ;Adds to any reg/mem except seg dec dl dec edi add al, [ARRAY + esi] adc ecx, ebx ;Adds registers + Carry flag ;Used for adding 64 bit nums xadd ecx, ebx ;ecx=ecx+ebx, ebx=original ecx sub eax, ebx ; eax = eax - ebx sbb ecx, ebx ; Subs registers - Carry flag mul bl ; ax=al*bl (unsigned) imul bx ; dx|ax=ax*bx (signed) Không dấu imul cx, dx, 12H ; Special, cx=dx*12H (signed only al số hạng phép nhân ) (hoặc ax eax) mul ecx ; edx|eax=eax*ecx Kết đưa vào ax (hoặc dx div cl ax edx eax) ; ah|al=ax/cl, unsigned quotient in al, remainder in ah idiv cx ; dx|ax=(dx|ax)/cx Nhóm lệnh logic and or xor test and al, bl ;al=al AND bl or eax, 10 ;eax=eax OR 0000000AH xor ah, ch ;ah=ah XOR ch test al, ;Tests bit in al – 00000100 jz LABEL ;Jump to LABEL if bit is zero not neg shift not ebx neg TEMP shl eax, ;eax is logically shifted rotate left bit pos sar esi, cl ;esi is arithmetically shifted right rol si, 14 ;si rotated left by 14 places rcr bl, cl ;bl rotated right cl places through carry Nhóm lệnh dịch chuyển mov Lệnh dịch chuyển dự liệu (kiểu mov eax, [bar] ;Refers to the contents Bộ mơn Mạng máy tính & Viễn thơng – Khoa CNTT – Trường ĐH KHTN TPHCM -3- HDTH Kiến trúc máy tính & Hợp Ngữ Bộ mơn MMTVT - HCMUS bytes, words and doublewords) of bar ghi mov eax, bar ;Refers to the address of bar ghi vùng nhớ mov eax,table[ebx] ;ERROR mov eax,[table+ebx] ;O.K mov eax,[es:edi] ;O.K push, pop data dw ;Data type defined as double word mov [data], ;Doesn’t work mov word [data], ;O.K dword input_filename_ptr dạng phương thức push push push eax pop: push Thanh ghi, nhớ (từ nhớ đến nhớ), số, ghi đoạn, cờ hiệu, tất ghi push: Nguồn liệu là: Bất kỳ ghi 16 32 bit, số, ghi đoạn, word doubleword nhớ lea pop: Nguồn liệu là: Bất kỳ ghi 16 32 bit, ghi đoạn (ngoại trừ CS), word doubleword nhớ Lấy địa liệu vào lea ghi 32 bit eax, [esi+edi] Các cờ hiệu: Cờ Z C A S P O Ý nghĩa Result zero Carry out – Cờ nhớ Half carry out – Cờ nhớ phụ Result positive Result has even parity Overflow occurred – Cờ tràn Lệnh so sánh: cmp Rs1, Rs2 Ví dụ: cmp AL, DL Một số ví dụ so sánh ghi AL DL: Bộ mơn Mạng máy tính & Viễn thơng – Khoa CNTT – Trường ĐH KHTN TPHCM -4- HDTH Kiến trúc máy tính & Hợp Ngữ Bộ mơn MMTVT - HCMUS Nhóm lệnh nhảy: Lệnh nhảy cờ đơn Lệnh Kiểm tra cờ 0: jz je Ý nghĩa Nhảy jump if zero jump if equal ZF = jnz jne jump if not zero jump if not equal ZF = jecxz jump if ECX = ECX = (Khơng có cờ để kiểm tra) jump if carry jump if no carry CF = CF = jump if overflow jump if no overflow OF = OF = jump if (negative) sign jump if no (negative) sign SF = SF = jump if parity jump if parity is even PF = Kiểm tra cờ nhớ: jc jnc Kiểm tra tràn: jo jno Kiểm tra dấu: js jns Kiểm tra parity(tính chẳn): jp jpe jnp jump if not parity jpo jump if parity is odd Nhảy so sánh số không dấu Lệnh Ý nghĩa je jump if equal jz jump if zero jne jump if not equal jnz jump if not zero ja jump if above jnbe jump if not below or equal jae jump if above or equal jnb jump if not below jb jump if below PF = Điều kiện kiểm tra ZF = ZF = CF = ZF = CF = CF = Bộ mơn Mạng máy tính & Viễn thơng – Khoa CNTT – Trường ĐH KHTN TPHCM -5- HDTH Kiến trúc máy tính & Hợp Ngữ jnae jbe jna Nhảy so sánh số có dấu Lệnh je jz jne jnz jg jnle jge jnl jl jnge jle jng jump if not above or equal jump if below or equal jump if not above Ý nghĩa jump if equal jump if zero jump if not equal jump if not zero jump if greater jump if not less or equal jump if greater or equal jump if not less jump if less jump if not greater or equal jump if less or equal jump if not greater Bộ môn MMTVT - HCMUS CF = l ZF = l Điều kiện kiểm tra ZF = ZF = ZF = SF = OF SF = OF SF ≠ OF ZF = SF ≠ OF System Call: Lệnh syscall làm treo thực thi chương trình chuyển quyền điều khiển cho HĐH (bằng cách gọi hàm Windows API) Bảng system call Lệnh hợp ngữ Ý nghĩa Hàm 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 Thốt chương trình return 0; call _ExitProcess@4 push Xuất WriteFile(hFile, output_string, push dword bytes_written length, &bytes_written, 0); push length bytes_written: kích thước push dword output_string chuỗi xuất push dword length: chiều dài chuỗi [output_handle] output_string: địa call _WriteFile@20 chuỗi xuất output_handle: lời gọi hàm đến GetStdHandle push Nhập ReadFile(hFile, &input_string, push dword bytes_read length, bytes_read) push length bytes_read: kích thước push dword input_string chuỗi xuất nhập vào push dword [input_handle length: chiều dài chuỗi ] input_string: đị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- HDTH Kiến trúc máy tính & Hợp Ngữ Bộ mơn MMTVT - HCMUS Stack Tài liệu tham khảo [1] http://www.nasm.us/doc/nasmdoc0.html The Netwide Assembler: NASM Bài tập Hãy viết chương trình hợp ngữ NASM Window (không dùng lệnh giả) để giải toán sau: Nhập vào chuỗi, xuất lại chuỗi hình (echo) Ví dụ: Nhap mot chuoi: Hello Chuoi da nhap: Hello Nhập vào ký tự, xuất ký tự liền trước liền sau Ví dụ: Nhap mot ky tu: b Ky tu lien truoc: a Ky tu lien sau: c Nhập vào ký tự hoa, in ký tự thường Ví dụ: Nhap mot ky tu: A Ky tu thuong: a Nhập từ bàn phím số nguyên, tính tổng, hiệu, tích, thương số Ví dụ: Nhap so thu nhat: Nhap so thu hai: Tong: 11 Hieu: Tich: 28 Thuong: du Nhập vào số nguyên, xuất phép so sánh số Ví dụ: Nhap so thu nhat: Nhap so thu hai: So lon hon la: Nhập ký tự từ bàn phím Nếu ký tự vừa nhập thuộc [0-9], [a-z], [A-Z] xuất hình ký tự loại ký tự (số, chữ thường, chữ hoa) Ví dụ: Nhập vào ký tự: Ký tự vừa nhập: số Nhập vào ký tự : f Ký tự vừa nhập : f chữ thường Bộ môn Mạng máy tính & Viễn thơng – Khoa CNTT – Trường ĐH KHTN TPHCM -7- HDTH Kiến trúc máy tính & Hợp Ngữ Bộ môn MMTVT - HCMUS Nhập vào ký tự : D Ký tự vừa nhập : D chữ hoa Nhập mảng số ngun n phần tử, xuất mảng hình Ví dụ: Nhap mang cac so nguyen: Mang vua nhap: Nhập vào số nguyên n, tính tổng từ đến n Ví dụ: Nhap mot so: Tong tu den la: 10 Nhập vào chuỗi, xuất 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-

Ngày đăng: 08/04/2023, 06:23

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan