8086CPU有14个寄存器:AX,BX,CX,DX,SI,DI,SP,BP,IP,CS,SS,DS,ES,PSW
AX,BX,CX,DX
存放一般性的数据,可以分为高8位和第8位
物理地址=段地址×16+偏移地址
CS,DS,SS,ES
CS和IP是是两个最关键的寄存器
CS:代码段寄存器 IP:指令指针寄存器
读取一条指令后,IP值会自动增加
jmp 段地址:偏移地址
例如 jmp 2AE3:3 执行后CS = 2AE3H ,IP = 0003H
8086CPU中有一个DS寄存器,通常用来存放要访问数据的段地址,8086不支持将数据直接送入段寄存器的操作
8086CPU中,有两个寄存器,段寄存器SS和寄存器SP,栈顶的段地址存放在SS中,偏移地址存放在SP中。**任意时刻,SS:SP指向栈顶元素。**push指令和pop指令执行时,CPU从SS和SP中得到栈顶的地址
mov ax,[bx] 功能:bx中存放的数据作为一个偏移地址EA,段地址SA默认在ds中,将SA:EA处的数据送入ax中
格式是:loop 标号,CPU执行loop指令的时候,要进行两步操作,①(cx)= (cx)-1 ②判断cx中的值,不为零则转至标号处执行程序,如果为零则向下执行
用于显式地指明内存单元的段地址的“ds:”,“cs:”等,称为段前缀
例如:mov ax,ds:[bx]
DATAS SEGMENT
;此处输入数据段代码
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
;此处输入代码段代码
MOV AH,4CH
INT 21H
CODES ENDS
END START
dw 0,1,2,3,4,5,6,7,8,
dw即“define word”含义是定义字型数据,一个字型数据占两个字节
(1)and指令:逻辑与指令,按位进行与运算。可以将操作对象的相应位设为0,其他位不变。
例如:将al的第六位设为0 and al,10111111B
(2)or指令:逻辑或指令,按位进行或运算。可以将操作对象的相应位设为1,其他位不变。
例如:将al的第六位设为0 or al,01000000B
小写字母的ASCII码值比大写字母大20H。
简便方法:一个字母,不管它原来是大写还是小写,将它的二进制码第5位置置0,它就变成大写字母;第5位置置1,就变成小写字母
我们在前面用[bx]的方式来指明一个内存单元,现在可以用[bx+idata]更灵活的表示
例如:mov ax,[bx+200]
si和di是8086CPU中和bx功能相近的寄存器,si和di不能分成两个8位寄存器来使用
比 [bx+idata]更加灵活
①在8086CPU中,真有这4个寄存器可以用在[…]中来进行内存单元的寻址
②在[…]中,这4个寄存器可以单个出现,或只能以4中组合出现:bx和si,bx和di,bp和si,bp和di
③在[…]中使用bp,而在指令中没有显式地给出段地址,那么段地址默认就在ss中
①立即数:对于直接包含在机器指令中的数据(执行前在CPU的指令缓冲器中)
②寄存器:指令要处理的数据在寄存器中
③段地址(SA)和偏移地址(EA):指令要处理的数据在内存中 ,用[X]的格式给出
8086CPU可以处理两种尺寸的数据,byte和word,在指令中要指明是字操作还是字节操作
①通过寄存器的名字来指明
字操作:mov ax,1000
字节操作:mov al,1000
②在没有寄存器名的情况下,用操作符X ptr指明内存单元的长度,X是byte或word
inc word ptr 【bx】
inc byte ptr 【bx】
①除数:有8位和16位两种,在一个reg或内存单元中
②被除数:默认放在AX或DX和AX中,如果除数为8位,被除数则为16位,默认在AX中存放;如果除数为16位,被除数则为32位,在AX和DX中存放,DX存放高16位,AX存放低16位
③结果:如果除数为8位,则AL存储除法操作的商,AH存储除法操作的余数;如果除数为16位,则AX存储除法操作的商,DX存储除法操作的余数
前面用db和dw定义字节型数据和字型数据。dd用来定义dword(double word,双字)型数据
是一个操作符 ,和dd,dw,db一样。dup用来进行数据的重复
例如:db 3 dup(0),定义了3个字节,都为0
db 3 dup(0,1,2),定义了9个字节0,1,2,0,1,2,0,1,2
可以修改IP,或同时修改CS和IP的指令系统统称为转移指令。概括地讲,转移指令就是可以控制CCPU执行内存中某处代码的指令。
只修改IP,称为段内转移
同时修改IP和CS,称为段间转移
根据对IP的修改范围不同,段内转移又分为:短转移和近转移
总体上可以分为以下几类:
功能:取得标号的偏移地址
CODES SEGMENT
ASSUME CS:CODES
START:
mov ax,offset start ;相当于mov ax,0
S:
mov ax,offset s ;相当于mov ax,3
CODES ENDS
END START
段内短转移:jmp short 标号(转到标号处执行指令)
段内近转移:jmp near 标号
实际上,CPU在执行jmp指令的时候并不需要转移的目的地址。它包含的是转移的位移。这个位移是编译器根据汇编指令中的“标号”计算出来的。
jmp far ptr 标号 实现的是段间转移,有称为远转移
功能如下: (CS)=标号所在段的段地址 (IP)=标号所在段的偏移地址
指令格式:jmp 16位 reg
功能:(IP)=(16位reg)
jcxz指令为有条件指令,所有的有条件转移指令都是短转移。
指令格式:jcxz 标号(如果(CX)=0,转移到标号处执行)
操作:当(CX)=0是,(IP)=(IP)+8位位移
8位位移=标号处的地址-jcxz指令后的第一个字节的地址
8位位移的范围为:-128~127,用补码表示
8位位移由编译程序在编译时算出
当(CX)≠0时,什么也不做(程序向下执行)
ret指令用栈中的数据,修改IP的内容,从而实现近转移;(相当于pop IP)
retf指令用栈中的数据,修改CS和IP的内容,从而实现远转移。(相当于pop IP pop CS)