寄存器总结
栈段: ss:sp
指令段: cs:ip
数据段: ds
段寄存器: es,ss,cs,ds
循环寄存器: cx
空余: ax,bx,dx,si,di,bp
寻址: bx,bp,si,di
除法寄存器: ax,dx
改大写
and al 11011111b
改小写
or al 00100000b
1.数据总线
数据总线:CPU与内存或与其他器件之间的数据传送。 数据总线的宽度决定了CPU与
其他器件进行数据传送时一次数据传送量
8086CPU数据总线宽度为 16。。。。地址总线20位
地址总线:CPU通过地址总线来指定存储单元,最多可以寻找2的N次方个内存单元。
地址总线的宽度决定了CPU的寻址能力。
控制总线:CPU对外部总线的控制。有多少根控制总线意味着CPU对外部器件有多少种控制。
存储单元从零开始编号,一个存储单元可以存储8bit
2.8086CPU给出物理地址的方法
8086CPU采用一种在内部用两个16位地址合成的方法来形成一个20位物理地址
读写内存:
1.CPU中相关部件提供两个16位的地址,一个称之为段地址,一个称之为偏移地址
2.段地址与偏移地址通过内部总线送入地址加法器
3.相加合成一个20位物理地址
4.将20位物理地址送入地址总线
4.20位物理地址被送入寄存器
物理地址=段地址*16+偏移地址
3.CS:IP
CS:段地址 IP:偏移地址
8086CPU工作过程:
1.从CS:IP指向的内存单元读取指令,读取的指令进入地址缓冲区
2.IP=IP+所读取指令长度,从而指向下一条指令
3.执行指令
8086CPU刚启动时指向 CS=FFFFH IP=0000H
4.CPU的栈机制
段寄存器:SS 寄存器:SP
任意时刻,SS:IP指向栈顶元素
Push as执行
1.SP=SP-2,SS:SP指向当前栈顶前面的元素(一个存储单元为8bit ,
一次送入一个字(16bit),两个字节)
2.将AX的数据送入
5.Push与Pop
指令的格式:
push 寄存器
push 段寄存器
push 内存单元
例:
push [0]
将 10000H--1000FH 这段空间当作栈
mov ax,1000H
mov ss,ax
mov sp,0010H
如果将 10000H--1FFFFH这段空间当作栈段此时 SS=1000H SP=0000H
6.描述性符号()
(ax):ax中的内容
mov ax,[bx] [bx]:段地址默认在 ds 偏移地址 bx 这句话:(ax)=((ds)*16+(bx))
inc :自加一
7.Loop指令
格式 loop 标号
两部操作:
1.(cx)=(cx)-1
2.判断cx中的值,不为零则转至标号处,否侧向下执行
编程123*236,存到ax中
assume cs:code
code segment
mov ax,0
mov cx,236
s: add ax,123
loop s
mov ax,4c00h
int 21h
code ends
end
8.各种寻址方式
【bx+idate】: mov ax,[bx+200] (ax)=((ds)*16+(bx)+200)
【bx+si】或【bx+di】: mov ax,[bx+si] (ax)=((ds)*16+(bx)+(si))
【bx+si+idate】或【bx+di+idate】: mov ax,[bx+si+idate]
(ax)=((ds)*16+(si)+idate)
9.寄存器使用
可以放到 【】中的寄存器只有 bx bp di si
只能由一下表现形式:
mov ax,[bx]
mov ax,[bp]
mov ax,[si]
mov ax,[di]
mov ax,[bx+si]
mov ax,[bx+di]
mov ax,[bp+si]
mov ax,[bp+di]
mov ax,[bx+si+idate]
mov ax,[bx+di+idate]
mov ax,[bp+si+idate]
mov ax,[bp+di+idate]
bx与bp不同之处
bx:默认段地址在 ds中
bp:默认段地址在 ss中
10.div 指令
div:是除法指令
注意:
1.除数:有八位或者十六位,在一个reg中或者存储单元中
2.被除数:默认放到AX或者DX与AX,如果除数是八位,则被除数是16位,
默认在AX中;如果除数是16位则被除数是32位
在DX与AX中,DX存放高16位
3.结果:如果除数是8位,则AL存放操作的商,AH存放余数;如果除数是16位,
则AX存放商,DX存储操作的余数
例子:
div byte ptr ds:[0]
含义:(al)=(ax)/((ds)*16+0)) 商
(ah)=(ax)/((ds)*16+0)) 余数
div word ptr es:[0]
含义:(ax)=[(dx)*10000H+(ax)]/((es)*16+0) 商
(dx)=[(dx)*10000H+(ax)]/((es)*16+0) 余数
div byte ptr [bx+si+8]
含义:(al)=(ax)/((ds)*16+(bx)+(si)+8)) 商
(ah)=(ax)/((ds)*16+(bx)+(si)+8)) 余数
div word ptr [bx+si+8]
含义:(ax)=[(dx)*10000H+(ax)]/((ds)*16+(bx)+(si)+8) 商
(dx)=[(dx)*10000H+(ax)]/((ds)*16+(bx)+(si)+8) 余数
计算 100001/100
mov dx,1
mov ax,86A1H
mov bx,100
div bx
11.伪指令dd
data segment
db 1 //字节型
dw 1 //字型
dd 1 //双字型
data ends
12.dup
db 3 dup (0)
定义三个字节 相当于 db 0,0,0
db 3 dup(0,1,2)
定义了九个字节
相当于 db 0,1,2,0,1,2,0,1,2
13.ret与retf
ret:修改IP内容,实现近转移
retf:修改CS IP 实现远转移
CPU执行ret时执行两条指令
1.(IP)=((ss)*16+sp))
2.(sp)=(sp)+2
CPU在执行retf时
1.(IP)=((ss)*16+(sp))
2.(sp)=(sp)+2
3.(cs)=((ss)*16+(sp))
4.(sp)=(sp)+2
14.标志寄存器
1.ZF标志--零标志位
如果结果为零 ZF=1
2.PF标志--奇偶标志位
所有bit 位1的个数 为偶数 PF=1
3.SF标志--是否为负
为负 SF=1
4.CF 标志 是否有进位
5.OF 标志 有无符号
1.用 SI,DI 将字符串“welcome to masm!"复制到他后面的区域
assume cs:code,ds:dsta
data segment
db 'welcome to masm!'
db '................'
data ends
code segment
start: mov ax,data
mov ds,ax
mov si,0
mov di,16
mov cx,8
s: mov ax,[si]
mov [di],ax
add si,2
add di,2
loop s
mov ax,4c00H
int 21H
code ends
end start
2.将单词的每一个首字母改为大写
assume cs:code,ds:data
data segment
db '1. file '
db '2. file '
db '3. file '
db '4. file '
db '5. file '
db '6. file '
data ends
code segment
start: mov ax,data
mov ds,ax
mov bx,0
mov cx,6
s: mov al,[bx+3]
and al,11011111b
mov [bx+3],al
add bx,16
loop s
mov ax,4c00H
int 21H
code ends
end start
将单词改为大写
assume cs:code,ds:data
data segment
db 'file '
db 'file '
db 'file '
db 'file '
db 'file '
db 'file '
data ends
code segment
start: mov ax,data
mov ds,ax
mov bx,0
mov cx,6
s1: mov si,0
mov di,cx
mov cx,4
s2: mov al,[bx+si]
and al,11011111b
mov [bx+si],al
add si,1
loop s2
mov cx,di
add bx,16
loop s1
mov ax,4c00h
int 21H
code ends
end start
3.计算第一组数据的三次方
assume cs:code
data segment
dw 1,2,3,4,5,6,7,8
dd 0,0,0,0,0,0,0,0
data ends
code segment
start: mov ax,data
mov ds,ax
mov si,0
mov di,16
mov cx,8
s: mov bx,[si]
call cube
mov [di],ax
add si,2
add di,4
loop s
mov ax,4c00h
int 21h
cube: mov ax,bx
mul bx
mul bx
ret
code ends
end start
4.将一个 以零结尾的字符串全部改成大写
capital: mov cl,[si]
mov ch,0
jcxz ok
and byte ptr [si],11011111b
inc si
jmp short captical
ok: ret
assume cs:code
data segment
db 'word',0
db 'word',0
db 'word',0
db 'word',0
data ends
code segment
start: mov ax,data
mov ds,ax
mvo bx,0
mov cx,4
s:mov si,bx
call captical
add bx,5
loop s
mov ax,4c00h
int 21h
captical:mov cl,[si]
mov ch,0
jcxz ok
and byte ptr cx,11011111b
inc si
jmp short captical
ok: ret
code ends
end start