R[r]
:存储器r
的内容M[addr]
:存储单元addr
的内容M[R[r]]
:寄存器r
的内容所指的存储单元的内容汇编指令movw 4(%ebp),%ax
的RTL语言为:R[ax] <- M[R[ebp]+4]
汇编助记符:汇编语言中的英文单词或其缩写、标号、变量名称
汇编程序:将汇编指令翻译为机器指令
反汇编程序:机器指令翻译为汇编指令
机器级语言:机器语言和汇编语言
机器级程序:用机器指令表示的机器语言程序和由汇编指令表示的汇编语言程序
机器语言级虚拟机:将物理上的计算机硬件抽象成一个逻辑上的虚拟计算机。
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对无符号数运算没有意义,CF对有符号数运算没有意义。
控制标志由软件设定,用于中断响应、串操作、单步控制:
立即寻址:指令中直接给出操作数
寄存器寻址:指令中给出操作数所存放的寄存器的编号
其他寻址方式下的操作数都在存储单元中,称为存储器操作数
比例变址:变址值等于变址寄存器内容乘以比例系数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]