我在 80x86 汇编中有这行代码:
.DATA
string BYTE 22 DUP (?)
.CODE
input string,22
lea EBX,string
我想比较字符串的字节。我该怎么做?
LEA
指令用于将地址加载到寄存器中,此外它还可以进行一些与索引数组相关的计算。
在您的示例中,您已经将地址加载到
EBX
中。
现在您可以像这样访问字符串的字符:
mov al, byte ptr [ebx]
但是,如果您只想比较字符串,您应该知道在
x86
汇编中,有可用的指令可以比较内存长度。为此,您将最大长度加载到 ECX
中,将第一个指针加载到 ESI
中,将第二个指针加载到 EDI
中。然后,您可以将 cmps[x]
(x 是操作数大小 [b]yte、[w]ord 或 [d]word)与 rep
前缀结合使用来循环访问内存,直到命中与条件,或 ecx
变为零。
一个例子:
mov ecx, maxsize ; maximum length of the memory that should be compared
mov ebx, ecx
lea esi, first_string ; Pointer to first array to be compared
lea edi, second_string ; Pointer to second array to be compared
repe cmpsb ; Loop until either ecx is 0 or the bytes are different
sub ebx, ecx ; ebx will now have the number of bytes that matched.
注意
ecx
减少了,所以如果你想知道匹配段的长度,你必须减去原始长度。如果您只想知道字符串是否相等,那么您可以简单地检查 ecx
是否为零。
如果您想做更复杂的检查,您仍然可以使用这些不带
rep
前缀的指令,并且仍然利用字符串指令,因为它也会增加 ESI
例如:
mov ecx, maxlen
lea esi, string
@@StringCmp:
lodsb ; Load the byte from DS:ESI to AL and increase ESI
; Byte is now in AL and you can do whatever you need with it.
loop @@StringCmp
EBX
已经是一个指针,即地址。只是:
mov EBX, string
LEA
指令用于加载复杂间接参数的地址。
Lea si,指针将指针地址段加载到数据ds寄存器中,因此[ds:si]是指针的20位地址。