在线二区人妖系列_国产亚洲欧美日韩在线一区_国产一级婬片视频免费看_精品少妇一区二区三区在线

鍍金池/ 教程/ Java/ Assembly 邏輯指令
Assembly 變量聲明
Assembly匯編 STOS指令
Assembly 條件
Assembly 尋址模式和MOV指令
Assembly匯編教程
Assembly - 什么是匯編語言
Assembly 循環(huán)
Assembly 內(nèi)存段
Assembly匯編 宏
Assembly 寄存器
Assembly匯編 遞歸
Assembly匯編 CMPS指令
Assembly匯編 內(nèi)存管理
Assembly匯編 LODS指令
Assembly 基本語法
Assembly匯編 過程
Assembly匯編 文件管理
Assembly匯編 數(shù)組
Assembly匯編 SCAS指令
Assembly 算術(shù)指令
Assembly 環(huán)境設(shè)置
Assembly匯編 字符串處理
Assembly 數(shù)字
Assembly 常量
Assembly匯編 MOVS指令
Assembly 邏輯指令
Assembly 系統(tǒng)調(diào)用

Assembly 邏輯指令

處理器的指令集提供的指令A(yù)ND,OR,XOR,TEST和NOT布爾邏輯的測試,根據(jù)該方案的需要的位進(jìn)行置位和清除。

這些指令的格式:

SN 指令 格式
1 AND AND operand1, operand2
2 OR OR operand1, operand2
3 XOR XOR operand1, operand2
4 TEST TEST operand1, operand2
5 NOT NOT operand1

在所有的情況下,第一個(gè)操作數(shù)可以是寄存器或內(nèi)存中。第二個(gè)操作數(shù)可以是寄存器/存儲器或立即值(常量)。但是,內(nèi)存到內(nèi)存的操作是不可能的。這些指令可比較或匹配位操作數(shù)和CF,PF,SF和ZF標(biāo)志。

AND 指令

AND指令用于支持邏輯表達(dá)式執(zhí)行按位與運(yùn)算。按位與運(yùn)算返回1,如果匹配兩個(gè)操作數(shù)位為1,否則返回0。例如:

             Operand1: 	0101
             Operand2: 	0011
----------------------------
After AND -> Operand1:	0001

“與”操作,可用于清除一個(gè)或多個(gè)位。例如說,BL寄存器包含00111010。如果需要清除的高位零,AND 0FH。

AND	BL,   0FH   ; This sets BL to 0000 1010

我們的另一個(gè)例子。如果想檢查一個(gè)給定的數(shù)字是否是奇數(shù)還是偶數(shù),一個(gè)簡單的測試將是檢查的數(shù)量最少的顯著位。如果是1的為奇數(shù),其他的數(shù)是偶數(shù)。

假設(shè)數(shù)字是在AL寄存器,我們可以這樣寫:

AND	AL, 01H     ; ANDing with 0000 0001
JZ    EVEN_NUMBER

下面的程序說明了這一點(diǎn):

例子:

section    .text
   global _start               ;must be declared for using gcc
_start:                        ;tell linker entry yiibai
    mov   ax,   8h           ;getting 8 in the ax 
    and   ax, 1              ;and ax with 1
    jz    evnn
    mov   eax, 4             ;system call number (sys_write)
    mov   ebx, 1             ;file descriptor (stdout)
    mov   ecx, odd_msg       ;message to write
    mov   edx, len2          ;length of message
    int   0x80               ;call kernel
    jmp   outprog
evnn:   
    mov   ah,  09h
    mov   eax, 4             ;system call number (sys_write)
    mov   ebx, 1             ;file descriptor (stdout)
    mov   ecx, even_msg      ;message to write
    mov   edx, len1          ;length of message
    int   0x80               ;call kernel
outprog:
    mov   eax,1              ;system call number (sys_exit)
    int   0x80               ;call kernel
section   .data
even_msg  db  'Even Number!' ;message showing even number
len1  equ  $ - even_msg    
odd_msg db  'Odd Number!'    ;message showing odd number
len2  equ  $ - odd_msg

上面的代碼編譯和執(zhí)行時(shí),它會產(chǎn)生以下結(jié)果:

Even Number!

一個(gè)奇怪的數(shù)字,像在AX寄存器中的值更改:

mov  ax, 9h                  ; getting 9 in the ax

該程序會顯示:

Odd Number!

同樣你可以它清除整個(gè)寄存器 :AND和00H.

OR 指令

OR指令用于支持邏輯表達(dá)式執(zhí)行按位OR運(yùn)算。位OR運(yùn)算符返回1,如果其中一個(gè)或兩個(gè)操作數(shù)位匹配是一個(gè)。它返回0,如果兩個(gè)位都是零。

例如,

             Operand1:     0101
             Operand2:     0011
----------------------------
After OR -> Operand1:    0111

OR(或)操作可用于設(shè)置一個(gè)或多個(gè)位。例如,讓我們假設(shè)AL寄存器包含00111010,需要設(shè)置四個(gè)低階位,OR 0000 1111,即FH值。

OR BL, 0FH                   ; This sets BL to  0011 1111

實(shí)例:

下面的示例演示OR指令。讓我們存儲5和3值分別在AL和BL寄存器。然后,該指令

OR AL, BL

應(yīng)該AL寄存器中存放7:

section    .text
    global _start              ;must be declared for using gcc
_start:                        ;tell linker entry yiibai
    mov    al, 5             ;getting 5 in the al
    mov    bl, 3             ;getting 3 in the bl
    or     al, bl            ;or al and bl registers, result should be 7
    add    al, byte '0'      ;converting decimal to ascii
    mov    [result],  al
    mov    eax, 4
    mov    ebx, 1
    mov    ecx, result
    mov    edx, 1
    int    0x80
    
outprog:
    mov    eax,1             ;system call number (sys_exit)
    int    0x80              ;call kernel
section    .bss
result resb 1

上面的代碼編譯和執(zhí)行時(shí),它會產(chǎn)生以下結(jié)果:

7

XOR 指令

XOR指令實(shí)現(xiàn)按位異或操作。異或運(yùn)算得到位設(shè)置為1,當(dāng)且僅當(dāng)從操作數(shù)的位是不同的。如果操作數(shù)的位相同(都為0或?yàn)?),將得到的位被清除為0。

實(shí)例,

             Operand1:     0101
             Operand2:     0011
----------------------------
After XOR -> Operand1:    0110
異或操作數(shù)本身改變操作數(shù)為0。這是用來清除寄存器。
XOR     EAX, EAX

TEST 指令

測試指令的工作原理相同的“與”操作,但不像AND指令,它不改變它的第一個(gè)操作數(shù)。所以,如果我們需要檢查是否在寄存器數(shù)量是偶數(shù)還是奇數(shù),我們也可以做到這一點(diǎn)不改變原有號碼的情況下使用測試指令。

TEST    AL, 01H
JZ      EVEN_NUMBER

NOT 指令

指令實(shí)現(xiàn)按位非運(yùn)算。 NOT運(yùn)算操作數(shù)的位逆轉(zhuǎn)。該操作數(shù)可能是在一個(gè)寄存器或存儲器中。

實(shí)例,

             Operand1:     0101 0011
After NOT -> Operand1:    1010 1100