如何在80x86组装中使用LEA?

问题描述 投票:0回答:3

我在 80x86 汇编中有这行代码:

.DATA  
string BYTE 22 DUP  (?)   
.CODE  
input string,22  
lea EBX,string  

我想比较字符串的字节。我该怎么做?

assembly x86
3个回答
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

0
投票

EBX
已经是一个指针,即地址。只是:

mov EBX, string

LEA
指令用于加载复杂间接参数的地址。


0
投票

Lea si,指针将指针地址段加载到数据ds寄存器中,因此[ds:si]是指针的20位地址。

© www.soinside.com 2019 - 2024. All rights reserved.