汇编如何检查scasb的结果

时间:2016-11-19 10:18:50

标签: assembly x86

我必须在字符串中找到子字符串的(开始)位置。我在AL中逐字节加载字符串,并使用SCASB进行比较。如何检查字节是否相等或SCASB是否为真?

        clc
        scasb ;compare the value from al with <es:di>
              ;al is loaded from <ds:si>(lodsb)
              ;I noticed that when the values are equal
              ;cf and af are 1
        jnc nextElem ;if cf is 0 go to the next element

        lahf
        cmp  ah,0
        je nextElem ;if af is 0 go to next elem

问题是LAHF没有带来我期望的值啊,意思是不是0或1,我不知道是否有任何其他方法来检查{{1}中的值并且是平等的。

3 个答案:

答案 0 :(得分:1)

我稍微更改了代码,就是这样:

document.querySelector("#foo").addEventListener(function() {
  Video.init(...)
});

答案 1 :(得分:1)

如果你不想使用跳转指令,你可以使用&#34; RepNE ScaSB&#34;字符串指令,要查找上一个不匹配字符(CX)的偏移量,您可以写:

 ClD             {Clear string direction flag}

 XOr   AL,AL     {Set AL's reg. with the character to find (0)}
 Mov   CX,0FFFFH {Set CX's reg. with maximum length of the string}

 RepNE ScaSB     {Search null and decrease CX's reg.}

 LAHF            {Load FZero flag into AH (Bit6)}
 Not   CX        {Set CX with the number of char scanned}
 ShL   AH,1      {...}
 ShL   AH,1      {... FCarry is set with (FZero after scan)}
 SbB   CX,0      {If it founds 0 decrease CX's reg.}

如果CX = 65535,您还没找到该角色。

嗨!

答案 2 :(得分:0)

$myString = "["; if ($result=mysqli_query($conn,$sql)) { while ($row=mysqli_fetch_row($result)) { $locs_json = sprintf(json_encode(array("lat"=>"%s", "lng"=>"%s", "dragable"=>"false")),$row[0],$row[1]); $locs = $locs_json.","; $myString .= $locs; } mysqli_free_result($result); $myString = rtrim($myString, ","); } $myString .= "]"; print $myString; Scasb仅在字符串上使用时才有用,在CX寄存器中使用长度/计数器。以下是cmpsb在8086 asm中实现的:

http://techref.massmind.org/techref/language/asm/x86/stdlib/STRSTR.ASM

这个想法是使用strstr和repne前缀(重复但不相等)来查找字符串中的第一个子字符串。如果找到,则使用scasb比较字符串的其余部分。