@(读书笔记)[汇编语言, 王爽]
前置知识
- 8086寄存器为16位,为了和以前的8位架构的CPU兼容,把寄存器可以逻辑上分为两部分——高位和低位。比如通用寄存器AX,BX,CX和DX都可以分为AH,AL,BH,BL,CH,CL,DH和DL。
- 由此而来的,CPU可以一次性对两种尺寸的数据进行处理。一种是字节(Byte),是8位结构,也就是8个bit组成;另一种是字(word),由两个字节组成,把它分为高字节位和低字节位,是16位。于是8086的寄存器里可以一次存储一个字或者两个字节。
注意 00101010 11010001 这一串二进制码前面为高位,后面为低位。第0位数是从右往左数的,也就是1,而不是0。 - 也因为字和字节的不同,汇编指令要注意操作数的位数应当一致。比如MOV AX,BL就是错误的,因为BL只有8位,而AX有16位。
- 还要注意的是,当我们对al进行操作的时候,al是一个独立的8位寄存器来使用,和ah没有关系。比如在al和某数相加需要进位时,寄存器是不会给ah加上1的。但是若时ax做加减,那么al和ah之间是会有进位和退位的。总之不要简单地认为ax=ah+al。
物理地址
由于内存需求比较大,需要的地址总线会比CPU内部总线多。8086中地址总线是20位,而CPU一次只能处理16位。为了合成20位的内存地址,设计了一个段地址*16+偏移地址=物理地址的机制。
- 物理地址是指每一个内存单元在计算机系统内存空间里唯一的内存地址。
段寄存器
CS:IP
这是代码段寄存器。CS代表当前指令所在物理地址的段地址,ip代表偏移地址。这是一个默认的配对,不能认为修改。
于是指令执行的具体过程是:从CS和IP中读取数据,送入CPU中的地址加法器得到物理地址,然后通过外部地址总线找到该物理地址指向的内存单元,读取到指令送回CPU中的指令缓冲器中,然后给IP加上该指令的长度,将IP从指向当前要执行的指令的内存地址改成指向下一条指令的内存地址。最后通过执行控制器执行指令。
注意:这里是先改变IP,然后再执行指令。这一点在当指令中有改变IP值的命令时,尤为重要。改变IP不能用MOV,得用jmp。
语法代码示例
mov ax,2000h
mov cs,ax //改变cs的值
jmp 2ae3:3 //执行后cs=2ae3,ip=3
jmp ax //执行后ip为ax里的值