cpu cenrtal procossing unit 中央处理器
寄存器:cpu中可以存储数据的器件
存储器=多个存储单元
每个存储单元=1字节 即 1 byte
cpu要进行数据的读写必须和外部器件进行下面三类信息的互换
1.存储单元的地址(地址信息)----地址总线
2.器件的选择,读或写的命令(控制信息)----控制总线
3.读或写的数据(数据信息)----数据总线
一个cpu有N根地址线,则可以说这个cpu的地址总线宽度为N
这样的cpu 最多可寻找2的N次方个内存单元
8086cpu的数据总线宽度为16
RAM 随机存储器
ROM 只读存储器
典型cpu由运算器,控制器,寄存器组成
运算器进行信息处理
寄存器进行信息存储
控制器控制各种器件进行工作
8086所有寄存器都是16位 即2 byte
通用寄存器: ax,bx,cx,dx
在写一条汇编指令或一个寄存器的名称时不区分大小写
运算器一次最多可处理16位数据
寄存器的最大宽度为16位
寄存器和运算器之间的通路为16位
地址加法器采用物理地址=段地址*16+偏移地址
一个数据的二进制形式左移N位,相当于该数据乘以2^n
一个x进制的数据左移1位,相当于乘以x
结论:偏移地址16位。。变化范围为0--ffffh
仅用偏移地址来寻址最多可寻 64 kb 个内存单元
8086有四个段寄存器
cs,ds,ss,es
cs,ip是8086cpu中两个最关键的寄存器
cs为代码段寄存器
ip为指令指针寄存器
8086的工作过程
1。从cs:ip指向的内存单元读取指令
读取的指令进入指令缓冲器
2.ip=ip+所读指令的长度,从而指向下一条指令
3.执行指令。回到(1)重复
jmp 段地址,偏移地址
功能: 用指令中给出的段地址修改 cs
偏移地址修改 ip
jmp 某一合法寄存器
功能:用寄存器中的值修改 ip
jmp ax 相当于 mov ip,ax
将起始地址为N的字单元简称为N地址字单元
ds 寄存器。通常用来存放要访问数据的段地址
mov 寄存器名,内存单元地址
用mov指令访问内存单元,可以在movr指令中只给出单元的偏移地址,此时,段地址默认在 ds 寄存器
栈是一种具有特殊的访问方式的存储空间
最后进的最先出
栈的操作规则: LIFO 后进先出
push 入栈 pop 出栈
push ax
表示将寄存器ax中的数据送入栈中
pop ax
表示从栈顶取出数据送往 ax
出栈和入栈都是以字为单位进行的
段寄存器 SS 和寄存器 SP
栈顶的段地址存放在 SS 中
偏移地址存放在SP中
任意时刻,ss:sp指向栈顶元素
mov ax,1000h
mov ds,ax
push [0] ;将1000:0处的字压入栈中
pop [2] ;出栈,出栈的数据在 1000:2处
不能直接向段寄存器送入数据
执行 push 时
先改变 sp
后向 ss:sp 处传送
执行pop时
先读取 ss:sp处的数据
后改变sp
在ss:sp中存放栈顶元素的段地址和偏移地址
目标文件 .obj
列表文件 .lst
交叉引用文件: .crf
编辑器 Edit
编绎器 masm
连接器 link
调试工具 debug
ds=129e.则 psp 的地址为 129e:0
程序的地址为 12ae:0
即 129e+10:0
要完整描述一个内存单元,需要两种信息
1.内存单元的地址
2.内存单元的长度(类型)
【bx]同样表示一个内存单元,偏移地址在bx中
()表示一个寄存器或一个内存单元中的内容
()中的元素可以有3种类型
1.寄存器名
2.段寄存器
3.内存单元的物理地址(一个20位的数据)
cpu执行loop指令的时候
1.(cx)=(cx)-1
2.判断cx中的值,不为零则转至标号处执行程序。
1.在cx中存放循环次数
2.loop指令中的标号所标识地址要写在前面
3.要循环执行的程序段,要写在标号和loop指令中间
mov cx,循环次数
s:循环执行的程序段
loop s
在汇编语言中,数据不能以字母开头
这些出现在访问内存单元的指令中
用于显式地指明内存单元的段地址的
“ds" "cs" "ss" "es"
在汇编语言中称为段前缀
dos 和其他合法程序一般都不会使用
0:200 ---- 0:2ff 的256个字节的空间
g命令
表示执行程序到当前代码段(段地址在CS中
也就是说 将使 debug 从当前的 cs:ip指向的指令执行
一直到 (ip)=0012h 为止
单任务系统中。可执行文件的程序执行过程如下:
1.由其它程序(debug,command或其它程序)将可执行文件中的程序加载入内存
2.设置cs:ip指向程序的第一条要执行的指令(即程序的入口),从而使程序得以运行
3.程序运行结束后,返回加载者
一般情况下。
用来放数据的段我们将其命名为 data
用来放代码的段我们将其命名为 code
用来作栈空间的段命名为 stack
在程序中,段名就相当于一个标号,它代表了段地址
一个字母,不管它原来是大写还是小写,将它的第5位置0,它就必将变成大写字母,反之。小写
”A“的ASCII码是 41H
”a"R ascii码是 61h
对于push ax 的功能,可以这样来描述
(sp)=(sp)-2
((ss)*16+(sp))=(ax)
对于pop ax 的功能,可以这样来描述
(ax)=((ss)*16+(sp))
(sp)=(sp)+2
标号代表一个地址,如:标号 s
它实际上标识了一个地址
这个地址有一条指令 add ax,ax
end 除了通知编译器程序结束外
还可能通知编绎器程序的入口在什么地方
我们可以看到程序加载到内存中后,所占内存空间的前16个单元存放在源程序用 “dw 定义的数据”
在程序中,段名就相当一个标号,它代表了段地址
所以指令 mov ax,data
是将名称为 “data"的段的段地址送入 ax
8086 cpu 不允许将一个数值直接送入段寄存器
[BX+idata]表示一个内存单元
它的偏移地址为 (bx)+idata
si di 不能够分成两个8位寄存器来使用
一般来说。在需要暂存数据的时候,我们都应该使用栈
reg 表示一个寄存器
包含 ax bx cx dx
ah al bh bl
ch cl dh dl sp bp si di
sreg 表示一个段寄存器
ds ss cs es
在8086 cpu 中。只有以下4个寄存器可以用在 []中来进行内存地址的寻址
bx si bp di
这四个寄存器可以单个出现
或只能以四种组合出现
或只能以4 种组合出现
bx和si bx和di bp和si bp和di
只要在[]中使用寄存器bp
而指令中没有显性地给出段地址
段地址就默认在 ss 中
汇编语言用3 个概念来表达数据的位置
1.立即数
2.寄存器
3.段地址 sa 和偏移地址 ea
当数据存放在内存中的时候,我们可以用多种方式来给定这个内存的偏移地址
这种定位内存单元的方法
被称为寻址方式
在没有寄存器参与的内存单元访问指令中
用 word ptr 或 byte ptr 显性指明要访问的内存空间
mov word ptr ds:[0]
mov byte ptr ds:[0]
al 存储除法操作的商
ah 存储除法操作的余数
ax 存储除尘操作的商
dx 存储除法操作的余数
db 定义字节型数据
dw 定义字型数据
dd 定义双字型数据 double word
用 debug 命令
R 命令查看,改变CPU寄存器的内容
D 命令查看内存中的内容
E 命令改写内存中的内容
U 命令将内存中的机器指令翻译成汇编指令
T 命令执行一条机器指令
A 命令以汇编指令的格式在内存中写入一条机器指令
任意时刻,ss:sp指向栈顶元素
用栈来暂存以后需要恢复的寄存器中的内容时
出栈的顺序与入栈的顺序相反
assume 这条伪指令的含义为“假设”
assume 将有特定用途的段和相关的段寄存器关联起来即可
jmb 指令要给出两种信息
1.转移的目的地址
2.转移的距离(段间转移,段内短转移,段内近转移)
jmp short 标号(转到标号处执行指令
cpu 在执行 jmp 指令时并不需要转移的目的地址。
负数补码-----负数
取反+1 变符号
负数----负数补码
绝对值(变符号) 取反加1
bx si di bp
bx+si bx+di bp+si bp+di
bp 段地址默认在 ss
汇编语言用 3 个概念来表达数据的位置
1.立即数(idata)
2.寄存器
3.段地址(SA)和偏移地址(EA)
指令是字操作还是字节操作,汇编语言用以下方法处理
1.通过寄存器名指明要处理数据的尺寸
2.在没有寄存器的情况下,用操作符 X ptr 指明内存单元的长度
x 在汇编指令中可以为 word ptr
3.其它。如push 默认字单元
用 bx 定位整个结构体
用 idata 定位结构体中的某一个数据
用 si 定位数组项中的每个元素
8086的转移指令分为以下几类
无条件转移指令
条件转移指令
循环指令
过程
中断
只修改 ip 称为段内转移。如: jmp ax
其中短转移范围: -128到127
近转移范围: -32768到32767
同时修改CS和IP时,称为段间转移
如: jmp 1000:0
cpu 在执行 jmp 指令时是不需要转移的目的地址
jmp short 标号的功能是
(IP)=(IP)+8位位移
jmp net ptr 标号的功能是
(IP)=(IP)+16位位移
转移的目的地址在指令中的 jmp 指令
jmp for ptr 标号
是段间转移,又称为远转移
“0B01 BD 0B "
是目的地址在指令中的存储顺序
高地址 ”BD 0B "是转移地址的段地址 0BBD h
低地址 " 0b 01 "是转移地址的转移地址 010B h
转移地址在内存中的 jmp 指令有两种格式
1.jmp word ptr 内存单元地址(段内转移)
功能: 从内存单元地址处开始存放一个字
是转移的目的偏移地址
jmp word ptr ds:[0]
2.jmp dword ptr 内存单元地址(段内转移)
功能: 从内存单元地址处开始存放着两个字
高地址处的字是转移的目的的段地址
低地址是转移的目的偏移地址
jcxz 指令为有条件转移指令
(如果(cx)=0,转移到标号处执行
段内短转移 -128到127
操作 当(cx)=0 时
(ip)=(ip)+8位位移
当 (cx)!=0 时
什么也不做(程序向下执行)
jcxz 标号 的功能相当于
if ((cx)==0) jmp short 标号
将 s 处的指令复制到 s0处
就是将 cs:offset s 处的数据复制到 cs:offset s0 处
nop 的机器码占一个字节
在一般汇编指令中,汇编指令的 idata (立即数)
不论它是表示一个数据还内存单元的偏移地址
都会在对应的机器指令中出现
后记:
这阵子学习汇编整理出来的一些概念,特来和各位分享。敲打过程中出错地方,还望各位指出! |