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

时间:2013-12-30 07:21:01

标签: assembly x86

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

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

我想比较字符串的字节数。我怎么能这样做?

2 个答案:

答案 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指令用于加载复杂间接参数的地址。