1.8086CPU 的所有寄存器都是16位的,可以存放两个字节。
20位地址总线,1MB寻址能力
通用寄存器:AX(AH和AL)、BX(BH和BL)、CX(CH和CL)、DX(DH和DL)
段寄存器:CS、DS、SS、ES
SI、DI与bx功能相似
2.byte:字节,8bit
word:字,2个字节
3.16位结构/16位机/字长16位 = 寄存器16位
物理地址 = 段地址*16 + 偏移地址
4.CS:代码段寄存器
IP:指令指针寄存器
在任意时刻,CS:IP 指向下一条指令的地址;
修改CS:IP的内容:“JMP 段地址:偏移地址”,仅修改IP时使用JMP AX(AX存放修改后的地址);
DS通常用来存放要访问数据的段地址,指令执行时,8086CPU自动取DS中的数据作为内存单元的段地址
5.在任意时刻,SS:SP 指向栈顶元素;栈顶放在低地址
8086CPU对push和pop的操作都是以字为单位
POP只移动栈顶指针,不清楚数据,当有新数据入栈将覆盖原数据
6.程序返回
mov ax,4c00H
int 21H
7.[bx]表示一个内存单元,段地址在ds中,偏移地址在bx中
例:mov ax,[bx]
8.8086CPU中只有bx、si、di、bp可以用在[...]中来进行内存单元的寻址,只要[...]使用寄存器bp,
而指令中没有显性的给出段地址,段地址就默认在ss中
9.汇编中数据位置的表述
(1)立即数
(2)寄存器
(3)段地址+偏移地址
10.指令要处理的数据长度
(1)使用的寄存器
(2)在没有寄存器名的情况下,用操作符X ptr (word ptr、byte ptr)指明内存单元的长度
(3)栈操作数据为字类型
PS:
1.对段寄存器的操作要通过通用寄存器来间接操作,例:修改段寄存器DS
MOV BX,1000H
MOV DS,BX
MOV AL,[0]
[0]表示一个内存单元,此处表示1000:0处的地址
2.汇编代码
assume cs:code,ds:data,ss:stack
//data为数据段、stack为栈段、code为代码段
data segment
db //定义字节 地址+1
dw 0123h,0456h //定义字类型 地址+2
dd //定义双字 地址+4
data ends
stack segment
dw 0,0
stack ends
code segment
start:mov ax,stack //栈段名就是段地址
mov ss,ax
mov ax,data //数据段名就是数据段的段地址
mov ds,ax
code ends
end start
解析:
(1).assume 伪指令,含义"假设"。它假设某一段寄存器和程序中的某一个用segment。。。ends定义的段相关联
assume将有特定用途的段和相关的段寄存器关联起来
(2)segment和ends成对使用的伪指令,
功能:定义一个段
使用格式
段名 segment
..
..
段名 ends
段名在程序编译链接后作为段地址
(3)dw = "define word",含义定义字型数据
此处段地址为cs,dw定义位于代码段开始部分,所以偏移地址为0,定义的数据物理地址为CS:0、CS:2
3.寻址方式(定位内存地址的方法)
[0]、
[bx]、
[bx(si、di)+idata]、
[bx+si]和[bx+di]
[bp+si]\[bp+di]
4.大小写字母转换
大写字母的第五位为0,小写字母的第五位为1
将大写字母的ASCII与1101 1111B进行与操作可转换为小写字母,原理ASCII-20H
汇编指令:mov,add,SUB,PUSH,POP,LOOP,and(逻辑与),or(逻辑或),inc
1.loop会进行两步操作:
(1)cx = cx -1;
(2)cx中的值不为0则继续执行loop
功能:使用loop实现循环,cx存放循环次数
2.以下书写格式是同一个意思
(1)mov ax,[bx+200]
mov ax 200[bx] //数组的存储方式
mov ax,[bx].200
(2)mov ax,[bx+si]
mov ax,[bx][si](常用)
(3)mov ax,[bx+200+si]
mov ax,[200+bx+si]
mov ax,200[bx][si]
mov ax,[bx].200[si]
mov ax,[bx][si].200
20位地址总线,1MB寻址能力
通用寄存器:AX(AH和AL)、BX(BH和BL)、CX(CH和CL)、DX(DH和DL)
段寄存器:CS、DS、SS、ES
SI、DI与bx功能相似
2.byte:字节,8bit
word:字,2个字节
3.16位结构/16位机/字长16位 = 寄存器16位
物理地址 = 段地址*16 + 偏移地址
4.CS:代码段寄存器
IP:指令指针寄存器
在任意时刻,CS:IP 指向下一条指令的地址;
修改CS:IP的内容:“JMP 段地址:偏移地址”,仅修改IP时使用JMP AX(AX存放修改后的地址);
DS通常用来存放要访问数据的段地址,指令执行时,8086CPU自动取DS中的数据作为内存单元的段地址
5.在任意时刻,SS:SP 指向栈顶元素;栈顶放在低地址
8086CPU对push和pop的操作都是以字为单位
POP只移动栈顶指针,不清楚数据,当有新数据入栈将覆盖原数据
6.程序返回
mov ax,4c00H
int 21H
7.[bx]表示一个内存单元,段地址在ds中,偏移地址在bx中
例:mov ax,[bx]
8.8086CPU中只有bx、si、di、bp可以用在[...]中来进行内存单元的寻址,只要[...]使用寄存器bp,
而指令中没有显性的给出段地址,段地址就默认在ss中
9.汇编中数据位置的表述
(1)立即数
(2)寄存器
(3)段地址+偏移地址
10.指令要处理的数据长度
(1)使用的寄存器
(2)在没有寄存器名的情况下,用操作符X ptr (word ptr、byte ptr)指明内存单元的长度
(3)栈操作数据为字类型
PS:
1.对段寄存器的操作要通过通用寄存器来间接操作,例:修改段寄存器DS
MOV BX,1000H
MOV DS,BX
MOV AL,[0]
[0]表示一个内存单元,此处表示1000:0处的地址
2.汇编代码
assume cs:code,ds:data,ss:stack
//data为数据段、stack为栈段、code为代码段
data segment
db //定义字节 地址+1
dw 0123h,0456h //定义字类型 地址+2
dd //定义双字 地址+4
data ends
stack segment
dw 0,0
stack ends
code segment
start:mov ax,stack //栈段名就是段地址
mov ss,ax
mov ax,data //数据段名就是数据段的段地址
mov ds,ax
code ends
end start
解析:
(1).assume 伪指令,含义"假设"。它假设某一段寄存器和程序中的某一个用segment。。。ends定义的段相关联
assume将有特定用途的段和相关的段寄存器关联起来
(2)segment和ends成对使用的伪指令,
功能:定义一个段
使用格式
段名 segment
..
..
段名 ends
段名在程序编译链接后作为段地址
(3)dw = "define word",含义定义字型数据
此处段地址为cs,dw定义位于代码段开始部分,所以偏移地址为0,定义的数据物理地址为CS:0、CS:2
3.寻址方式(定位内存地址的方法)
[0]、
[bx]、
[bx(si、di)+idata]、
[bx+si]和[bx+di]
[bp+si]\[bp+di]
4.大小写字母转换
大写字母的第五位为0,小写字母的第五位为1
将大写字母的ASCII与1101 1111B进行与操作可转换为小写字母,原理ASCII-20H
汇编指令:mov,add,SUB,PUSH,POP,LOOP,and(逻辑与),or(逻辑或),inc
1.loop会进行两步操作:
(1)cx = cx -1;
(2)cx中的值不为0则继续执行loop
功能:使用loop实现循环,cx存放循环次数
2.以下书写格式是同一个意思
(1)mov ax,[bx+200]
mov ax 200[bx] //数组的存储方式
mov ax,[bx].200
(2)mov ax,[bx+si]
mov ax,[bx][si](常用)
(3)mov ax,[bx+200+si]
mov ax,[200+bx+si]
mov ax,200[bx][si]
mov ax,[bx].200[si]
mov ax,[bx][si].200