汇编 | 一、 物理地址寻址与CS:IP(jmp)
汇编系列主要记录对于王爽老师的《汇编语言》这本书,学习到的一些重点知识进行记录。
这一篇主要记录两个知识点,一个是8086如何进行物理地址的寻址,以及cs:ip所定义的代码段和使用jmp来修改其中的值。
0x01 8086cpu的寻址方法
8086的寻址方法有一个简单的公式:段地址×16+偏移地址=物理地址
只要我们能够理解这个公式,其实也就理解了8086的寻址方法,在8086中,他的地址总线是20位的,有1MB的寻址能力,但是我们知道,8086cpu的寄存器只能够存放16位,要达到20的一个寻址,8086给出的方法是两个寄存器的值通过一种方式相加,从而转变成了20位的物理地址。
其中,只要我们知道这两个寄存器的值,也就可以知道所要寻找的地址。
根据公式,段地址,即一个基本的地址,比如它的值为1111H,然后在该位置偏移2222H,按照计算方式,最终的物理地址应该是13332H,当然,我们也可以偏移1234H,物理地址就是12344H。公式中的“段地址×16”其实类似于十进制的乘10,也就是1111H变成11110H,然后加上偏移的值就可以了。
可以看出,段地址其实就是先定义了一个基本的地址,然后通过偏移地址来寻找一定范围内的数据,这里的偏移地址最小为0000H,最大为FFFFH。(0000H-FFFFH就是偏移的范围)
如果段地址为AAAAH,偏移地址为0110H,那么也可以以AAAA:0110这种方式来表示这一块内存地址!
0x02 CS:IP
上一部分提到了段地址和偏移地址,这里的cs就属于段地址,而ip就是偏移地址。
在8086中CS:IP指向的内存地址,被定义为下一条要执行的指令,下面用图片描述一下cs和ip在程序执行中的变化
这个是初始化的一个状态,可以看到,cs的值为2000H,而ip的值为0000H,所以下一条要执行的指令是在20000处开始的mov ax,0123H。
之后cs与ip应该要进入地址加法器,计算成20位的物理地址。
然后地址加法器将其送入输入输出控制电路
然后输入输出控制电路再将其送入地址总线,进行寻址
之后,内存会通过数据总线将找到的内容送入cpu
然后输入输出控制电路会将其地址送入指令缓冲区
注意,下一步也不是执行,而是将ip的值增加3,意味着我们之前读了3个字节,接下来cs:ip指向了下一条命令mov bx,0003H
下一步才是执行代码mov ax,0123H
然后ax的值将会被改变
然后又回到第一步,继续cs:ip找物理地址,下面的内容就不再赘述了
0x03 jmp指令
上面我们讲到了cs:ip,以及它们的工作方式,其实由于cs是段地址,所以段地址结合ip所能够达到的地址被称为代码段,cpu会自动找cs:ip所指向的指令执行,那么,如果我们可以控制cs:ip,也就可以控制我们将要执行哪些汇编代码了,8086提供了jmp指令来修改cs:ip的值。
jmp指令的用法:
jmp 2000:1111 这种方法可以同时修改cs和ip,类CS:IP
jmp 某一合法寄存器 类似于jmp ax,这种方式用来直接修改ip的值,而不能修改cs
注意:mov不能用于修改cs或ip的值!