在8086汇编的世界里,我们首先要知道要使用的寄存器,和指令。
一 寄存器
我记的以前也对寄存器很模糊,好象很神秘。
但我们只要把他理解为,寄存器是我门在
汇编的时候用来取数据,和写数据的地方,并且每种寄存器
都有不同的功能和使命就行了。下面是我们使用的教多的寄存器
<1>AX,BX,CX,DX <2>CS,IP <3>SS SP <3>DS <4> pwd <5>SI DI <6>BP
看到了把,我把这些寄存器分成六组(BP 我暂时还没看,放到一组,以后再讨论他),
为什么我这样把他们分组呢,之前我不是说了吗,每个寄存器都有自己的功能和使命,
这里分成一个组的寄存器就是有着相同功能或一起合作来完成一项功能的。
比如说<1>就是有着基本相同的功能,而〈2〉一起合作来完成一个功能的。
在具体说明每组寄存器的功能前,我先说明下。在32位的汇编语言,比如win 32汇编,
他的寄存器是32位的,我上面列出的是16位的。而32位寄存器写成
<1>EAX,EBX,ECX,EDX <2>ECS,EIP <3>ESS ESP <3>EDS <4> Epwd <5>ESI EDI <6>BEP
看到了把 都是在前面加个E。
好了,下面具体说说寄存器
1 通用寄存器
AX,BX,CX,DX
为什么叫通用寄存器呢,因为他们的使用功能比较灵活,没有固定的功能,比较通用。
那么通用又有什么用呢? 如果你写过C程序,那肯定知道变量了,你就把通用寄存器
的功能想象成用来放变量的功能。
mov AX 15
就相当于c语言里的AX=15.
因为是通用的,所以你写成mov BX 15 也成。
另外 AX,BX,CX,DX 都是16位的,我们也可以拆开使用8位。AL,BL,CL,DL就是低八位,AH,BH,CH,DH就是低八位
以AX为例子,看下面这个图
|----------------|-----------------|
15 AH 7 AL 0
0到7位就是AL,7到15就是AH,合起来就AX。
2 代码段寄存器
应该说CS叫代码段寄存器,为什么这么叫他呢,CS其实是code section 的简称,code section 不就是代码段吗。
那为什么我把CS,IP放到一组呢,因为CS,一般要和IP一起使用的。
IP 是Indusruct point 即指令指针的意思。
CS,和IP两个寄存器加起来就可以找到我们要执行的指令了。
比如说我们写好了一个程序,通过编译后,变成了CPU可以认识的指令,那这些指令首先是要被系统
装到内存,然后CPU就从内存里取出这些指令,然后运行,计算。
那么CPU就是通过CS,IP两个寄存器从内存里把指令取出来的。
既然是要从内存里取数据,那么我们就要先了解下 内存的数据是怎么分布的
|--------|--------|--------|--------|--------|--------|
0 1 2 3 4 5 6
看上面这个图,如果我们以字节为单位来划开内存,那么用上面
的地址(0,1等)就可以访问到每个字节的数据了。
比如说我想访问第四个字节的数据,我就直接把4作为地址交出去就行了(交给谁?后面会说)
就可以直接得到他的物理字节地址了。
但是我们现在对内存的内容分布不是按照字节来分的拉,如果按字节的话,地址太多。
我门现在是按段来分。打个比方说
|--------|--------|--------|--------|--------|--------|
0 BYTE 1 BYTE 2 BYTE 3 BYTE 4 BYTE 5 BYTE 6
|—————————————————|—————————————————|—————————————————|
0 sector 1 sector 2 sector 3
看上图,我以两个字节作为一个段,下面的0,1,2,3就是段地址,
大家可以看到每个段包含了2个字节。我们要从内存里取数据,要通过
段地址而不是字节地址。那么我们则么从内存取数据呢?
很简单,还是看上面这个图,比如我要拿内存中的5号字节内容,我们怎么
通过段地址来得到他呢?
看5号字节是放在2号段,所以他的段地址是2,5号字节在2号段中偏移了1个字节,
那么我们只要找到2号段的字节对应地址加上1不就是5号了吗。
我们知道每段有2个字节,那么2号段的字节地址不就是2*2吗。
所以5号段就是通过2*2+1得来的。
所以求内存地址的方法是段地址*段长度+段中偏移。
现在我们回来说CS和IP。
刚才我说了CS代码段地址,IP是指令指针,其实就是在指令在该段中的偏移值。
代回公式
段地址*段长度+段中偏移=CS*段长度+IP CPU就可以得到指令来执行了。
朋友们说但我还不知道段长度是多少啊?
呵呵,其实算这个地址是由专门的地址计算器来计算的,你就不用操心了。
可以执行
jmp 2AE3:3 ;这个指令会让CS=2AE3,IP=3,然后CPU就自己会按照我刚才说的那个公式来知道指令来执行了
一 寄存器
我记的以前也对寄存器很模糊,好象很神秘。
但我们只要把他理解为,寄存器是我门在
汇编的时候用来取数据,和写数据的地方,并且每种寄存器
都有不同的功能和使命就行了。下面是我们使用的教多的寄存器
<1>AX,BX,CX,DX <2>CS,IP <3>SS SP <3>DS <4> pwd <5>SI DI <6>BP
看到了把,我把这些寄存器分成六组(BP 我暂时还没看,放到一组,以后再讨论他),
为什么我这样把他们分组呢,之前我不是说了吗,每个寄存器都有自己的功能和使命,
这里分成一个组的寄存器就是有着相同功能或一起合作来完成一项功能的。
比如说<1>就是有着基本相同的功能,而〈2〉一起合作来完成一个功能的。
在具体说明每组寄存器的功能前,我先说明下。在32位的汇编语言,比如win 32汇编,
他的寄存器是32位的,我上面列出的是16位的。而32位寄存器写成
<1>EAX,EBX,ECX,EDX <2>ECS,EIP <3>ESS ESP <3>EDS <4> Epwd <5>ESI EDI <6>BEP
看到了把 都是在前面加个E。
好了,下面具体说说寄存器
1 通用寄存器
AX,BX,CX,DX
为什么叫通用寄存器呢,因为他们的使用功能比较灵活,没有固定的功能,比较通用。
那么通用又有什么用呢? 如果你写过C程序,那肯定知道变量了,你就把通用寄存器
的功能想象成用来放变量的功能。
mov AX 15
就相当于c语言里的AX=15.
因为是通用的,所以你写成mov BX 15 也成。
另外 AX,BX,CX,DX 都是16位的,我们也可以拆开使用8位。AL,BL,CL,DL就是低八位,AH,BH,CH,DH就是低八位
以AX为例子,看下面这个图
|----------------|-----------------|
15 AH 7 AL 0
0到7位就是AL,7到15就是AH,合起来就AX。
2 代码段寄存器
应该说CS叫代码段寄存器,为什么这么叫他呢,CS其实是code section 的简称,code section 不就是代码段吗。
那为什么我把CS,IP放到一组呢,因为CS,一般要和IP一起使用的。
IP 是Indusruct point 即指令指针的意思。
CS,和IP两个寄存器加起来就可以找到我们要执行的指令了。
比如说我们写好了一个程序,通过编译后,变成了CPU可以认识的指令,那这些指令首先是要被系统
装到内存,然后CPU就从内存里取出这些指令,然后运行,计算。
那么CPU就是通过CS,IP两个寄存器从内存里把指令取出来的。
既然是要从内存里取数据,那么我们就要先了解下 内存的数据是怎么分布的
|--------|--------|--------|--------|--------|--------|
0 1 2 3 4 5 6
看上面这个图,如果我们以字节为单位来划开内存,那么用上面
的地址(0,1等)就可以访问到每个字节的数据了。
比如说我想访问第四个字节的数据,我就直接把4作为地址交出去就行了(交给谁?后面会说)
就可以直接得到他的物理字节地址了。
但是我们现在对内存的内容分布不是按照字节来分的拉,如果按字节的话,地址太多。
我门现在是按段来分。打个比方说
|--------|--------|--------|--------|--------|--------|
0 BYTE 1 BYTE 2 BYTE 3 BYTE 4 BYTE 5 BYTE 6
|—————————————————|—————————————————|—————————————————|
0 sector 1 sector 2 sector 3
看上图,我以两个字节作为一个段,下面的0,1,2,3就是段地址,
大家可以看到每个段包含了2个字节。我们要从内存里取数据,要通过
段地址而不是字节地址。那么我们则么从内存取数据呢?
很简单,还是看上面这个图,比如我要拿内存中的5号字节内容,我们怎么
通过段地址来得到他呢?
看5号字节是放在2号段,所以他的段地址是2,5号字节在2号段中偏移了1个字节,
那么我们只要找到2号段的字节对应地址加上1不就是5号了吗。
我们知道每段有2个字节,那么2号段的字节地址不就是2*2吗。
所以5号段就是通过2*2+1得来的。
所以求内存地址的方法是段地址*段长度+段中偏移。
现在我们回来说CS和IP。
刚才我说了CS代码段地址,IP是指令指针,其实就是在指令在该段中的偏移值。
代回公式
段地址*段长度+段中偏移=CS*段长度+IP CPU就可以得到指令来执行了。
朋友们说但我还不知道段长度是多少啊?
呵呵,其实算这个地址是由专门的地址计算器来计算的,你就不用操心了。
可以执行
jmp 2AE3:3 ;这个指令会让CS=2AE3,IP=3,然后CPU就自己会按照我刚才说的那个公式来知道指令来执行了