计算机指令考前小记

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生成的很多汇编指令助记符结尾有lw等长度后缀。l表示操作数为双字32位,w表示操作数为单字16位。 在IA-32中,大多数操作数都是32位,所以通常省略后缀l。 AT&T:

  • b表示操作数长度为字节8位,w表示字16位,l表示双字32位,q表示四字64位。
  • 寄存器操作格式:%+寄存器名
  • 存储器操作数形式:偏移量(基址寄存器,变址寄存器,比例因子)

GCC生成的汇编代码中的指令助记符大部分都有长度后缀。 微软MASM工具生成的Intel汇编格式不用长度后缀,而是通过寄存器名称和长度指示符PTR区分。

寄存器组织

IA-32指令中操作数有三类:立即数、寄存器操作数、存储器操作数。

image.png

ESP是栈指针寄存器 EBP是基址指针寄存器 EFLAGS标志寄存器:记录机器的状态和控制信息 条件标志存放运行的状态信息,由硬件自动设定,也被称条件码:

  • OF:溢出标志
  • SF:符号标志
  • ZF:零标志
  • CF:进/借位标志

OF和SF对无符号数运算没有意义,CF对有符号数运算没有意义。 控制标志由软件设定,用于中断响应、串操作、单步控制:

  • DF:方向标志
  • IF:中断允许标志
  • TF:陷阱标志

寻址方式

立即寻址:指令中直接给出操作数 寄存器寻址:指令中给出操作数所存放的寄存器的编号 其他寻址方式下的操作数都在存储单元中,称为存储器操作数

image.png

比例变址:变址值等于变址寄存器内容乘以比例系数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),%edxR[edx] <- M[R[ebp]+8]

leal:加载有效地址

  • leal (%edx,%eax),%eaxR[eax] <- R[edx]+R[eax]