第二章:寄存器
按书中的描述都以16位的8086CPU1来说明知识点
需要了解的:
1.一个字由两个字节组成
2.十六进制数的一位相当于二进制数的四位,如0100111000100000可表示成:4(0100)、E(1110)、2(0010)、0(0000)四位十六进制数
3.为了区分,在十六进制表示的数据后面加H,在二进制标识的数据后面加B
以下是几条汇编指令
汇编指令 | 控制CPU完成的操作 | 用高级语言的语法描述 |
---|---|---|
mov ax,18 | 将18送入寄存器AX | AX = 18 |
mov ah,78 | 将78送入寄存器AH | AH = 78 |
add ax,8 | 将寄存器AX中的数值加上8 | AX = AX + 8 |
mov ax,bx | 将寄存器BX中的数据送入寄存器AX | AX = BX |
add ax,bx | 将AX和BX中的数值相加结果存入寄存器AX | AX = AX + BX |
寄存器可分割,比如一个16位的寄存器可分为两个可独立使用的8位寄存器使用
注意:若al(AX寄存器中的低位同样的ah为高位)中的数据在执行add加法后若‘溢出’,就会将最高位丢失(丢失指的是不能再8位寄存器中保存,但是CPU并不是真的丢失这个进位值)
关键点:
1.比如AX中的数据为00C5H,且有汇编指令add al,93H,此时al是作为一个独立的8位寄存器来使用的,和ah没有关系
2.在进行数据传送或运算时,指令的两个操作对象的位数应当是一致的,下面为错误实例
- mov ax,bl (在8位和16位寄存器间传送数据)
mov bh,ax (同上)
mov al,20000 (8位寄存器最大可存放值为225的数据)
add al,100H (将一个高于8位的数据加到一个8位寄存器中)
思考题:
- [ ]最多使用4条汇编指令,计算2的4次方。
物理地址 = 段地址×16 + 偏移地址
小知识点:
- 一个X进制的数据左移1位,相当于乘以X。
- CPU可以用不同的短地址和偏移地址形成同一个物理地址
- 偏移地址是16位,变化范围为0~FFFFH,仅使用偏移地址最多可寻64KB个内存单元
- 段的意思不是实际分段,而是根据需要将地址连续、起始地址为16倍数的一组内存单元定义为一个段
检测点2.2 (P25)加深理解运用
CS和IP(都是寄存器)
CS是代码段寄存器
IP是指令指针寄存器
可理解为:CS中存放代码在内存中的起始地址,IP中存放确定的某一行代码的地址
读取一条指令后,IP中的值自动增加,以使CPU可以读取下一条指令。看当前读入的指令长度为几个字节IP中的值就加几。。。CS:IP可表示一个物理地址,计算方法为CS中的内容左移1位加IP中的内容
也就是说,内存中的一段信息曾被CPU执行过的话,那么它所在的内存单元必然被CS:IP指向过
----------------------------------------------------------------------------------
"jmp 某一合法寄存器"指令的功能为:用寄存器中的值修改IP
就这么想,IP中存放偏移地址,CS中存放段地址,这个jmp指令可想为在代码段中跳转到IP中存放的地址位置
CPU只认被CS:IP指向的内存单元中的内容为指令
8086CPU的工作过程:
1.从CS:IP指向的内存单元读取指令,读取的指令进入指令缓冲器;
2.IP指向下一跳指令;
3.执行指令.(跳转到步骤1,重复这个过程)
运算器一次最多可处理16位数据;寄存器的最大宽度为16位;寄存器与运算器之间的通路为16位。 ↩︎