我在80x86汇编中有这行代码:
.DATA
string BYTE 22 DUP (?)
.CODE
input string,22
lea EBX,string
我想比较字符串的字节数。我怎么能这样做?
答案 0 :(得分:2)
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
答案 1 :(得分:0)
EBX
已经是指针,即地址。只是:
mov EBX, string
LEA
指令用于加载复杂间接参数的地址。