Masm64:条件设置字节指令

1. SETcc指令概述

在MASM64中,SETcc指令是条件设置字节指令。其中cc代表各种条件码,根据不同的条件判断结果将一个字节设置为0或1。这些条件码与条件转移指令(如Jcc)的条件相对应。

例如,SETZ(当零标志位ZF = 1时设置为1,否则为0)、SETNZ(当ZF = 0时设置为1,否则为0)等。

2. 指令格式与操作数

指令格式为SETcc 目标操作数,目标操作数必须是一个8位的寄存器或内存单元。

SETZ al:如果零标志位ZF = 1(例如,在之前执行了CMP指令且比较结果相等时),则将al寄存器的值设置为1,否则设置为0。

3. 常用的SETcc指令及条件

相等/不等条件

SETZ(SET Equal)或SETE(SET Equal):当零标志位ZF = 1时,也就是之前的比较操作结果为相等时,将目标字节设置为1,否则设置为0。

cmp rax, rbx

setz al

; 如果rax和rbx相等,al = 1;否则al = 0

SETNZ(SET Not Equal)或SETNE(SET Not Equal):当ZF = 0时,即比较结果不相等,将目标字节设置为1,否则设置为0。

cmp rcx, rdx

setnz bl

; 如果rcx和rdx不相等,bl = 1;否则bl = 0

大小比较条件(有符号数)

SETG(SET Greater)或SETNLE(SET Not Less or Equal):当有符号数比较时,如果大于(不小于等于),则设置目标字节为1,否则为0。这依赖于符号标志SF、溢出标志OF和零标志ZF的状态。

cmp esi, edi

setg ah

; 如果esi > edi(有符号数比较),ah = 1;否则ah = 0

SETGE(SET Greater or Equal)或SETNL(SET Not Less):对于有符号数比较,如果大于等于(不小于),则设置目标字节为1,否则为0。

cmp eax, ebx

setge al

; 如果eax >= ebx(有符号数比较),al = 1;否则al = 0

SETL(SET Less)或SETNGE(SET Not Greater or Equal):当有符号数比较时,如果小于(不大于等于),则设置目标字节为1,否则为0。

cmp r8d, r9d

setl r10b

; 如果r8d < r9d(有符号数比较),r10b = 1;否则r10b = 0

SETLE(SET Less or Equal)或SETNG(SET Not Greater):对于有符号数比较,如果小于等于(不大于),则设置目标字节为1,否则为0。

cmp r12d, r13d

setle r14b

; 如果r12d <= r13d(有符号数比较),r14b = 1;否则r14b = 0

大小比较条件(无符号数)

SETJA(SET Jump Above)或SETNBE(SET Not Below or Equal):当无符号数比较时,如果高于(不低于等于),则设置目标字节为1,否则为0。

cmp r15, rax

setja rbx

; 如果r15 > rax(无符号数比较),rbx = 1;否则rbx = 0

SETJAE(SET Jump Above or Equal)或SETNB(SET Not Below):对于无符号数比较,如果高于等于(不低于),则设置目标字节为1,否则为0。

cmp rcx, rdx

setjae r8b

; 如果rcx >= rdx(无符号数比较),r8b = 1;否则r8b = 0

SETJB(SET Jump Below)或SETNAE(SET Not Above or Equal):当无符号数比较时,如果低于(不高于等于),则设置目标字节为1,否则为0。

cmp esi, edi

setjb r9b

; 如果esi < edi(无符号数比较),r9b = 1;否则r9b = 0

SETJBE(SET Jump Below or Equal)或SETNA(SET Not Above):对于无符号数比较,如果低于等于(不高于),则设置目标字节为1,否则为0。

cmp eax, ebx

setjbe r10b

; 如果eax <= ebx(无符号数比较),r10b = 1;否则r10b = 0

4. 应用场景

条件判断后的赋值操作

在需要根据比较结果进行简单的布尔值(0或1)赋值时非常有用。例如,在游戏开发中判断玩家的生命值是否大于某个临界值,如果是,则设置一个表示“安全状态”的标志位为1,否则为0。

假设player_health存储在eax中,临界值为100,safe_status存储在内存单元safe_flag中。

cmp eax, 100

setg byte ptr [safe_flag]

与其他指令组合构建复杂逻辑

可以与其他指令(如算术运算、逻辑运算等)组合,构建更复杂的逻辑判断和数据处理流程。例如,在一个数据处理程序中,先判断两个数的大小关系,然后根据结果对一个数组中的元素进行不同的操作。

假设array是一个字节数组,num1存储在rcx中,num2存储在rdx中,要根据num1和num2的大小关系对array中的元素进行操作。

cmp rcx, rdx

setl al

mov rbx, offset array

test al, 1

jz equal_or_greater

; 如果rcx < rdx,执行这里的代码,对array中的元素进行一种操作

jmp end_compare

equal_or_greater:

; 如果rcx >= rdx,执行这里的代码,对array中的元素进行另一种操作

end_compare:

Masm64条件设置字节指令(SETcc)

指令条件描述(针对之前的比较操作)示例(假设比较操作:cmp rax, rbx)
SETZ/SETE零标志位ZF = 1(相等情况)setz al; 如果rax = rbx,al = 1,否则al = 0
SETNZ/SETNE零标志位ZF = 0(不等情况)setnz bl; 如果rax ≠ rbx,bl = 1,否则bl = 0
SETG/SETNLE有符号数比较,大于(不小于等于)setg ah; 如果rax > rbx(有符号),ah = 1,否则ah = 0
SETGE/SETNL有符号数比较,大于等于(不小于)setge al; 如果rax ≥ rbx(有符号),al = 1,否则al = 0
SETL/SETNGE有符号数比较,小于(不大于等于)setl r10b; 如果rax < rbx(有符号),r10b = 1,否则r10b = 0
SETLE/SETNG有符号数比较,小于等于(不大于)setle r14b; 如果rax ≤ rbx(有符号),r14b = 1,否则r14b = 0
SETJA/SETNBE无符号数比较,高于(不低于等于)setja rbx; 如果rax > rbx(无符号),rbx = 1,否则rbx = 0
SETJAE/SETNB无符号数比较,高于等于(不低于)setjae r8b; 如果rax ≥ rbx(无符号),r8b = 1,否则r8b = 0
SETJB/SETNAE无符号数比较,低于(不高于等于)setjb r9b; 如果rax < rbx(无符号),r9b = 1,否则r9b = 0
SETJBE/SETNA无符号数比较,低于等于(不高于)setjbe r10b; 如果rax ≤ rbx(无符号),r10b = 1,否则r10b = 0

64位汇编语言基础