在repz cmpsb之后,组装指令'seta'和'setb'是做什么的?
我无法理解什么是汇编的以下行做:在repz cmpsb之后,组装指令'seta'和'setb'是做什么的?
0x401810: repz cmps BYTE PTR ds:[rsi],BYTE PTR es:[rdi]
0x401812: seta dl
0x401815: setb al
调试后,我明白,第一个指令比较寄存器rsi
和rdi
,逐字节的字节数。
然后根据该指令设置rdx
和rax
的低位字节。
我的疑惑是,当我在线查阅这个指令时,它说seta
如果它的上面的某个值设置低位字节为0x01,否则它的0x00。与setb
类似,如果字节低于特定值,则将该字节设置为0x01。
我的问题是什么价值,它与上述指令有什么关系?
该cmps
instruction比较[rsi]
和[rdi]
。 repz
prefix(代替拼写repe
)意味着增加rsi
和rdi
然后重复cmps
只要[rsi]
和[rdi]
比较相等。 rflags
寄存器将在每次迭代中设置; [rsi]
≠[rdi]
的最终迭代是seta
(如果设置为上述设置)和setb
(如果设置如下)将使用的值。
换句话说,将C伪代码为那些3所说明是这样的:
// Initial values
uint8_t *rsi = (...);
uint8_t *rdi = (...);
uint64_t rcx = (...);
// repz cmps BYTE PTR [rsi], BYTE PTR [rdi]
while (*rsi == *rdi && rcx > 0) {
rsi++;
rdi++;
rcx--;
}
uint8_t dl = *rsi > *rdi; // seta dl
uint8_t al = *rsi < *rdi; // setb al
见所有的setCC
说明here的文档。
指令助记符是:
-
repz cmps ds:[esi], es:[edi]
比较字符串,而字符串比较等于 -
seta dl
设置dl
为1,如果在上述标志被设置,或dl至0,如果不 -
setb al
将al
设置为1(如果设置了下面的标志)或者将al设置为0(如果不是)
除了检查零标志,repz
使用ecx
寄存器来指定最大重复次数。 (ecx
也被称为计数寄存器)
[编辑]作为正确地指出通过下面小丑,不存在上面和下面标志,上方和下方都位操作的CPU的状态标志的结果:
CF = 0,ZF = 0- CF = 1
所以上面的标志和下面的标志是eflags寄存器的一部分? –
标志由cmps操作设置/重置。 –
阅读这些操作我会说这看起来像一个strncmp()或类似的操作。 –
'setCC'协商标志位,它并不关心他们是如何设置。'cmps'设置标志位。这就是连接。 – Jester