RTL寄存器传送语言:简化对指令功能的说明
R[r]
:存储器r
的内容M[addr]
:存储单元addr
的内容M[R[r]]
:寄存器r
的内容所指的存储单元的内容
汇编指令movw 4(%ebp),%ax
的RTL语言为:R[ax] <- M[R[ebp]+4]
- 将寄存器EBP的内容和4相加得到的地址对应的两个连续存储单元中的内容送到寄存器AX中
汇编助记符:汇编语言中的英文单词或其缩写、标号、变量名称 汇编程序:将汇编指令翻译为机器指令 反汇编程序:机器指令翻译为汇编指令 机器级语言:机器语言和汇编语言 机器级程序:用机器指令表示的机器语言程序和由汇编指令表示的汇编语言程序
指令集体系结构ISA
机器语言级虚拟机:将物理上的计算机硬件抽象成一个逻辑上的虚拟计算机。
GCC:GNU C语言编译器
GCC生成的很多汇编指令助记符结尾有l
或w
等长度后缀。l
表示操作数为双字32位,w
表示操作数为单字16位。
在IA-32中,大多数操作数都是32位,所以通常省略后缀l
。
AT&T:
b
表示操作数长度为字节8位,w
表示字16位,l
表示双字32位,q
表示四字64位。- 寄存器操作格式:%+寄存器名
- 存储器操作数形式:偏移量(基址寄存器,变址寄存器,比例因子)
GCC生成的汇编代码中的指令助记符大部分都有长度后缀。 微软MASM工具生成的Intel汇编格式不用长度后缀,而是通过寄存器名称和长度指示符PTR区分。
寄存器组织
IA-32指令中操作数有三类:立即数、寄存器操作数、存储器操作数。
ESP是栈指针寄存器 EBP是基址指针寄存器 EFLAGS标志寄存器:记录机器的状态和控制信息 条件标志存放运行的状态信息,由硬件自动设定,也被称条件码:
- OF:溢出标志
- SF:符号标志
- ZF:零标志
- CF:进/借位标志
OF和SF对无符号数运算没有意义,CF对有符号数运算没有意义。 控制标志由软件设定,用于中断响应、串操作、单步控制:
- DF:方向标志
- IF:中断允许标志
- TF:陷阱标志
寻址方式
立即寻址:指令中直接给出操作数 寄存器寻址:指令中给出操作数所存放的寄存器的编号 其他寻址方式下的操作数都在存储单元中,称为存储器操作数
比例变址:变址值等于变址寄存器内容乘以比例系数S 非比例变址:相当于比例系数为1的比例变址。变址值就是变址寄存器的内容 寻址方式中,最适合按下标顺序访问一维数组元素的是:变址寻址。 课本上的比较粗糙,需要结合考题。
还是得多做几道题,靠做题来学
Movw (%ax), %cx
,源操作数寻址方式为寄存器间接寻址;RTL语言:R[CX]←M[R[AX]]
movw 4(%ax, %dx), %cx
,源操作数寻址方式为基址+变址+位移寻址;RTL语言:R[CX]←M[R[AX]+R[DX]+4]
movw (%ax, %dx, 3), %cx
,源操作数寻址方式为基址+比例变址寻址;RTL语言:R[CX]←M[R[AX]+R[dX]*3]
movw 0xC(%dx, %ax, 2), %cx
,源操作数寻址方式为基址+比例变址+位移寻址
movw ( , %ax, 4), %cx
,源操作数寻址方式为比例变址寻址
movw (%ax, %dx), %cx
,源操作数寻址方式为基址+变址寻址
传送指令
这一块目前就发现就这一个需要分辨的问题:mov和leal的区别
mov
:一般的数据传送指令
movl 8(%ebp),%edx
:R[edx] <- M[R[ebp]+8]
leal
:加载有效地址
leal (%edx,%eax),%eax
:R[eax] <- R[edx]+R[eax]