汇编语言逻辑“或”指令与应用示例:OR (Logical Inclusive OR)和 XOR (Logical Exclusive OR)

本文详细介绍了汇编指令OR和XOR在逻辑运算中的作用,以及它们对标识寄存器状态的影响。OR指令用于逻辑包含,当输入中有1则结果为1;XOR指令用于逻辑互斥,输入相异结果为1。通过示例代码展示了如何用这些指令清零寄存器和标志位,如在四则运算前清除溢出和进位标志。同时,文章指出ORRAX,RAX和XORRAX,RAX组合常用于特定的寄存器操作,如清零标志位或寄存器自身。

1. 定义:
(1) OR是或运算,A OR B的结果:当A、B中只要有一个或者两个都为1时,结果为1,否则为0。
    原则:两个输入有真则真。
    汇编指令OR,称为逻辑包含“或”。
(2) XOR是异或运算,A XOR B的结果:当A、B两个不同时结果为1,否则为0。
    原则:两个输入相异则真。
    汇编指令XOR,称为逻辑互斥“或”(注:使用的是exclusive的第二个字母缩写,因为e已被其它缩写占用)。
2. OR 和 XOR的应用示例:
执行这2条指令(还有逻辑AND指令也是一样)后会将结果存入目标寄存器,对标志位的影响为:会清除溢出标志位(OF)和进位标志位(CF); 符号标志位(SF), 0标识位(ZF)和奇偶标志位(PF)视结果而定。辅助进位标志(AF)未定义。
示例:
TestAsm proc
    xor rax,rax  ;清除eax的内容
    mov rcx,0FFFFFFFFFFFFFFFFH   ; 置为全1
    or rax,rcx   ; ecx的内容存入eax
    ret
TestAsm endp

说明:
(1) 执行 xor rax,rax 指令前,标志寄存器状态:
OV = 0 UP = 0 EI = 1 PL = 0 ZR = 0 AC = 0 PE = 1 CY = 0
(标识位请看这里:标识寄存器状态说明)
rax的状态:RAX = 000000EB55796C00,这是一个随机值
(2) 执行 xor rax,rax 指令后,标志寄存器状态:
OV = 0 UP = 0 EI = 1 PL = 0 ZR = 1 AC = 0 PE = 1 CY = 0
ZR=1,表示操作结果的目标值为0,看rax的值:RAX = 0000000000000000,xor后值存入目标寄存器。
(3) 执行mov rcx,0FFFFFFFFFFFFFFFFH指令后,RCX = FFFFFFFFFFFFFFFF,标志寄存器状态没有变化。
(4) 执行or rax,rcx指定后,rax = FFFFFFFFFFFFFFFF,标志寄存器状态为:
OV = 0 UP = 0 EI = 1 PL = 1 ZR = 0 AC = 0 PE = 1 CY = 0
目标寄存的值rax = FFFFFFFFFFFFFFFFH,因为ZR = 0,表示不为0。

因此,根据其特点,常用or rax,rax 写法(相同寄存器作源操作寄存器,又作目标寄存器)来清0标识寄存器的溢出标志和进位进志(在进行四则运算前),因为它不改变寄存器的值,仅改变标识寄存器的状态;常用xor rax,rax写法来清0寄存器的值。

详细注释每一行汇编 0000000140888290 ; __int64 __fastcall NtCreateDebugObject(PHANDLE DebugHandle, ACCESS_MASK DesiredAccess, POBJECT_ATTRIBUTES ObjectAttributes, ULONG Flags) 0000000140888290 NtCreateDebugObject proc near ; DATA XREF: .pdata:000000014011CF74↑o 0000000140888290 ; PAGE:000000014098C2E8↓o 0000000140888290 var_68 = qword ptr -68h 0000000140888290 ObjectBodySize = dword ptr -60h 0000000140888290 var_58 = qword ptr -58h 0000000140888290 var_50 = dword ptr -50h 0000000140888290 Object = qword ptr -48h 0000000140888290 var_40 = qword ptr -40h 0000000140888290 DebugObject = qword ptr -30h 0000000140888290 Handle = qword ptr -28h 0000000140888290 var_8 = byte ptr -8 0000000140888290 mov rax, rsp 0000000140888293 mov [rax+8], rbx 0000000140888297 mov [rax+10h], rsi 000000014088829B mov [rax+18h], rdi 000000014088829F push r14 00000001408882A1 sub rsp, 80h ; Integer Subtraction 00000001408882A8 mov esi, r9d 00000001408882AB mov r14d, edx 00000001408882AE mov rdi, rcx 00000001408882B1 and qword ptr [rax-28h], 0 ; Logical AND 00000001408882B6 and qword ptr [rax-30h], 0 ; Logical AND 00000001408882BB mov rax, gs:188h 00000001408882C4 mov r10b, [rax+232h] 00000001408882CB loc_1408882CB: ; DATA XREF: .rdata:00000001400B5514↑o 00000001408882CB test r10b, r10b ; Logical Compare 00000001408882CE jz short loc_1408882E7 ; Jump if Zero (ZF=1) 00000001408882D0 mov rcx, 7FFFFFFF0000h 00000001408882DA cmp rdi, rcx ; Compare Two Operands 00000001408882DD cmovb rcx, rdi ; Move if Below (CF=1) 00000001408882E1 mov rax, [rcx] 00000001408882E4 mov [rcx], rax 00000001408882E7 loc_1408882E7: ; CODE XREF: NtCreateDebugObject+3E↑j 00000001408882E7 and qword ptr [rdi], 0 ; Logical AND 00000001408882EB loc_1408882EB: ; DATA XREF: .rdata:00000001400B5514↑o 00000001408882EB test esi, 0FFFFFFFEh ; Logical Compare 00000001408882F1 jz short loc_1408882FD ; Jump if Zero (ZF=1) 00000001408882F3 mov eax, 0C000000Dh 00000001408882F8 jmp loc_1408883FE ; Jump 00000001408882FD ; --------------------------------------------------------------------------- 00000001408882FD loc_1408882FD: ; CODE XREF: NtCreateDebugObject+61↑j 00000001408882FD mov rdx, cs:DbgkDebugObjectType ; ObjectType 0000000140888304 and [rsp+88h+var_40], 0 ; Logical AND 000000014088830A lea rax, [rsp+88h+DebugObject] ; Load Effective Address 000000014088830F mov [rsp+88h+Object], rax ; Object 0000000140888314 and [rsp+88h+var_50], 0 ; Logical AND 0000000140888319 and dword ptr [rsp+88h+var_58], 0 ; Logical AND 000000014088831E mov [rsp+88h+ObjectBodySize], 68h ; 'h' ; ObjectBodySize 0000000140888326 mov r9b, r10b ; OwnershipMode 0000000140888329 mov cl, r10b ; ProbeMode 000000014088832C call ObCreateObjectEx ; Call Procedure 0000000140888331 test eax, eax ; Logical Compare 0000000140888333 js loc_1408883FE ; Jump if Sign (SF=1) 0000000140888339 mov rbx, [rsp+88h+DebugObject] 000000014088833E mov dword ptr [rbx+18h], 1 0000000140888345 and qword ptr [rbx+20h], 0 ; Logical AND 000000014088834A and dword ptr [rbx+28h], 0 ; Logical AND 000000014088834E lea rcx, [rbx+30h] ; Event 0000000140888352 xor r8d, r8d ; State 0000000140888355 lea edx, [r8+1] ; Type 0000000140888359 call KeInitializeEvent ; Call Procedure 000000014088835E lea rax, [rbx+50h] ; Load Effective Address 0000000140888362 mov [rax+8], rax 0000000140888366 mov [rax], rax 0000000140888369 xor r8d, r8d ; State 000000014088836C xor edx, edx ; Type 000000014088836E mov rcx, rbx ; Event 0000000140888371 call KeInitializeEvent ; Call Procedure 0000000140888376 test sil, 1 ; Logical Compare 000000014088837A jz short loc_140888385 ; Jump if Zero (ZF=1) 000000014088837C mov dword ptr [rbx+60h], 2 0000000140888383 jmp short loc_140888389 ; Jump 0000000140888385 ; --------------------------------------------------------------------------- 0000000140888385 loc_140888385: ; CODE XREF: NtCreateDebugObject+EA↑j 0000000140888385 and dword ptr [rbx+60h], 0 ; Logical AND 0000000140888389 loc_140888389: ; CODE XREF: NtCreateDebugObject+F3↑j 0000000140888389 mov rax, gs:188h 0000000140888392 mov rcx, [rax+0B8h] 0000000140888399 mov rax, [rcx+580h] 00000001408883A0 test rax, rax ; Logical Compare 00000001408883A3 jz short loc_1408883C1 ; Jump if Zero (ZF=1) 00000001408883A5 movzx eax, word ptr [rax+8] ; Move with Zero-Extend 00000001408883A9 mov ecx, 14Ch 00000001408883AE cmp ax, cx ; Compare Two Operands 00000001408883B1 jz short loc_1408883BD ; Jump if Zero (ZF=1) 00000001408883B3 mov ecx, 1C4h 00000001408883B8 cmp ax, cx ; Compare Two Operands 00000001408883BB jnz short loc_1408883C1 ; Jump if Not Zero (ZF=0) 00000001408883BD loc_1408883BD: ; CODE XREF: NtCreateDebugObject+121↑j 00000001408883BD or dword ptr [rbx+60h], 4 ; Logical Inclusive OR 00000001408883C1 loc_1408883C1: ; CODE XREF: NtCreateDebugObject+113↑j 00000001408883C1 ; NtCreateDebugObject+12B↑j 00000001408883C1 lea rax, [rsp+88h+Handle] ; Load Effective Address 00000001408883C6 mov [rsp+88h+var_58], rax 00000001408883CB and qword ptr [rsp+88h+ObjectBodySize], 0 ; Logical AND 00000001408883D1 and dword ptr [rsp+88h+var_68], 0 ; Logical AND 00000001408883D6 xor r9d, r9d ; Logical Exclusive OR 00000001408883D9 mov r8d, r14d 00000001408883DC xor edx, edx ; Logical Exclusive OR 00000001408883DE mov rcx, [rsp+88h+DebugObject] 00000001408883E3 call ObInsertObjectEx ; Call Procedure 00000001408883E8 mov ecx, eax 00000001408883EA test eax, eax ; Logical Compare 00000001408883EC js short loc_1408883FE ; Jump if Sign (SF=1) 00000001408883EE loc_1408883EE: ; DATA XREF: .rdata:00000001400B5524↑o 00000001408883EE mov rax, [rsp+88h+Handle] 00000001408883F3 mov [rdi], rax 00000001408883F6 jmp short loc_1408883FA ; Jump 00000001408883F8 ; --------------------------------------------------------------------------- 00000001408883F8 loc_1408883F8: ; DATA XREF: .rdata:00000001400B5524↑o 00000001408883F8 mov ecx, eax 00000001408883FA loc_1408883FA: ; CODE XREF: NtCreateDebugObject+166↑j 00000001408883FA mov eax, ecx 00000001408883FC jmp short $+2 ; Jump 00000001408883FE ; --------------------------------------------------------------------------- 00000001408883FE loc_1408883FE: ; CODE XREF: NtCreateDebugObject+68↑j 00000001408883FE ; NtCreateDebugObject+A3↑j ... 00000001408883FE lea r11, [rsp+88h+var_8] ; Load Effective Address 0000000140888406 mov rbx, [r11+10h] 000000014088840A mov rsi, [r11+18h] 000000014088840E mov rdi, [r11+20h] 0000000140888412 mov rsp, r11 0000000140888415 pop r14 0000000140888417 retn ; Return Near from Procedure 0000000140888417 ; --------------------------------------------------------------------------- 0000000140888418 db 0CCh 0000000140888419 ; --------------------------------------------------------------------------- 0000000140888419 NtCreateDebugObject$filt$1_0: ; DATA XREF: .rdata:00000001400B5514↑o 0000000140888419 ; .pdata:000000014011CF74↑o ... 0000000140888419 push rbp 000000014088841B sub rsp, 50h ; Integer Subtraction 000000014088841F mov rbp, rdx 0000000140888422 mov rax, gs:188h 000000014088842B mov [rbp+70h], rax 000000014088842F mov rax, [rbp+70h] 0000000140888433 mov cl, [rax+232h] 0000000140888439 mov [rbp+51h], cl 000000014088843C mov cl, [rbp+51h] 000000014088843F xor eax, eax ; Logical Exclusive OR 0000000140888441 test cl, cl ; Logical Compare 0000000140888443 setnz al ; Set Byte if Not Zero (ZF=0) 0000000140888446 add rsp, 50h ; Add 000000014088844A pop rbp 000000014088844B retn ; Return Near from Procedure 000000014088844B ; --------------------------------------------------------------------------- 000000014088844C db 0CCh 000000014088844D ; --------------------------------------------------------------------------- 000000014088844D NtCreateDebugObject$filt$0: ; DATA XREF: .rdata:00000001400B5524↑o 000000014088844D ; .pdata:000000014011CF80↑o ... 000000014088844D push rbp 000000014088844F sub rsp, 50h ; Integer Subtraction 0000000140888453 mov rbp, rdx 0000000140888456 mov rax, gs:188h 000000014088845F mov [rbp+68h], rax 0000000140888463 mov rax, [rbp+68h] 0000000140888467 mov cl, [rax+232h] 000000014088846D mov [rbp+50h], cl 0000000140888470 mov cl, [rbp+50h] 0000000140888473 xor eax, eax ; Logical Exclusive OR 0000000140888475 test cl, cl ; Logical Compare 0000000140888477 setnz al ; Set Byte if Not Zero (ZF=0) 000000014088847A add rsp, 50h ; Add 000000014088847E pop rbp 000000014088847F retn ; Return Near from Procedure 000000014088847F ; --------------------------------------------------------------------------- 0000000140888480 db 0CCh 0000000140888480 NtCreateDebugObject endp
08-12
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值