- vừa được xem lúc

Logical instruction and Condition in Assembly

0 0 15

Người đăng: Kinabler

Theo Viblo Asia

Logical Instructions

Có thể bạn đã nghe qua các phép toán logic trong các ngôn ngữ lập trình phổ biến như là c và c++. Khi bạn sử dụng các toán tử logic đó thì các bạn sẽ cần phải import 1 thư viện có tên là stdbool.h đúng không?
Thì trong Assembly cũng tương tự như vậy. Nó cũng có các biểu thức logic.
Dưới đây là các logical instruction trong assembly.

Case Instruction Syntax
1 AND AND operand1, operand2
2 OR OR operand1, operand2
3 NOT NOT operand
4 XOR XOR operand1, operand2
5 TEST TEST operand1, operand2


Toán hạng đầu tiên trong tất cả các trường hợp có thể là thanh ghi hoặc bộ nhớ. Toán hạng thứ hai có thể là thanh ghi / bộ nhớ hoặc giá trị ngay lập tức (constant). Tuy nhiên, thực thi logic từ bộ nhớ đến bộ nhớ là không thể.
Ví dụ cho các trường hợp:

;+----------------------AND instruction-----------------------+
; bl = 0011 1010
and	bl, 0xF ; This sets BL to 0000 1010
and	al, 0x1 ; Anding with 0000 0001
jz even_number ; jump to even_number (say after)
;+----------------------OR instruction------------------------+
; bl = 0011 1010
or bl, 0xF ; This sets BL to 0011 1111
;+----------------------XOR instruction-----------------------+
xor eax, eax ; set eax = 0
;+----------------------TEST instruction----------------------+
test al, 0x1 ; check even or odd number
jz EVEN_NUMBER
;+-----------------------NOT instruction----------------------+
; al = 0100 1101
not al ; set al = 1011 0010

Chốt lại thì những logical instruction này cực kì hữu ích trong việc tối đa hóa thời gian xử lí dữ liệu và trong 1 vài trường hợp khác. Nếu bạn có thể tận dụng được điều này thì bạn có lợi thế khá lớn so với mình 😔.
Còn nếu bạn chưa hiểu về cách hoạt động của các instruction này thì có thể đọc bài này.

Conditions

Các điều kiện phổ biến mà các bạn hay gặp là: ==, <=, >=, != nó rất quen thuộc với mọi lập trình viên.
Còn assembly thì sao ?
Thì nó cũng tương tự, chỉ khác nhau ở cách thể hiện qua các instruction ví dụ như :
je <--> jump if equal, jne <--> jump if not equal, jg <--> jump if great, jl <--> jump if less
Thì nhìn qua nghĩa tiếng anh của nó thì bạn cũng có thể biết là nó có chức năng gì rồi nhỉ :v . Nó chỉ có 1 vài cái cơ bản thôi nên mình sẽ để đây để các bạn học nhe dễ lắm.
Bảng các instruction này dược sử dụng cho dữ liệu có dấu(signed) nha

Instruction Description
JE / JZ Jump Equal or Jump Zero
JNE / JNZ Jump not Equal or Jump Not Zero
JG / JNLE Jump Greater or Jump Not Less/Equal
JGE / JNL Jump Greater/Equal or Jump Not Less
JL / JNGE Jump Less or Jump Not Greater/Equal
JLE / JNG Jump Less/Equal or Jump Not Greater


Còn bảng các instruction này dược sử dụng cho dữ liệu không có dấu(unsigned) nha

Instruction Description
JE / JZ Jump Equal or Jump Zero
JNE / JNZ Jump not Equal or Jump Not Zero
JA / JNBE Jump Above or Jump Not Below/Equal
JAE / JNB Jump Above/Equal or Jump Not Below
JB / JNAE Jump Below or Jump Not Above/Equal
JBE / JNA Jump Below/Equal or Jump Not Above


Nhưng mà trước khi jump thì chúng ta cần có 1 số điều kiện và chúng được được thực hiện qua CMP instructions
Có 2 loại condition: đó là có điều kiệnvô điều kiện(tức là bắt buộc nhảy)

  • Vô điều kiện thường sử dụng với jmp instruction.
  • Còn có điều kiện là những lệnh nhảy mà bạn đã thấy nó ở trên.

Đối với CMP(compare) instruction, nó có tác dụng so sánh 2 toán hạng với nhau với cú pháp sau:
CMP operand1 operand2

Nếu operand1 == operand2 --> je sẽ được thực thi.
nếu operand1 <= operand2 --> jle sẽ được thực thi.
Và tương tự với các lệnh jump còn lại bạn tự học nha 😊
Như mọi khi thì phần này khá hay nên mình sẽ có 1 bài tập cho các bạn đây:
Nhập vào 1 số kiểm tra số đó là số chăn hay số lẻ:

image.png
Nhớ là số có 1 chữ số thôi nha. Số 2 chữ số là khó đó 😁.

[!!] Hãy nhớ là tự mình làm ra trước khi đọc source code nha:

sys_write equ 0x4
sys_read equ 0x3
sys_exit equ 0x1
stdin equ 0x0
stdout equ 0x1 section .data msg1 db "Enter a number: " len1 equ $-msg1 msg2 db "This is even number" len2 equ $-msg2 msg3 db "This is odd number" len3 equ $-msg3
section .bss number resd 0x2 section .text global _start
_start: ;print string mov eax, sys_write mov ebx, stdout mov ecx, msg1 mov edx, len1 int 0x80 ;input mov eax, sys_read mov ebx, stdin mov ecx, number mov edx, 0x1 int 0x80 ;process data mov eax, [number] sub eax, "0" and eax, 0x1 cmp eax, 0x0 je even_number jmp odd_number even_number: mov eax, sys_write mov ebx, stdout mov ecx, msg2 mov edx, len2 int 0x80 jmp exit odd_number: mov eax, sys_write mov ebx, stdout mov ecx, msg3 mov edx, len3 int 0x80 jmp exit exit: mov eax, sys_exit int 0x80

Bình luận

Bài viết tương tự

- vừa được xem lúc

Tự viết Emulator: CHIP-8 Interpreter

Tự viết Emulator: CHIP-8 Interpreter. Nhắc đến game giả lập, chắc không ai lạ gì và ai cũng từng chơi qua (giả lập NES, Gameboy, PS1, PS2,.

0 0 16

- vừa được xem lúc

Shellcode - Hướng dẫn tạo shellcode đơn giản

1. Các bước để thực hiện 1 system call.

0 0 13

- vừa được xem lúc

[ 11 Days with Assembly ] - Buổi 1: Introduction

Lời chào. Nguồn cảm hứng.

0 0 12

- vừa được xem lúc

Áp dụng cách chạy assembly của CPU vào coding cho python

1. Giới thiệu.

0 0 3