寄存器与内存-CS、IP与代码段、jmp指令、内存中字的存储、用DS和[address]实现字的传送
一、CS、IP与代码段
CS:代码段寄存器
IP:指令指针寄存器
CS:IP:CPU将内存中CS:IP指向的内容当作指令执行。
例示:在CS和IP指示下代码的执行
8086CPU当前状态:CS中内容为2000H,IP中内容为0000H
内存20000H~20009H处存放着可执行的机器代码
8086PC工作过程的简要描述:
(1)从CS:IP指向内存单元读取指令,读取的指令进入指令缓冲器;
(2)IP = IP + 所读取指令的长度,从而指向下一条指令;
(3)执行指令。 转到步骤(1),重复这个过程。
指令读取和执行的实证演示-Debug
用debug程序执行下面的代码
mov ax, 0123H
mov bx, 0003H
mov ax, bx
add ax, bx
a 地址 - 写入汇编指令
u 地址 - 查看代码
t - 执行CS:IP处代码
可以想象成用u命令的时候看到的是代码,用d命令是看到的是数据
问:内存中有数据 B8 23 01 BB 03 00 89 D8 01 D8,究竟用作一般数据,还是用作指令?
答:CPU将CS:IP指向的内存单元中的内容看作指令!
二、jmp指令
修改CS、IP的指令
事实:执行何处的指令,取决于CS:IP
应用:可以通过改变CS、IP中的内容,来控制CPU要执行的目标指令
问题:如何改变CS、IP的值?
方法1:Debug 中的 R 命令可以改变寄存器的值——rcs, rip
Debug是调试手段,并非程序方式!
不能指着用户打开程序后去调试
方法2:用指令修改
mov cs,2000h
mov ip,0000h
很明显这种做法是不可行的,对于寄存器来讲不能把所谓的数存进去,另外对于指令角度是可行的,但是对于应用角度是不可取的(8086cpu不提供对cs和ip修改的指令)
想要知道某一个指令合不合法,在debug中一试便知。
方法3:转移指令 jmp(跳转指令)
同时修改CS、IP的内容
jmp 段地址:偏移地址
jmp 2AE3:3
jmp 3:0B16
功能:用指令中给出的段地址修改CS,偏移地址修改IP。
仅修改IP的内容
jmp 某一合法寄存器
jmp ax (类似于 mov IP, ax)
jmp bx
功能:用寄存器中的值修改IP
从20000H开始,执行的序列是:
(1)mov ax,6622
(2)jmp 1000:3
(3)mov ax,0000
(4)mov bx,ax
(5)jmp bx
(6)mov ax,0123H
(7)转到第(3)步执行
这是在执行上面程序中debug的实际操作,可以看到后续执行的为循环操作。想要学好汇编语言关键在于实际操作,每一个指令都可以在debug中进行实际操作!!!
三、内存中字的存储
前言-字的概念
计算机在进行数据处理,一次存取、加工、传送的数据长度称为字(word)。一个字一般由多个(整数倍)字节构成。
通常1word=2Byte=16bit
一个字由两个字节组成,16位组成
通常称16位是一个字,32位是一个双字,64位是两个双字
计算机的字长决定CPU一次处理实际位数的多少,字长越大,性能越优。
内存中字的存储
事实:对8086CPU,16位作为一个字(现在很多机器都是32位/64位,就是32/64位作为一个字)
问:
16位的字存储在一个16位的寄存器中,如何存储?
答:
高8位放高字节,低8位放低字节
问:
16位的字在内存中需要2个连续字节存储,怎么存放?
答:
低位字节存在低地址单元,高位字节存在高地址单元
例:20000D(4E20H)存放0、1两个单元,18D(0012H)存放在2、3两个单元
字单元
字单元:由两个地址连续的内存单元组成,存放一个字型数据(16位)
原理:在一个字单元中,低地址单元存放低位字节,高地址单元存放高位字节
在起始地址为0的单元中,存放的是4E20H
在起始地址为2的单元中,存放的是0012H
问题:
(1)0地址单元中存放的字节型数据是( 20H )
(2)0地址字单元中存放的字型数据是( 4E20H )
(3)2地址单元中存放的字节型数据是( 12H )
(4)2地址字单元中存放的字型数据是( 0012H )