地址线
数据线
控制线
mov 传送指令
mov 寄存器,数据
mov 寄存器,寄存器
mov 寄存器,内存单元
mov 内存单元,寄存器
mov 段寄存器,寄存器
add 同mov
sub 同mov
push(入栈) 寄存器 段寄存器 内存单元
pull(出栈)
inc 加一
des 减一
and
or
字段元
物理地址 = 段地址 * 16 + 偏移地址
通用寄存器 16 H L byte word mov ax,1 mov ah,1 add ax,8 mov ax,bx
AX 累加器
BX 基址寄存器 循环[bx] 存放地址偏移量 inc bx [BX+100] 100[BX] [BX].100 [bx+di/si+idata] 默认段地址DS
CX 计数寄存器 loop循环(cs)=(cs)-1 判断cs的值,不为零则跳到标号处,为零继续向下执行 mov cs,10 s: add ax,1 loop s
DX 数据寄存器 备用
和BX相近的寄存器 但是不能够分成2个8位寄存器
SI 源变址寄存器
DI 目的变址寄存器
SP 堆栈指示器 偏移地址 SS
BP 基址指示器 段地址默认在SS
IP 指令指示器 指令指针偏移地址 CS
段寄存器 段前缀 64K
CS 代码段寄存器 CS:IP 不能用mov 应该用转移指令 jmp jmp 段地址(CS):偏移地址(IP) jmp 3,0B16 CS=0003H IP=0B16H 00B46H jmp 某一个合法寄存器 用寄存器的只修IP jmp ax, L类似于(jmp IP,ax)
DS 数据段寄存器 存放要访问数据的段地址 DS和[ADDRESS](偏移地址) mov bx,1000H mov ds,bx 1, mov ax,[0]--将1000H:0H的数据读入到ax 2, mov [0],ax --将ax的数据读入到1000H:0H
SS 堆栈寄存器 SS:SP指向栈顶元素 push ax SP=SP-2 SS:SP指向新栈顶元素 将ax的数据读入新的栈顶内存 pop ax 将SS:SP内存处的数据存入ax,SP=SP+2 SS:SP指向新的栈顶
ES 附加段寄存器 备用
PSW
汇编指令
伪指令 段名 segment(定义一个段)
段名 endS
assume(假设) cs:codesg(标号) 将代码段和CPU的cs联系起来
codesg segment
// 数据
dw 0001H,0002H,0003H
db 'unix' // 字符形式 转换为ascii码
start: mov ax,0123H // 代码
mov bx,0456H
add ax,bx
add ax,ax
mov ax,'a' // =mov ax,61H
mov ax,4c00H (程序返回)
INT 21H
codesg ends
end start (汇编程序结束标志) 也可以知道入口是start
[bx] 和 loop
内存单元:(1)内存单元地址;(2)内存单元的长度(类型)
[bx] 也表示内存单元 偏移地址在bx
loop 循环
()描述性符号 (al)表示al中的值 (寄存器)(段寄存器)(内存单元的物理地址20位)
idata 表示常量 [idata] 表示[1][2][3]
aaaaH 写发错误 不能以字母开头 前面加0 0aaaaH
dw 0001H,0002H,0003H
dw = define word
数据处理的两个基本问题?
处理的数据在什么地方 CPU内部,内存,端口
处理的数据有多长 mov al,1 mov ax,1 或 无寄存器名字用 X(byte,word) ptr mov word ptr [bx],2 inc byte ptr [bx]
reg 表示寄存器 ax,bx,cx,dx,ah,al,bh,bl,ch,cl,dh,dl,si,di,sp,bp
sreg 表示段寄存器 cs,ds,es,ss
bx,di,si,bp 可以用在[...]
[idata],直接寻址
[bx],[di],[si],[bp],寄存器间接寻址
[bx+idata],[di+idata],[si+idata],[bp+idata],寄存器相对寻址 结构体,数组,二位数组
[bx+di],[bx+si],[bp+di],[bp+si],基址变址寻址 二位数组
[bx+di+idata],[bx+si+idata],[bp+di+idata],[bp+si+idata],相对基址变址寻址 表格(结构)数组项,二位数组
读取,写入,计算
立即数idata,寄存器,段地址(SA)和偏移地址(EA)
转移指令
可以修改IP 段内转移 jmp ax 短转移-128~127 近转移-32768~32767
或同时修改CS:IP 段间转移 jmp 1000:0
无条件转移 JMP
条件转移 短转移 jcxz if((cx) == 0) jcxz 标号
循环 短转移(loop) if((cx) != 0) loop 标号
过程
中断
offset 取得标号的偏移地址
jmp 转移的目的地址 转移的距离
转移指令
call 1:将当前IP 或 CS和IP 压入栈中 2:转移
CALL 标号 1:(SP)=(SP)-2; ((SS)*16+(SP)) = (IP) 2:(IP)=(IP)+16位位移 16位位移 = "标号"处的地址 call指令后的第一个字节的地址 范围-32768~32767
push ip jmp near ptr 标号
call far ptr 标号 1:(SP)=(SP)-2; ((SS)*16+(SP)) = (CS) (SP)=(SP)-2; ((SS)*16+(SP)) = (IP) (CS)标号所在段的段地址 (IP)标号在段的偏移地址
push cs push ip jmp far ptr 标号
call 16位寄存器 (SP)=(SP)-2; ((SS)*16+(SP)) = (IP) (IP)=(16位寄存器)
push ip jmp 16位寄存器
call word ptr 内存单元地址
push ip jmp word ptr 内存单元地址
call dword ptr 内存单元地址
push cs push ip jmp word ptr 内存单元地址
ret 用栈中的数据修改IP 实现近转移 (IP) = ((SS)*16+(SP)) (SP)=(SP)+2; POP IP
retf 用栈中的数据修改CS和IP 实现远转移 (IP) = ((SS)*16+(SP)) (SP)=(SP)+2
(CS) = ((SS)*16+(SP)) (SP)=(SP)+2; POP IP POP CS
使用call 和ret 设计子程序
mul指令(乘法) 8位或16位 8位一个默认放在AH,另一个放在8位寄存器或内存字节单元 结果放在AX
16位一个默认放在AX,另一个放在16位寄存器或内存字单元 结果高位放在DX ,地位放在AX
MUL REG
MUL 内存单元
div 除法
标志寄存器
1:用来存储相关指令的某些执行结果
2:用来为CPU执行某些指令提供相关依据
3:用来控制CPU的相关工作方式
存储的信息通常被称为程序状态字(PSW)
前面以学习13个 用来存放数据 都是按整个寄存器具有一个含义
标志寄存器(flag)是按'位'其作用 每一位有专门的作用
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
OF DF IF TF SF ZF AF PF CF
1 3 5 12 13 14 15 8086cpu没有使用
CF 0 进位标志 无符号运算 最高有效为向跟高位进位值 或从更高的位借位值
PF 2 奇偶标志 相关指令结束后结果的二进制数中的1个个数是否为偶数 偶数PF=1 奇数PF=0
ZF 6 零位标志 相关指令结束后结果是否为零 结果为零 则 ZF=1 否则ZF=0 1表示真
SF 7 符号标志 结果是否为负数 负数SF=1 非负数SF=0
OF 11 有符号溢出
DF 10 方向标志位 在串指令中每次操作si,di 增减 DF=0(cld指令) 递增 DF=1(std指令) 递减 movsb movsw rep
pushf 将标志寄存器值压入栈
popf
adc指令 带进位加法指令 利用CF进位的值
adc 操作对象1,操作对象2
操作对象1 = 操作对象1+操作对象2+CF
SSB
SSB 操作对象1,操作对象2
操作对象1 = 操作对象1-操作对象2-CF
CMP 比较指令 相当于减法指令,不保存结果 执行后对标志寄存器产生影响
CMP 操作对象1,操作对象2
操作对象1-操作对象2 仅仅影响标志寄存器产生
内中断
数据线
控制线
mov 传送指令
mov 寄存器,数据
mov 寄存器,寄存器
mov 寄存器,内存单元
mov 内存单元,寄存器
mov 段寄存器,寄存器
add 同mov
sub 同mov
push(入栈) 寄存器 段寄存器 内存单元
pull(出栈)
inc 加一
des 减一
and
or
字段元
物理地址 = 段地址 * 16 + 偏移地址
通用寄存器 16 H L byte word mov ax,1 mov ah,1 add ax,8 mov ax,bx
AX 累加器
BX 基址寄存器 循环[bx] 存放地址偏移量 inc bx [BX+100] 100[BX] [BX].100 [bx+di/si+idata] 默认段地址DS
CX 计数寄存器 loop循环(cs)=(cs)-1 判断cs的值,不为零则跳到标号处,为零继续向下执行 mov cs,10 s: add ax,1 loop s
DX 数据寄存器 备用
和BX相近的寄存器 但是不能够分成2个8位寄存器
SI 源变址寄存器
DI 目的变址寄存器
SP 堆栈指示器 偏移地址 SS
BP 基址指示器 段地址默认在SS
IP 指令指示器 指令指针偏移地址 CS
段寄存器 段前缀 64K
CS 代码段寄存器 CS:IP 不能用mov 应该用转移指令 jmp jmp 段地址(CS):偏移地址(IP) jmp 3,0B16 CS=0003H IP=0B16H 00B46H jmp 某一个合法寄存器 用寄存器的只修IP jmp ax, L类似于(jmp IP,ax)
DS 数据段寄存器 存放要访问数据的段地址 DS和[ADDRESS](偏移地址) mov bx,1000H mov ds,bx 1, mov ax,[0]--将1000H:0H的数据读入到ax 2, mov [0],ax --将ax的数据读入到1000H:0H
SS 堆栈寄存器 SS:SP指向栈顶元素 push ax SP=SP-2 SS:SP指向新栈顶元素 将ax的数据读入新的栈顶内存 pop ax 将SS:SP内存处的数据存入ax,SP=SP+2 SS:SP指向新的栈顶
ES 附加段寄存器 备用
PSW
汇编指令
伪指令 段名 segment(定义一个段)
段名 endS
assume(假设) cs:codesg(标号) 将代码段和CPU的cs联系起来
codesg segment
// 数据
dw 0001H,0002H,0003H
db 'unix' // 字符形式 转换为ascii码
start: mov ax,0123H // 代码
mov bx,0456H
add ax,bx
add ax,ax
mov ax,'a' // =mov ax,61H
mov ax,4c00H (程序返回)
INT 21H
codesg ends
end start (汇编程序结束标志) 也可以知道入口是start
[bx] 和 loop
内存单元:(1)内存单元地址;(2)内存单元的长度(类型)
[bx] 也表示内存单元 偏移地址在bx
loop 循环
()描述性符号 (al)表示al中的值 (寄存器)(段寄存器)(内存单元的物理地址20位)
idata 表示常量 [idata] 表示[1][2][3]
aaaaH 写发错误 不能以字母开头 前面加0 0aaaaH
dw 0001H,0002H,0003H
dw = define word
数据处理的两个基本问题?
处理的数据在什么地方 CPU内部,内存,端口
处理的数据有多长 mov al,1 mov ax,1 或 无寄存器名字用 X(byte,word) ptr mov word ptr [bx],2 inc byte ptr [bx]
reg 表示寄存器 ax,bx,cx,dx,ah,al,bh,bl,ch,cl,dh,dl,si,di,sp,bp
sreg 表示段寄存器 cs,ds,es,ss
bx,di,si,bp 可以用在[...]
[idata],直接寻址
[bx],[di],[si],[bp],寄存器间接寻址
[bx+idata],[di+idata],[si+idata],[bp+idata],寄存器相对寻址 结构体,数组,二位数组
[bx+di],[bx+si],[bp+di],[bp+si],基址变址寻址 二位数组
[bx+di+idata],[bx+si+idata],[bp+di+idata],[bp+si+idata],相对基址变址寻址 表格(结构)数组项,二位数组
读取,写入,计算
立即数idata,寄存器,段地址(SA)和偏移地址(EA)
转移指令
可以修改IP 段内转移 jmp ax 短转移-128~127 近转移-32768~32767
或同时修改CS:IP 段间转移 jmp 1000:0
无条件转移 JMP
条件转移 短转移 jcxz if((cx) == 0) jcxz 标号
循环 短转移(loop) if((cx) != 0) loop 标号
过程
中断
offset 取得标号的偏移地址
jmp 转移的目的地址 转移的距离
转移指令
call 1:将当前IP 或 CS和IP 压入栈中 2:转移
CALL 标号 1:(SP)=(SP)-2; ((SS)*16+(SP)) = (IP) 2:(IP)=(IP)+16位位移 16位位移 = "标号"处的地址 call指令后的第一个字节的地址 范围-32768~32767
push ip jmp near ptr 标号
call far ptr 标号 1:(SP)=(SP)-2; ((SS)*16+(SP)) = (CS) (SP)=(SP)-2; ((SS)*16+(SP)) = (IP) (CS)标号所在段的段地址 (IP)标号在段的偏移地址
push cs push ip jmp far ptr 标号
call 16位寄存器 (SP)=(SP)-2; ((SS)*16+(SP)) = (IP) (IP)=(16位寄存器)
push ip jmp 16位寄存器
call word ptr 内存单元地址
push ip jmp word ptr 内存单元地址
call dword ptr 内存单元地址
push cs push ip jmp word ptr 内存单元地址
ret 用栈中的数据修改IP 实现近转移 (IP) = ((SS)*16+(SP)) (SP)=(SP)+2; POP IP
retf 用栈中的数据修改CS和IP 实现远转移 (IP) = ((SS)*16+(SP)) (SP)=(SP)+2
(CS) = ((SS)*16+(SP)) (SP)=(SP)+2; POP IP POP CS
使用call 和ret 设计子程序
mul指令(乘法) 8位或16位 8位一个默认放在AH,另一个放在8位寄存器或内存字节单元 结果放在AX
16位一个默认放在AX,另一个放在16位寄存器或内存字单元 结果高位放在DX ,地位放在AX
MUL REG
MUL 内存单元
div 除法
标志寄存器
1:用来存储相关指令的某些执行结果
2:用来为CPU执行某些指令提供相关依据
3:用来控制CPU的相关工作方式
存储的信息通常被称为程序状态字(PSW)
前面以学习13个 用来存放数据 都是按整个寄存器具有一个含义
标志寄存器(flag)是按'位'其作用 每一位有专门的作用
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
OF DF IF TF SF ZF AF PF CF
1 3 5 12 13 14 15 8086cpu没有使用
CF 0 进位标志 无符号运算 最高有效为向跟高位进位值 或从更高的位借位值
PF 2 奇偶标志 相关指令结束后结果的二进制数中的1个个数是否为偶数 偶数PF=1 奇数PF=0
ZF 6 零位标志 相关指令结束后结果是否为零 结果为零 则 ZF=1 否则ZF=0 1表示真
SF 7 符号标志 结果是否为负数 负数SF=1 非负数SF=0
OF 11 有符号溢出
DF 10 方向标志位 在串指令中每次操作si,di 增减 DF=0(cld指令) 递增 DF=1(std指令) 递减 movsb movsw rep
pushf 将标志寄存器值压入栈
popf
adc指令 带进位加法指令 利用CF进位的值
adc 操作对象1,操作对象2
操作对象1 = 操作对象1+操作对象2+CF
SSB
SSB 操作对象1,操作对象2
操作对象1 = 操作对象1-操作对象2-CF
CMP 比较指令 相当于减法指令,不保存结果 执行后对标志寄存器产生影响
CMP 操作对象1,操作对象2
操作对象1-操作对象2 仅仅影响标志寄存器产生
内中断