1、寄存器
IP寄存器初始值为0xFFFF,其他寄存器初始值都是0
2、内存
1M内存、BIOS、显存、引导扇区加载内容等,按比例显示如下图
2M内存 = 2097152 ~= 200万个内存单元
2、指令
操作码 操作数 , ... , 操作数
近代,多数处理器使用两个操作数的指令(二地址指令):
操作码 目的操作数 , 源操作数
div
1、16位二进制 / 8位二进制 , 被除数必须在AX中,运算后的商放在AL,余数放在AH
2、32位二进制 / 16位二进制 ,被除数的高16位放在DX ,低16位放AX中,运算后的商放在AX,余数放在DX
sub
格式:sub opd,ops
功能:(opd)-(ops) -> opd
cmp
功能上与sub相同,不同的是cmp仅仅根据计算结果设置相应的标志位,不保留计算结果。
in
从dx指定的端口号,读入数据放入al或ax中。
in指令的目的操作数必须是寄存器al 或者 ax,源操作数必须是寄存器dx(存放端口号)。
in指令不允许使用别的通用寄存器作为操作数,也不允许使用内存单元作为操作数。
in al ,dx
或 in ax,dx
立即数指定端口
in al ,0xf0
或 in ax,0x03
in指令不影响任何标志位
out
与in指令相反,从al或ax中读入数据,输出到dx指定的端口号
out dx,al
或 out dx,ax
立即数指定端口
out 0xf0,al
或 out 0x03,ax
out指令不影响任何标志位
3、寻址方式
7种寻址方式:1、立即数寻址;2、
NO. | 寻址方式 | 例 |
---|---|---|
1 | 立即 | 操作数是个立即数 mov al , 5 mov ax , 0x3064 |
2 | 寄存器 | 操作数在 “通用寄存器” 中 mov ax , bx |
3 | 直接 | 直接指定操作数的偏移地址(有效地址EA) mov ax , [0x2000] mov ax , label_1 或者 mov ax , [label_1] 使用跨越前缀 mov ax , [es:label_1] |
4 | ⭐️寄存器直接 | 寄存器中直接指定操作数的偏移地址 - 操作数的偏移地址在 “基址寄存器” BX、BP或 “变址寄存器” SI、DI 中, BX、SI、DI 使用DS作为段寄存器 , BP使用SS作为段寄存器 mov ax , [bx] ;物理地址 = 16*(DS)+(BX) mov ax , [si] ;物理地址 = 16*(DS)+(SI) mov ax , [di] ;物理地址 = 16*(DS)+(DI) mov ax , [bp] ;物理地址 = 16*(SS)+(BP) 使用超越前缀 mov ax , [cs:bx] 或 mov ax , [es:bx] 或 mov ax , [ss:bx] |
5 | 寄存器相对 | 寄存器直接基础上,附加立即数偏移量 mov ax , [bx+1] |
6 | 基址变址 | 操作数的偏移地址是一个基址寄存器(BX,BP)和一个变址寄存器(SI、DI)的内容和 mov ax , [bx+si] mov ax , [bx+di] mov ax , [cs:bx+si] mov ax , [cs:bx+di] |
7 | 相对基址变址 |
除了1、2,其他寻址方式的操作数都在除代码段以外的存储区中
立即数、寄存器、直接、寄存器直接、寄存器相对、基址变址、相对基址变址