lea指令的用途:
1)地址计算/地址传送(详情见上文)
2)执行计算操作:
来源:湖大CS课程组(侵删)
通过比例基址寻址的知识,我们知道t=5*x+2*y+8*z;
lea实在AGU内执行的,对于普通的用ALU执行的计算操作而言,其优势在于:
lea可以在一个时钟周期内完成,执行效率高。而ALU计算的话,加法需要1~3个时钟周期,乘法一般需要>10个时间周期,除法需要几十甚至上百个时间周期。
JMP指令(无条件跳转)
有这样一个汇编语言文件,第八行有jmp指令,预期不会执行第九行的movl而是直接跳转到11行。
设置断点,开run,执行结果与预期相符。
栈操作指令(先进后出)
这里stack的样子与C++中的相反,是倒过来的,即:
入栈(push)是将元素依次从上往下放。
指令格式:
push S
pop D
操作数可以是:
立即数(仅push)
寄存器
内存(已定义的变量)
实例:
注:
高位高地址,低位低地址。
入栈过程解析:
10行:将32位的0x88888888入栈。
13行:将32位的0x12345678写入ebx。
14行:ebx入栈。
17行:bx(ebx的低十六位)入栈。
18行:pushw读取value的后十六位,高位到低位依次入栈。
19行:value的地址入栈。
来源:湖大CS课程组(侵删)
出栈过程解析:
22行:32位数据出栈,并将其写入ebx寄存器中。
23行:32位数据出栈,并将其写入eax寄存器中。
24行:16位数据出栈,并将其写入cx寄存器中。
来源:湖大CS课程组(侵删)
(注意顺序:低位到高位保存,但是我们是从高位到低位读)