汇编语言学习笔记
预备知识
Intel 机器
微型计算机的构成
80X86 微处理器的基本结构
数据寄存器组
段寄存器组
80X86 的三种工作方式
- 实地址模式
- 保护模式
- 虚拟 8086 方式(V86方式)
数据在计算机内的表示形式
有符号数、无符号数、浮点数等相关知识见 CSAPP
BCD 码
使用二进制数表示十进制数,即使用 4 位二进制数表示一位 10 进制数。
在 8086 中有两种存放 BCD 码的方式,压缩和非压缩。
标志寄存器
主要需要掌握 SF ZF OF CF AF PF
寻址方式
寄存器寻址
使用格式:R
inc bx
操作数地址为寄存器 BX 。
寄存器间接寻址
使用格式:[R]
寄存器 R 的内容为操作数的偏移地址。
可以指明操作数所在的段,如ss:[R]
。如果没有指定段,当 R 选用 BP, EBP, ESP ,则默认在堆栈段中,如果选用其他寄存器则默认在 DS 所指示的段中。
mov ax, [si]
将数据段上偏移[si]
的数据传送到 AX 中。
变址寻址
使用格式:[R * F + V]
, [R * F] + V
, V[R * F]
功能:寄存器 R 的内容乘以指定的比例因子 F (可以为 1, 2, 4, 8)后加上给定的位移量 V 作为操作数的偏移地址。
当 R 为 16 为寄存器或 ESP 时,F 只能为 1 并省略不写。
mov al, [ebx * 2] + 5
由于使用的变址寄存器是 EBX ,故默认段寄存器 DS 。
基址加变址寻址
使用格式:[BR + IR * F + V]
, V[BR][IR * F]
, V[BR + IR * F]
功能:将变址寄存器 IR 的内容乘以比例因子 F ,与基址寄存器 BR 的内容和位移量 V 相加,作为操作数的偏移地址 EA 。
mov ax, 8[bx][si]
立即寻址
使用格式:n
功能:指定指令最后一部分单元中的内容为操作数,即在当前执行到的机器代码部分找到操作数。
mov word ptr [si], 12h
WORD PTR 说明操作数的类型为字。
直接寻址
使用格式:段寄存器名: [n]
, 变量
, 变量 + 常量
一些问题
有一些指令显式地指定操作数,另一些隐含地指定操作数。如CBW
将 AL 寄存器中的符号位扩展到 AH 中,又如push bufa
压入栈顶,隐含了目的操作数,是使用 SP/ESP 的寄存器间接寻址方式。
双操作数指令的源操作数和目的操作数的寻址方式必须满足以下五种组合之一:
- 寄存器对寄存器;
- 寄存器对存储器;
- 存储器对寄存器;
- 立即方式对寄存器,立即方式只能用于源操作数;
- 立即方式对存储器,立即方式只能用于源操作数;
源操作数和目的操作数不能同时用存储器方式表示。
不含变量的存储器方式所表示的操作数类型是不明确的,立即数是没有类型的。如果指令语句中没有一个操作数的类型是明确的,则必须使用属性定义算符 PTR(字节类型 BYTE PTR ,字类型 WORD PTR ,双字类型 DWORD PTR)
下面几种情况使用的缺省段不受段超越前缀影响:
- 取指令(包括立即数)时只能使用 CS 段;
- 压栈时目的地址和出栈时源地址只能使用 SS 段;
- 串操作指令中的目的串只使用 ES 段;