在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 

调试后,我明白,第一个指令比较寄存器rsirdi,逐字节的字节数。

然后根据该指令设置rdxrax的低位字节。

我的疑惑是,当我在线查阅这个指令时,它说seta如果它的上面的某个值设置低位字节为0x01,否则它的0x00。与setb类似,如果字节低于特定值,则将该字节设置为0x01。

我的问题是什么价值,它与上述指令有什么关系?

+3

'setCC'协商标志位,它并不关心他们是如何设置。'cmps'设置标志位。这就是连接。 – Jester

cmps instruction比较[rsi][rdi]repz prefix(代替拼写repe)意味着增加rsirdi然后重复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的文档。

+0

那么'seta'和'setb'在哪里? –

+0

@Varun lyer在最后两行。 – fuz

+0

所以你在设置'dl'和'al'时比较指针?不是寄存器本身的值? –

指令助记符是:

  • 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
  • +0

    所以上面的标志和下面的标志是eflags寄存器的一部分? –

    +0

    标志由cmps操作设置/重置。 –

    +0

    阅读这些操作我会说这看起来像一个strncmp()或类似的操作。 –