leal指令用于加载有效地址(loadeffective address)。
leal指令的目的操作数必须是寄存器。实际上leal指令有时用于与加载地址无关的场景。
示例:
leal 6(%eax), %edx //把eax的值+6放入edx中。
leal (%eax, %ecx), %edx //把eax+ecx的值装入edx中。
leal (%eax, %ecx, 4), %edx //把eax + 4*ecx的值装入edx中。
leal 7(%eax, %eax, 8), %edx //把9*eax +7的值装入edx中。
leal 0xA(,%eax,4), %edx //把4*eax + 10的值装入edx中。
leal 9(%eax, %ecx, 2), %edx //把eax + 2*ecx+ 9的值装入edx中。
如下是算术逻辑运算指令:
inc D,加1。
dec D,减1。
neg D,取负数。
not D,取反。
add S, D,D= D +S,加。
sub S, D,D= D –S,减。
imul S, D,D= D * S, 乘。
xor S, D,D = D ^ S, 异或。
or S, D,D = D | S,或。
and S, D,D = D & S,与。
示例:
假设eax值是0x100,ecx是1,edx是3。
0x100的值是0xff,0x104的值是0xab,0x108的值是0x13,0x10c的值是0x11。
addl %ecx (%eax) //更新的eax寄存器指向的内存地址中的值。eax保存地址是0x100,0x100中保存的值是0xff,ecx中的值是1,那么更新后值应该是0x100。
subl %edx, 4(%eax) //更新的是eax+4指向的内存地址的值,也就是0x104地址更新后的值是0xa8。
imull $16, (%eax, %edx,4)//更新的是0x10c的地址中的值,更新后的值是0x110。
incl 8(%eax) // 更新0x108的地址的值,更新后的值是0x14。
decl %ecx // 更新ecx的值,更新后的值是0。
subl%edx, %eax // 更新 eax 的值,更新后的值是 0xfd 。