小知识点
-
2的10次是1k
-
地址总线是20位时, 内存最大1m 原因: 2的20次方 1024k=1M
-
变量就是存储单元 指向首地址
段寄存器 偏移地址
段寄存器 | 通用寄存器 |
---|---|
CS | IP |
SS | SP或BP |
DS | BX、SI、DI或一个16位数 |
ES | DI(用于串指令) |
-
CS 代码段 IP # CS只能做源操作数,不能做目的操作数 MOV CS, AX; 错误
-
DS 数据段 BX、SI、DI或一个16位数
-
SS 堆栈段 SP或BP
-
ES 附加段
段基值(16位) 左移4位(即末尾加上4位二进制0) = 段基址
EA(有效地址) = 基地址 + (变址值 X 比例因子) + 位移量
物理地址 = EA + 段基址
其他
- 一台计算机所能执行的全部指令,称为该机的指令系统或指令集,具体内容包括
指令格式
、寻址方式
、指令类型
指令系统层是硬件和软件之间的接口,硬件的任务是执行指令,程序则体现为指令序列
- 8086CPU是16位微处理器,CPU的内外数据总线为16位,一个总线周期可以传送一个字(16位)数据,地址总线为20位,可寻址1MB主存空间
串行 顺序 必须在一条指令执行完后,才能从主存中读取下一条指令
8086/8088CPU的主存容量为1MB,其主存单元地址为20位,而CPU内部的寄存器和数据通路是16位,如何将16位地址码扩展到20位?
解决办法:将1MB主存空间划分为若干段,每个段的最大长度为64KB。相应的在BIU中设置寄存器,用以存放20位起始地址的高16位,称为段基值,由EU或指令指针IP提供段内的偏移地址(又称偏移量):一个主存单元与所在段的段基址之间的字节距离
地址总线20位 00000H-FFFFFH ,字节存储,字存储,双字存储
有效地址:通常有CPU按指令的寻址方式计算得到或由指令指针IP提供
逻辑运算指令
DEST;目的操作数 SRC:源操作数
- AND逻辑与指令
- 指令格式: AND DEST,SRC
- 有0为0,或有1为1
- OR 逻辑或指令
- 指令格式:OR DEST,SRC
- 一个为1结果就为1
- XOR 逻辑异或指令
- 指令格式:XOR DEST,SRC
- 相同则为0,不相同则为1
- NOT逻辑非指令
- 指令格式: NOT DEST
- 取反
注意:上述操作中除了NOT以外,都会置CF、OF为 0
算数运算类指令
-
ADD加法
- 指令格式:ADD DEST,SRC
- 两个数相加,结果存入DEST中
-
MOV 传送指令
- 指令格式:MOV DEST, SRC
- 把SRC中的操作数复制给DEST
-
XCHG 交换指令
- 指令格式:MOV DEST, SRC
- 将源操作数和目的操作数的内容相互交换
-
减法运算指令
-
SUB指令
- 指令格式:SUB DEST, SRC
- 完成从目的操作数中减少去源操作数 ,即:SEST = (SEST) -(SRC)
-
DEC指令
- 指令格式:DEC DEST
- 作用:自减一,DEST = (DEST) - 1
-
CMP指令
- 指令格式:CMP DEST, SRC
- 两个操作数做差,不保留结果,只保留其中改变的标志位:OF,SF,ZF,AF,PF等
-
位移指令
- SHL 逻辑左移
- SHR 逻辑右移
- SAL 算数左移
- SAR 算数右移
- ROL 循环左移
- ROR 循环右移
- RCL 带进位循环左移
- RCR 带进位循环右移
指令格式:
RCL DEST, COUNT
汇编计算程序案例
数据段定义格式:
DATA SEGMENT ;数据段
DATA ENDS
堆栈段定义格式:
STACK1 SEGMENT PARA STACK ;堆栈段
DW 20H DUP (0)
STACK1 ENDS
CODE SEGMENT ;代码段
ASSUME CS: CODE , DS:DATA,ES:EXTERA;假设各个段存储位置
START: MOV AX, DATA ;置段基指于DS
MOV DS,AX
指令序列
MOV AH,4CH ;调用4CH功能,4CH功能号
INT 21H ;终止程序
CODE ENDS
END START
汇编语言语句格式(案例):
计算:
F
=
(
10
∗
(
X
+
Y
)
−
3
∗
(
Z
−
1
)
)
/
2
F = (10 * (X + Y)-3 * (Z-1))/2
F=(10∗(X+Y)−3∗(Z−1))/2
结果存储在FUN中
DATA SEGMENT;设置数据段
VARX DW 123H;定义变量x
VARY DW 456H;Y
VARZ DW 789H;Z
FUN DW ?
设置堆栈
DATA ENDS
STACK1 SEGMENT PARA STACK;
DW 20H DUP(0)
STACK1 ENDS
CODE SEGMENT;设置代码段
ASSUME CS: CODE, DS: DATA, SS: STACK1 ;假设各个段存储位置
STAET: MOV AX, DATA ;置段基指于DS
MOV DS,AX
MOV AX,VARX ;取变量并且复制到AX中
ADD AX,VARY ;AX = (X+Y)
MOV BX,AX ;BX = AX = (X+Y)
SAL AX,1 ;AX = 2 * (X+Y) 算数左移,相当于 X2
SAL AX,1 ;AX = 4 * (X+Y)
ADD AX,BX ;AX = 5 * (X+Y)
SAL AX,1 ;AX = 10 * (X+Y)
MOV BX,VARZ ;取变量Z
DEC BX ;BX = BX-1 = Z-1
MOV CX,BX ;CX = BX = Z-1
SAL BX,1 ;CX = 2 * (Z-1)
ADD BX,CX ;BX = 3 * (Z-1)
SUB AX,BX ;AX = 10 * (X+Y) - 2 * (Z-1)
SAR AX,1 ;ax = {10 * (X+Y) - 2 * (Z-1)}/2 算数右移,相当于 /2
MOV FUN,AX ;存放结果
MOV AH,4CH ;调用4CH功能,4CH功能号
INT 21H ;终止程序
ODE ENDS
END START