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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | ;+----------------------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ện và vô đ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ẻ:
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | sys_write equ <span class="token number">0x4</span> sys_read equ <span class="token number">0x3</span> sys_exit equ <span class="token number">0x1</span> <span class="token constant">stdin</span> equ <span class="token number">0x0</span> <span class="token constant">stdout</span> equ <span class="token number">0x1</span> section <span class="token punctuation">.</span>data msg1 db <span class="token string">"Enter a number: "</span> len1 equ $<span class="token operator">-</span>msg1 msg2 db <span class="token string">"This is even number"</span> len2 equ $<span class="token operator">-</span>msg2 msg3 db <span class="token string">"This is odd number"</span> len3 equ $<span class="token operator">-</span>msg3 section <span class="token punctuation">.</span>bss number resd <span class="token number">0x2</span> section <span class="token punctuation">.</span>text global _start _start<span class="token operator">:</span> <span class="token punctuation">;</span>print string mov eax<span class="token punctuation">,</span> sys_write mov ebx<span class="token punctuation">,</span> <span class="token constant">stdout</span> mov ecx<span class="token punctuation">,</span> msg1 mov edx<span class="token punctuation">,</span> len1 <span class="token keyword">int</span> <span class="token number">0x80</span> <span class="token punctuation">;</span>input mov eax<span class="token punctuation">,</span> sys_read mov ebx<span class="token punctuation">,</span> <span class="token constant">stdin</span> mov ecx<span class="token punctuation">,</span> number mov edx<span class="token punctuation">,</span> <span class="token number">0x1</span> <span class="token keyword">int</span> <span class="token number">0x80</span> <span class="token punctuation">;</span>process data mov eax<span class="token punctuation">,</span> <span class="token punctuation">[</span>number<span class="token punctuation">]</span> sub eax<span class="token punctuation">,</span> <span class="token string">"0"</span> and eax<span class="token punctuation">,</span> <span class="token number">0x1</span> cmp eax<span class="token punctuation">,</span> <span class="token number">0x0</span> je even_number jmp odd_number even_number<span class="token operator">:</span> mov eax<span class="token punctuation">,</span> sys_write mov ebx<span class="token punctuation">,</span> <span class="token constant">stdout</span> mov ecx<span class="token punctuation">,</span> msg2 mov edx<span class="token punctuation">,</span> len2 <span class="token keyword">int</span> <span class="token number">0x80</span> jmp exit odd_number<span class="token operator">:</span> mov eax<span class="token punctuation">,</span> sys_write mov ebx<span class="token punctuation">,</span> <span class="token constant">stdout</span> mov ecx<span class="token punctuation">,</span> msg3 mov edx<span class="token punctuation">,</span> len3 <span class="token keyword">int</span> <span class="token number">0x80</span> jmp exit exit<span class="token operator">:</span> mov eax<span class="token punctuation">,</span> sys_exit <span class="token keyword">int</span> <span class="token number">0x80</span> |