gpt4 book ai didi

assembly - 在repz cmpsb之后,汇编指令 'seta'和 'setb'做了什么?

转载 作者:行者123 更新时间:2023-12-02 21:32:24 25 4
gpt4 key购买 nike

我无法理解以下 assembly 线的作用:

0x401810:    repz cmps BYTE PTR ds:[rsi],BYTE PTR es:[rdi]
0x401812: seta dl
0x401815: setb al

调试后我了解到,第一条指令逐字节比较寄存器rsirdi中的字节。

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

我的困惑是,当我在网上查找这条指令时,它说seta如果低于某个值则将低字节设置为0x01,否则设置为0x00。与 setb 类似,如果字节低于某个值,则将字节设置为 0x01。

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

最佳答案

cmps instruction比较 [rsi][rdi]repz prefix (也可拼写为 repe)表示递增 rsirdi,然后重复 cmps,只要 [rsi ][rdi] 比较相等。 rflags 寄存器将在每次迭代时设置;最后的迭代,其中 [rsi][rdi]seta (如果上面设置)和 setb< 将使用的内容(如果在下面则设置)。

换句话说,这 3 条指令的 C 伪代码如下所示:

// 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 .

关于assembly - 在repz cmpsb之后,汇编指令 'seta'和 'setb'做了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44630262/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com