2017-06-19 42 views
4

我無法理解什麼是彙編的以下行做:在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

回答

8

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'時比較指針?不是寄存器本身的值? –

5

指令助記符是:

  • 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()或類似的操作。 –